如何密码保护和隐藏除两个工作表外的所有工作表?

How to password protect and hide all sheets except two worksheets?

我在 this forum 中遇到了以下 VBA 函数,该函数用于密码保护一个 sheet,但我想用密码保护除两个 sheet 之外的所有 sheet sheet秒:

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim MySheets As String, Response As String
MySheet = "Sheet1"
If ActiveSheet.Name = MySheet Then
ActiveSheet.Visible = False
    Response = InputBox("Enter password to view sheet")
        If Response = "MyPass" Then
            Sheets(MySheet).Visible = True
            Application.EnableEvents = False
            Sheets(MySheet).Select
            Application.EnableEvents = True
        End If
End If
Sheets(MySheet).Visible = True
End Sub

我的工作簿中有五个 sheet("Sheet1"、"Sheet2"、"Sheet3"、"Sheet4"、"Sheet5")并且我希望除 Sheet1 和 Sheet2 之外的所有 sheet 都受密码保护和隐藏。也就是说,Sheet3、Sheet4、Sheet5都应该用上面的代码进行密码保护

我已经将功能更新如下,但即使输入正确的密码后它甚至不显示任何其他 sheets

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim MySheets As String, Response As String
MySheet = "Sheet1"
MySheet2 = "Sheet2"
If ActiveSheet.Name <> MySheet And ActiveSheet.Name <> MySheet2 Then
   ActiveSheet.Visible = False
    Response = InputBox("Enter password to view sheet")
        If Response = "MyPass" Then
            Sheets(MySheet).Visible = True
            Application.EnableEvents = False
            Sheets(MySheet).Select
            Application.EnableEvents = True
        End If
End If
Sheets(MySheet).Visible = True
Sheets(MySheet2).Visible = True

End Sub

你没有使用 Workbook_SheetActivate 给你的礼物。 Sh 是正在激活的工作表对象。

你的变量声明是 henky;您声明 Dim MySheets As String 但从不使用它并分配 MySheet = "Sheet1" 和 MySheet2 = "Sheet2" 而不声明它们。

某些级别的工作表标识由工作表的 codename property 更好地处理,它的更改频率要低得多。

Option Explicit

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim response As String

    If IsError(Application.Match(Sh.CodeName, Array("Sheet1", "Sheet2"), 0)) Then
        Sh.Visible = xlSheetHidden

        response = InputBox("Enter password to view sheet")
        If response = "MyPass" Then
            Application.EnableEvents = False
            Sh.Visible = xlSheetVisible
            Sh.Activate
            Application.EnableEvents = True
        End If
    End If

    Sheet1.Visible = True
    Sheet2.Visible = True

End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

    If IsError(Application.Match(Sh.CodeName, Array("Sheet1", "Sheet2"), 0)) Then
        Sh.Visible = xlSheetHidden
    End If

End Sub

另一种选择是绑定到命名范围。您创建具有 sheet 范围的命名范围,如下所示,例如: Name manager Ctrl+F3

然后你创建额外的函数来检查这样的名称是否存在并获取它的值。根据结果​​,sheet 将被隐藏或不被隐藏。

Public Function bIsVisible(ByRef wksSheet As Worksheet) As Boolean
    Dim bResult     As Boolean

    bResult = False
    On Error Resume Next
    bResult = Evaluate(wksSheet.Names("Visible").Value)

    bIsVisible = bResult
End Function

下面是隐藏 sheet 的代码(您可以在此处轻松添加 sheet 保护等代码):

Public Sub HideUnvisible()
    Dim wksSheet        As Worksheet

    For Each wksSheet In Worksheets
        If Not bIsVisible(wksSheet) Then
            wksSheet.Visible = xlSheetHidden
        End If
    Next wksSheet
End Sub