Команда VBA protect / unprotect sheet не работает должным образом - PullRequest
0 голосов
/ 25 октября 2018

Я создал небольшой инструмент Excel, который в основном просит пользователя ввести некоторые элементы затрат и выкладывает вывод.В режиме администратора я создал кнопки блокировки и разблокировки, которые позволяют пользователю-администратору защищать и снимать защиту со всех листов для редактирования.У меня есть всего 10 листов в инструменте.Кнопки работают нормально, за исключением двух листов.

Макрос Разблокировка снимает защиту со всех листов, кроме листа «Ввод затрат».Однако, если я использую небольшой фрагмент кода, который снимает защиту с листа Cost Inputs в ближайшем окне, он работает нормально!

Sub admin_unlock_Click()
  Application.ScreenUpdating = False
  Sheets("Home").Unprotect Password:="xxx"
  Sheets("Cover Page").Unprotect Password:="xxx"
  Sheets("Study Categorization").Unprotect Password:="xxx"
  Sheets("Cost Inputs").Unprotect Password:="xxx"
  Sheets("Price Indicators").Unprotect Password:="xxx"
  Sheets("Benchmarking Output").Unprotect Password:="xxx"
  Sheets("Output Sheet").Unprotect Password:="xxx"
  Sheets("Instructions").Unprotect Password:="xxx"
  Sheets("Glossary").Unprotect Password:="xxx"
  Sheets("Export to CRM").Unprotect Password:="xxx"
  Application.ScreenUpdating = True
End Sub

Макрос Lock защищает все листы, кроме одного Output Sheet.Это также не работает, если я помещаю соответствующий бит кода в ближайшее окно.

Sub admin_lock_Click()
  Application.ScreenUpdating = False
Sheets("Home").Protect Password:="xxx", UserInterFaceOnly:=True
Sheets("Cover Page").Protect Password:="xxx", UserInterFaceOnly:=True
Sheets("Study Categorization").Protect Password:="xxx", UserInterFaceOnly:=True
Sheets("Cost Inputs").Protect Password:="xxx", UserInterFaceOnly:=True
Sheets("Price Indicators").Protect Password:="xxx", UserInterFaceOnly:=True
Sheets("Benchmarking Output").Protect Password:="xxx", UserInterFaceOnly:=True
Sheets("Output Sheet").Protect Password:="xxx", UserInterFaceOnly:=True
Sheets("Instructions").Protect Password:="xxx", UserInterFaceOnly:=True
Sheets("Glossary").Protect Password:="xxx", UserInterFaceOnly:=True
Sheets("Export to CRM").Protect Password:="xxx", UserInterFaceOnly:=True
Application.ScreenUpdating = True
  End Sub

Есть идеи о том, что здесь может пойти не так?

Спасибо!Dawm89

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Подумайте о петле листа, а не набирайте название каждого листа следующим образом: ~

Sub admin_unlock_Click()

Dim ws As Worksheet

For Each ws In Worksheets
    ws.Unprotect "xxx"
Next ws

End Sub

Sub admin_lock_Click()

Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets
    ws.Protect "xxx", UserInterFaceOnly:=True
Next ws

End Sub

Если вы блокируете каждый лист, почему бы просто не заблокировать книгу?Тогда вам нужно только защитить / снять защиту книги, а не каждый лист.

0 голосов
/ 25 октября 2018

.Protect защищает заблокированные ячейки в VBA по умолчанию.Возможно, на вашем рабочем листе нет заблокированных ячеек.В качестве обходного пути попробуйте следующее:

Создайте новый модуль в VBA.В новом модуле скопируйте и вставьте:

Sub TestMe()
    Worksheets("Cost Inputs").Cells.Locked = True
End Sub

. В появившемся окне напишите TestMe и нажмите Введите .Запустите ваш код снова.Это защищено?Если это не так, вы набираете код robably have On Error Resume Next.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...