#excel #vba
#excel #vba
Вопрос:
У меня есть рабочая книга, состоящая из 44 листов. В этой книге у меня есть код VBA, который защищает и снимает защиту с листов, скрывает и отображает листы, вставляет и удаляет вставленные листы.
Как защитить книгу, чтобы пользователь не удалял, не переименовывал и даже не перемещал листы?
Я попробовал структуру protect workbook, но она предотвращает вставку листов. Как мне это сделать?
Комментарии:
1. Разве вы не можете заблокировать листы паролем, щелкнув правой кнопкой мыши и выбрав «Защитить лист»? Отметьте все поля и введите пароль.
2. почему бы не создать макрос, который снимет защиту с книги, добавит страницу, предоставит пользователю сообщение для изменения имени листа, а затем повторно защитит книгу? Вы можете добавить кнопку макроса на ленте.
3. @Kleven Листы (их 24) защищены паролем. Незащищенные листы содержат сводные таблицы и другие материалы, но они очень скрыты. Щелчок правой кнопкой мыши и защита паролем листа не мешает пользователю переименовывать, перемещать или удалять такой лист.
4. @JohnSUN Инструктаж пользователя должен быть моим последним средством, если больше ничего не работает.
Ответ №1:
Одна вещь, которую вы могли бы сделать, это переименовать и переместить лист в любое время, когда он активирован. У каждого листа есть имя листа (Лист1) и заголовок («myWorksheet»). Если пользователь изменит заголовок, вы не сможете ссылаться на заголовок, поэтому вместо этого ссылайтесь на имя листа. Вы можете задать имя листа или просто сослаться на имя листа по умолчанию. В среде разработки VBA в VBAProject откройте папку Micorsoft Excel Objects в окне проекта и откройте лист вместо модулей. В выпадающем списке вверху выберите Рабочий лист, затем во втором выпадающем списке справа выберите Активировать. При этом будет сгенерирован следующий код, или вы можете просто скопировать и вставить следующий на страницу. Я добавил переименование заголовка листа и кода перемещения листа.
Option Explicit
Private Sub Worksheet_Activate()
On Error Resume Next
Sheet5.Name = "TEST"
Sheet5.Move After:=Sheet1
On Error GoTo 0
End Sub
Теперь каждый раз, когда кто-то нажимает на лист, лист будет переименован в исходное имя и перемещен в нужное вам место в книге.
Комментарии:
1. Спасибо. Это отличная идея, но надеюсь, что этот небольшой код на каждом листе (их 24) не повлияет на производительность при каждой активации листа. Кстати, как насчет ограничения на удаление листа. Этот аспект вызывает особую озабоченность, поскольку один удаленный лист может привести к сбою других.
Ответ №2:
Если вы хотите по-прежнему защищать книгу, вы можете сделать это. Для его запуска пользователю потребуется добавить кнопку на ленте, листе или сочетание клавиш.
Sub newSheet()
Dim sheetName As Variant
sheetName = InputBox("What do you want to name the sheet?")
ActiveWorkbook.Unprotect 'password if needed
ActiveWorkbook.Sheets.Add.Name = sheetName
ActiveWorkbook.Protect Structure:=True, Windows:=False
End Sub
Комментарии:
1. Во-первых, пользователю не нужно переименовывать какой-либо лист. Единственное переименование, выполняемое макрокомандой, когда пользователь хочет распечатать. Во-вторых, если структура рабочей книги защищена, мой код VBA, который дублирует, переименовывает и удаляет листы, работать не будет.
2. Какой ваш код дублирует? Добавьте код в свой вопрос, и я покажу вам, как это сделать.