То, что вы ищете, - это возможность изменить ваш рабочий лист, фактически не снимая его.Вы можете защитить лист, но позволить VBA вносить изменения, пока пользователь не может:
ActiveSheet.Protect UserInterfaceOnly:=True
https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.protect
Имя: UserInterfaceOnly
Описание: True для защиты пользовательского интерфейса, но не макросов.Если этот аргумент пропущен, защита применяется как к макросам, так и к пользовательскому интерфейсу.
Предполагается, что параметр был установлен в значение True, когда лист был защищен в первую очередь.
В качестве альтернативы вы можете сохранить статус текущих настроек защиты в объекте Protection
:
Dim myProtection as Protection
Set myProtection = ActiveSheet.Protection
Что будет выглядеть так: Обратите внимание, что по некоторым причинам .AllowEditRanges
возвращаетошибка при чтении, поэтому я не включил ее в список.
Sub test()
'Pick your Worksheet
Dim mySheet As Worksheet
Set mySheet = ActiveSheet
'Unprotect it
Dim myProtection As Protection
Set myProtection = mySheet.Protection
mySheet.Unprotect
'Do your VBA things
'Re Protect it
With myProtection
mySheet.Protect AllowFormattingCells:=.AllowFormattingCells, _
AllowFormattingColumns:=.AllowFormattingColumns, _
AllowFormattingRows:=.AllowFormattingRows, _
AllowInsertingColumns:=.AllowInsertingColumns, _
AllowInsertingRows:=.AllowInsertingRows, _
AllowInsertingHyperlinks:=.AllowInsertingHyperlinks, _
AllowDeletingColumns:=.AllowDeletingColumns, _
AllowDeletingRows:=.AllowDeletingRows, _
AllowSorting:=.AllowSorting, _
AllowFiltering:=.AllowFiltering, _
AllowUsingPivotTables:=.AllowUsingPivotTables
End With
End Sub
Примечание: .Protect
включает в себя [DrawingObjects], [Scenarios] и [USerInterfaceOnly], хотя эти настройки не предоставляются Protection
объект.Я понимаю, что параметр [Contents] должен относиться к .AllowEditRanges
, но поскольку к нему нельзя получить доступ, думаю, он тоже будет пропущен,