VBA Скрывает формулы и защищает все листы в Excel

#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