You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让密码保护工作表中的行隐藏/显示VBA代码正常运行

解决工作表保护后VBA无法控制行隐藏/显示的问题

当工作表被保护时,默认会限制VBA对行隐藏状态的修改,因此需要在代码执行前后分别解除和重新保护工作表。以下是修改后的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ws As Worksheet
    Dim protectPassword As String
    
    Set ws = Me
    protectPassword = "你的密码" ' 替换成你的工作表保护密码
    
    ' 解除工作表保护
    ws.Unprotect Password:=protectPassword
    
    ' 重置所有行的显示状态
    ws.Rows("1:" & ws.Rows.Count).EntireRow.Hidden = False
    
    ' 根据M11的值设置对应行的隐藏状态
    Select Case ws.Range("M11").Value
        Case "0"
            ws.Rows("13:92").EntireRow.Hidden = True
        Case "Mini"
            ws.Rows("13:18").EntireRow.Hidden = True
            ws.Rows("38:57").EntireRow.Hidden = True
        Case "Small"
            ws.Rows("13:18").EntireRow.Hidden = True
            ws.Rows("43:57").EntireRow.Hidden = True
        Case "Standard"
            ws.Rows("13:18").EntireRow.Hidden = True
    End Select
    
    ' 重新保护工作表,保留用户界面操作权限
    ws.Protect Password:=protectPassword, UserInterfaceOnly:=True
End Sub

关键说明:

  • 将"你的密码"替换为你实际设置的工作表保护密码
  • 用Select Case替代多个If判断,让代码更简洁易读
  • UserInterfaceOnly:=True参数可让后续VBA操作无需重复解锁,但Excel重启后该设置会失效,若需长期稳定生效,建议保持每次执行操作前先解锁的逻辑
  • 若担心代码执行出错导致工作表处于未保护状态,可添加错误处理:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ws As Worksheet
    Dim protectPassword As String
    
    Set ws = Me
    protectPassword = "你的密码"
    
    On Error GoTo ErrorHandler ' 启用错误捕获
    
    ws.Unprotect Password:=protectPassword
    
    ws.Rows("1:" & ws.Rows.Count).EntireRow.Hidden = False
    
    Select Case ws.Range("M11").Value
        Case "0"
            ws.Rows("13:92").EntireRow.Hidden = True
        Case "Mini"
            ws.Rows("13:18").EntireRow.Hidden = True
            ws.Rows("38:57").EntireRow.Hidden = True
        Case "Small"
            ws.Rows("13:18").EntireRow.Hidden = True
            ws.Rows("43:57").EntireRow.Hidden = True
        Case "Standard"
            ws.Rows("13:18").EntireRow.Hidden = True
    End Select
    
ErrorHandler:
    ' 无论是否出错,都重新保护工作表
    ws.Protect Password:=protectPassword, UserInterfaceOnly:=True
    If Err.Number <> 0 Then
        MsgBox "执行出错:" & Err.Description ' 可选,提示错误信息
    End If
End Sub

内容的提问来源于stack exchange,提问作者KarenW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:21:12