Защита ячеек в Excel, но позволяет изменять их с помощью сценария VBA - PullRequest
56 голосов
/ 24 сентября 2008

Я использую Excel, где определенные поля разрешены для ввода пользователем, а другие ячейки должны быть защищены. Я использовал лист Tools Protect, однако после этого я не могу изменить значения в скрипте VBA. Мне нужно ограничить лист, чтобы остановить пользовательский ввод, в то же время разрешить коду VBA изменять значения ячеек на основе определенных вычислений.

Ответы [ 6 ]

85 голосов
/ 24 сентября 2008

Попробуйте использовать

Worksheet.Protect "Password", UserInterfaceOnly := True

Если для параметра UserInterfaceOnly установлено значение true, код VBA может изменять защищенные ячейки.

16 голосов
/ 24 сентября 2008

Вы можете изменить лист с помощью кода, выполнив эти действия

  • Unprotect
  • Изменение
  • Защита

В коде это будет:

Sub UnProtect_Modify_Protect()

  ThisWorkbook.Worksheets("Sheet1").Unprotect Password:="Password"
'Unprotect

  ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify

  ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password"
'Protect

End Sub

Слабость этого метода заключается в том, что если код прерывается и обработка ошибок не захватывает его, рабочий лист можно оставить в незащищенном состоянии.

Код можно улучшить , выполнив эти действия

  • Re-защиты
  • Изменение

Код для этого будет:

Sub Re-Protect_Modify()

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
 UserInterfaceOnly:=True
'Protect, even if already protected

  ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify

End Sub

Этот код обновляет защиту на листе, но с параметром UserInterfaceOnly, установленным в значение true. Это позволяет коду VBA изменять рабочий лист, сохраняя при этом рабочий лист защищенным от пользовательского ввода через пользовательский интерфейс, даже если выполнение прерывается.

Этот параметр потерян при закрытии и повторном открытии книги. Защита листа все еще поддерживается.

Таким образом, код «Повторная защита» должен быть включен в начале любой процедуры, которая пытается изменить лист, или может быть запущен один раз при открытии книги.

3 голосов
/ 24 сентября 2008

Я не думаю, что вы можете установить какую-либо часть листа для редактирования только с помощью VBA , но вы можете сделать что-то, что в основном имеет тот же эффект - вы можете снять защиту листа с VBA перед вам нужно внести изменения:

wksht.Unprotect()

и повторно защитите его после того, как вы закончите:

wksht.Protect()

Редактировать: Похоже, что этот обходной путь мог решить непосредственную проблему Дирса, но для любого, кто сталкивается с этим вопросом / ответом позже, я ошибался в первой части своего ответа, как Джо указывает ниже. Вы можете защитить лист, чтобы его можно было редактировать только в VBA, но, по-видимому, параметр «UserInterfaceOnly» можно установить только при вызове «Worksheet.Protect» в коде.

2 голосов
/ 10 февраля 2014

Простой, но простой для понимания ответ:

Sub Example()
    ActiveSheet.Unprotect
    Program logic...
    ActiveSheet.Protect
End Sub
1 голос
/ 22 февраля 2017

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

Вы сможете изменить отображаемое значение через скрытый лист , тогда как ваши пользователи не смогут его редактировать.

0 голосов
/ 12 мая 2017

Я выбрал ячейки, которые хотел заблокировать на листе 1, и поместил предложенный код в функцию open_workbook () и работал как чудо.

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...