#excel #vba
Вопрос:
Я пытаюсь использовать приведенный ниже код для защиты и скрытия формул всех листов.
Однако он работает с ограниченными листами, а не со всеми листами. Я пробовал несколько способов сделать это, но это не помогает.
Было бы здорово увидеть вашу поддержку в этом вопросе. Спасибо
Private Function SpecialCells(ByVal R As Range, ByVal Typ As XlCellType, _
Optional ByVal Value As XlSpecialCellsValue = amp;H17) As Range
'Avoid the SpecialCells-BUG to return all cells from the current region
On Error Resume Next
Select Case Typ
Case xlCellTypeConstants, xlCellTypeFormulas
Set SpecialCells = Intersect(R, R.SpecialCells(Typ, Value))
Case Else
Set SpecialCells = Intersect(R, R.SpecialCells(Typ))
End Select
End Function
«‘Блокировка всего листа (Функция блокировки всех листов)
Sub protect_all_sheets()
top:
pass = InputBox("password?")
repass = InputBox("Verify Password")
If Not (pass = repass) Then
MsgBox "you made a boo boo"
GoTo top
End If
For i = 1 To Worksheets.Count
If Worksheets(i).ProtectContents = True Then GoTo oops
Next
For Each s In ActiveWorkbook.Worksheets
s.Unprotect
s.UsedRange.FormulaHidden = False
Set R = SpecialCells(s.UsedRange, xlCellTypeFormulas)
If R Is Nothing Then Exit Sub
R.FormulaHidden = True
R.Locked = True
s.Protect Password:=pass
Next
Exit Sub
oops: MsgBox "I think you have some sheets that are already protected. Please unprotect all
sheets then running this Macro."
End Sub
Комментарии:
1. Любую книгу можно открыть без активации макросов, поэтому полагаться на VBA для обеспечения безопасности-плохая практика. Вам было бы лучше создать скрытый защищенный паролем лист ресурсов, с которого другой лист просто считывает значения.
2. Привет @Tragamor Спасибо, что уделили мне время. Я хотел бы сообщить вам, что я совершенно новичок в теме VBA. Меня беспокоит не безопасность, а локальная машина. Однако код, защищающий несколько листов рабочей книги, и некоторые из них все еще открыты для редактирования. Я попробовал приведенный ниже код без какой-либо логики, и он работает для всех листов. Я ищу указания на то, не допустил ли я какой-либо ошибки с приведенным выше кодом. «Защитите Все Рабочие Листы Подзаголовок ProtectAllSheets() Затемните ws В Качестве Рабочего Листа Для Каждого ws В Рабочих Листах ws.Защитите «паролем» Следующий Подзаголовок ws