Защищающие ячейки в Excel, но позволяющие изменять их с помощью скрипта VBA

StackOverflow https://stackoverflow.com/questions/125449

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Worksheet.Protect "Password", UserInterfaceOnly := True

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

Другие советы

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

  • Незащищать
  • Изменять
  • Защищать

В коде это было бы:

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

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

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

  • Повторная защита
  • Изменять

Код для этого будет следующим:

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 изменять рабочий лист, сохраняя при этом рабочий лист защищенным от пользовательского ввода через пользовательский интерфейс, даже если выполнение прервано.

Этот параметр является потерянный когда рабочая книга будет закрыта и снова открыта.Защита рабочего листа по-прежнему сохраняется.

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

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

wksht.Unprotect()

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

wksht.Protect()

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

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

Sub Example()
    ActiveSheet.Unprotect
    Program logic...
    ActiveSheet.Protect
End Sub

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

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

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

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top