为受保护 Sheet 启用下拉宏
Enable Drop Down Macro for Protected Sheet
我创建了一个宏,允许用户从下拉列表中 select 一个选项,该选项取消隐藏与其 selection 相对应的 selected 行。问题是当我保护 sheet 时,当我 select 下拉列表的选项时,我收到以下错误“运行-time error '1004'”。我需要这个 sheet 受到保护,这样用户就无法触摸显示的数据集。下面是示例代码(原版很长):
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Activate
If Not Application.Intersect(Range("C15"), Range(Target.Address)) Is Nothing Then
Select Case Target.Value
Case Is ="Option 1"
Rows("17:75").EntireRow.Hidden = True
Case Is ="Option 2"
Rows("17:28").EntireRow.Hidden = False
End Select
End If
End Sub
我一直在阅读其他线程,我遇到了一些选项,它们说我需要取消保护和保护我的 sheet,但我不确定如何将其添加到上面的代码中.如果这是我想要完成的事情的最佳选择
选项 1
Sub UnprotectAll()
Dim sh As Worksheet
For Each sh In ActiveWorkbook.Worksheets
sh.Unprotect Password:=yourPassword
Next sh
End Sub
Sub ProtectAll()
Dim sh As Worksheet
For Each sh In ActiveWorkbook.Worksheets
sh.Protect Password:=yourPassword
Next sh
End Sub
选项 2 - 在下方某处添加此代码
UserInterFaceOnly:=True
关于如何完成此任务的任何建议?完整的代码是什么样的?
非常感谢!
@ExcelNoob 我根据你的问题做了以下假设:
- 只有活跃的 sheet 是相关的
- 您将单元格 C15 格式化为未锁定(当 sheet 未受保护时,右键单击 C15 /format/protection 并取消选中“锁定”和“隐藏”
- 您已指出要隐藏或不隐藏的正确行(看起来有点奇怪?)
- 只有2个选项
既然如此,下面的最少代码将满足您的要求。如果要使用特定密码,只需将其放在双引号之间即可。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("C15"), Target) Is Nothing Then
ActiveSheet.Unprotect Password:=""
If Range("C15").Value = "Option 1" Then
Rows("17:75").Hidden = True
ElseIf Range("C15").Value = "Option 2" Then
Rows("17:28").Hidden = False
End If
ActiveSheet.Protect Password:=""
End If
End Sub
如上,但如果您不想 protect/unprotect,请将您的下拉列表放在一个表格中并使用:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Sheet1.Protect "Password", UserInterfaceOnly:=True
End Sub
其中“密码”更改为您想要的任何密码。
我创建了一个宏,允许用户从下拉列表中 select 一个选项,该选项取消隐藏与其 selection 相对应的 selected 行。问题是当我保护 sheet 时,当我 select 下拉列表的选项时,我收到以下错误“运行-time error '1004'”。我需要这个 sheet 受到保护,这样用户就无法触摸显示的数据集。下面是示例代码(原版很长):
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Activate
If Not Application.Intersect(Range("C15"), Range(Target.Address)) Is Nothing Then
Select Case Target.Value
Case Is ="Option 1"
Rows("17:75").EntireRow.Hidden = True
Case Is ="Option 2"
Rows("17:28").EntireRow.Hidden = False
End Select
End If
End Sub
我一直在阅读其他线程,我遇到了一些选项,它们说我需要取消保护和保护我的 sheet,但我不确定如何将其添加到上面的代码中.如果这是我想要完成的事情的最佳选择
选项 1
Sub UnprotectAll()
Dim sh As Worksheet
For Each sh In ActiveWorkbook.Worksheets
sh.Unprotect Password:=yourPassword
Next sh
End Sub
Sub ProtectAll()
Dim sh As Worksheet
For Each sh In ActiveWorkbook.Worksheets
sh.Protect Password:=yourPassword
Next sh
End Sub
选项 2 - 在下方某处添加此代码
UserInterFaceOnly:=True
关于如何完成此任务的任何建议?完整的代码是什么样的?
非常感谢!
@ExcelNoob 我根据你的问题做了以下假设:
- 只有活跃的 sheet 是相关的
- 您将单元格 C15 格式化为未锁定(当 sheet 未受保护时,右键单击 C15 /format/protection 并取消选中“锁定”和“隐藏”
- 您已指出要隐藏或不隐藏的正确行(看起来有点奇怪?)
- 只有2个选项
既然如此,下面的最少代码将满足您的要求。如果要使用特定密码,只需将其放在双引号之间即可。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("C15"), Target) Is Nothing Then
ActiveSheet.Unprotect Password:=""
If Range("C15").Value = "Option 1" Then
Rows("17:75").Hidden = True
ElseIf Range("C15").Value = "Option 2" Then
Rows("17:28").Hidden = False
End If
ActiveSheet.Protect Password:=""
End If
End Sub
如上,但如果您不想 protect/unprotect,请将您的下拉列表放在一个表格中并使用:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Sheet1.Protect "Password", UserInterfaceOnly:=True
End Sub
其中“密码”更改为您想要的任何密码。