Workbook_open()中ThisWorkbook.Protect并非100%生效问题排查
问题分析与修复方案
核心问题原因
你当前的ThisWorkbook.Protect调用未指定Structure参数,默认情况下该参数为False——这意味着仅保护工作簿窗口,并未锁定工作表结构(比如删除、新增、重命名工作表的操作)。弹窗正常弹出说明代码已执行,但工作簿结构未被保护,才会出现偶尔能删除工作表的情况。
修复步骤
1. 补全工作簿保护的关键参数
修改ThisWorkbook.Protect语句,显式指定Structure:=True来锁定工作表结构,同时可选添加Windows:=True锁定窗口布局:
Private Sub Workbook_Open() Call SetPass 'sets iPass variable ' 显式指定Structure参数,锁定工作表结构 ThisWorkbook.Protect Password:=iPass, Structure:=True, Windows:=True For Each sh In Worksheets sh.Protect Password:=iPass, UserInterFaceOnly:=True Next sh Sheets("Strona główna").Activate MsgBox "Witamy" End Sub
2. 增加激活事件作为兜底防护
部分场景下(如加载项干扰、Excel后台操作延迟),Workbook_Open事件的保护可能未完全生效。添加Workbook_Activate事件,确保每次激活工作簿时都重新应用保护:
Private Sub Workbook_Activate() Call SetPass ThisWorkbook.Protect Password:=iPass, Structure:=True, Windows:=True End Sub
3. 验证密码变量的有效性
确保SetPass过程正确赋值iPass变量,避免因变量作用域或赋值失败导致保护失效。可临时添加调试代码确认:
Call SetPass If Len(iPass) = 0 Then MsgBox "密码未正确初始化!" ' 仅调试用,确认后可删除 ThisWorkbook.Protect Password:=iPass, Structure:=True, Windows:=True
4. 额外防护:禁用删除工作表的右键选项
作为补充措施,可禁用右键菜单中的删除工作表选项,进一步防止误操作:
Private Sub DisableSheetDelete() On Error Resume Next ' 防止菜单不存在时报错 CommandBars("Ply").Controls("删除").Enabled = False On Error GoTo 0 End Sub
在Workbook_Open和Workbook_Activate事件末尾调用此过程即可。
内容的提问来源于stack exchange,提问作者Bearly
相关产品推荐
相关产品推荐

