3 回答
TA贡献1797条经验 获得超4个赞
尝试使用
Worksheet.Protect "Password", UserInterfaceOnly := True
如果UserInterfaceOnly参数设置为true,则VBA代码可以修改受保护的单元格。
TA贡献1875条经验 获得超5个赞
您可以通过执行以下操作通过代码修改工作表
解除保护
修改
保护
在代码中,这将是:
Sub UnProtect_Modify_Protect()
ThisWorkbook.Worksheets("Sheet1").Unprotect Password:="Password"
'Unprotect
ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify
ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password"
'Protect
End Sub
此方法的弱点是,如果代码被中断并且错误处理无法捕获它,则工作表可能会处于未保护状态。
通过执行以下操作可以改进代码
重新保护
修改
执行此操作的代码为:
Sub Re-Protect_Modify()
ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True
'Protect, even if already protected
ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
'Modify
End Sub
这段代码在工作表上更新了保护,但是'UserInterfaceOnly'设置为true。这样,即使执行被中断,VBA代码也可以修改工作表,同时保护工作表不受用户通过UI的输入的影响。
关闭并重新打开工作簿时,此设置将丢失。工作表保护仍然保持。
因此,在尝试修改工作表的任何过程的开始处都需要包含“重新保护”代码,或者在打开工作簿时仅运行一次即可。
TA贡献1856条经验 获得超11个赞
您可以执行基本相同的操作-您可以在需要进行更改之前取消保护VBA中的工作表:
wksht.Unprotect()
并在完成后重新保护它:
wksht.Protect()
编辑:看起来这种解决方法可能已经解决了Dheer的紧迫问题,但是对于以后遇到此问题/答案的任何人,我对答案的第一部分都是错误的,正如Joe指出的那样。您可以保护工作表只能由VBA进行编辑,但是看起来“ UserInterfaceOnly”选项只能在代码中调用“ Worksheet.Protect”时设置。
- 3 回答
- 0 关注
- 629 浏览
添加回答
举报