如何让密码保护工作表中的行隐藏/显示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
相关产品推荐
相关产品推荐

