为受保护 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 我根据你的问题做了以下假设:

  1. 只有活跃的 sheet 是相关的
  2. 您将单元格 C15 格式化为未锁定(当 sheet 未受保护时,右键单击 C15 /format/protection 并取消选中“锁定”和“隐藏”
  3. 您已指出要隐藏或不隐藏的正确行(看起来有点奇怪?)
  4. 只有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

其中“密码”更改为您想要的任何密码。