VBA код для использования пароля из другого суб в Excel


У меня есть два кода, один, который защищает все листы, которые используют пароль от окна ввода, и второй, который удаляет ошибки #REF!. На втором коде мне нужно сначала снять защиту листа, чтобы удалить строку. Теперь я пытаюсь понять, как я могу использовать пароль из первого кода, чтобы снять защиту листа, чтобы второй код мог удалить строки #REF! ошибок?

Не уверен, что это вообще возможно, но, возможно, у кого-то была такая же проблема раньше.

Любая помощь-это оцененный.

Sub ProtectAllSheets()
    Dim pwd1 As String, pwd2 As String
    pwd1 = InputBox("Enter your password", "")
    If pwd1 = "" Then Exit Sub
    pwd2 = InputBox("Enter the password again", "")

    If pwd2 = "" Then Exit Sub

     'Checks if both the passwords are identical
    If InStr(1, pwd2, pwd1, 0) = 0 Or _
       InStr(1, pwd1, pwd2, 0) = 0 Then
        MsgBox "Please type the same password. ", vbInformation, ""
        Exit Sub
    End If

    For Each ws In ActiveWorkbook.Sheets
        If ws.ProtectContents = False = True Then
            ws.Protect Contents:=True, Scenarios:= _
                True, AllowFormattingCells:=True, AllowDeletingRows:=True, Password:=pwd1
        End If

    Next ws

    MsgBox "Sheets are protected."
End Sub



Sub DeleteRows() ' Cells which contain an Error Formula
    ActiveSheet.Unprotect pwd1

    Dim c As Long
    For c = 400 To 2 Step -1
        If IsError(Cells(c, 3)) Then
            Rows(c).EntireRow.Delete
        End If
    Next c
    ws.Protect Contents:=True, Scenarios:= _
        True, AllowFormattingCells:=True, AllowDeletingRows:=True, Password:=pwd1
End Sub
1 3

1 ответ:

Вам нужно будет объявить переменную как Public.

Public pwd1 As String

Sub ProtectAllSheets()
    'NO dim for pwd1 here
    pwd1 = InputBox("Enter your password", "")
    'your code here
End Sub
Таким образом, он доступен во всех ваших процедурах и функциях.

Но я рекомендую использовать .Protect UserInterFaceOnly:=True
который защищает лист от редактирования пользователем, но позволяет VBA редактировать его без ограничений.

Поэтому вам просто нужно защитить ваши листы в событии Workbook_Open(), как это:

Private Sub Workbook_Open()
    Sheets("Sheet1").Protect Password:="Secret", UserInterFaceOnly:=True
    Sheets("Sheet2").Protect Password:="Secret", UserInterFaceOnly:=True
    'Repeat with the name and password of additional sheets to be manipulated by VBA.
End Sub 

Таким образом, вам не нужно защищать/снимать защиту для каждого действия VBA.

Для полного руководства и более информацию смотрите: ускорение Excel VBA макросы с Protect UserInterFaceOnly .