如何密码保护和隐藏除两个工作表外的所有工作表?
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
我在 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