Excel VBA实现锁定工作表自定义错误提示失败求助
解决锁定工作表自定义错误提示不生效问题
问题根源
你当前的代码存在几个关键错误:
- 工作表中的
OnError不是VBA自动触发的事件过程,无法响应用户操作 - ThisWorkbook中的
Worksheet_Selection不是标准事件名称,VBA不会识别执行 - 代码中
wSheet.Locked = False逻辑错误,工作表的Locked属性并非控制保护状态的正确方式
修正方案
步骤1:删除无效代码
删掉你在各工作表中添加的OnError过程,以及ThisWorkbook中的Worksheet_Selection过程。
步骤2:在ThisWorkbook中添加标准事件代码
打开ThisWorkbook的代码窗口,粘贴以下代码:
Option Explicit Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) ' 检查当前工作表是否处于保护状态,且选中的单元格是锁定状态 If Sh.ProtectContents And Target.Locked Then Application.EnableEvents = False ' 取消选中锁定单元格,避免用户反复触发提示 Sh.Cells(1, 1).Select ' 可替换为你希望跳转的任意单元格位置 Application.EnableEvents = True ' 弹出自定义提示 MsgBox "This day is closed." & vbNewLine & vbNewLine & _ "The day has been closed and" & vbNewLine & _ "further editing is prohibited!" & vbNewLine & _ "Thank you", vbCritical, "STOP!" End If End Sub
步骤3:确保工作表保护设置正确
当你用宏锁定单元格并保护工作表时,需确保保护逻辑正确,示例保护宏代码:
Sub LockAndProtectSheet() Dim ws As Worksheet Set ws = ActiveSheet ' 锁定所有单元格(默认状态为锁定,若之前未解锁可省略此句) ws.Cells.Locked = True ' 保护工作表,可设置密码(可选),UserInterfaceOnly参数允许宏后台修改单元格无需反复解锁 ws.Protect Password:="yourpassword", UserInterfaceOnly:=True End Sub
额外优化:拦截双击编辑操作
如果需要阻止用户通过双击进入锁定单元格编辑状态,可在ThisWorkbook中追加以下代码:
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) If Sh.ProtectContents And Target.Locked Then Cancel = True ' 取消默认双击编辑行为 MsgBox "This day is closed." & vbNewLine & vbNewLine & _ "The day has been closed and" & vbNewLine & _ "further editing is prohibited!" & vbNewLine & _ "Thank you", vbCritical, "STOP!" End If End Sub
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

