保护Excel中的单元格,但允许通过VBA脚本对其进行修改
时间:2020-03-06 14:38:33 来源:igfitidea点击:
我正在使用Excel,其中允许用户输入某些字段,而其他单元格则受到保护。我使用过"工具保护"工作表,但是执行此操作后,我无法更改VBA脚本中的值。我需要限制工作表以停止用户输入,同时允许VBA代码根据某些计算来更改单元格值。
解决方案
我认为我们不能将工作表的任何部分都设置为只能由VBA进行编辑,但是我们可以执行基本相同的操作-我们可以在需要进行更改之前取消保护VBA中的工作表:
wksht.Unprotect()
并在完成后重新保护它:
wksht.Protect()
编辑:看起来这种解决方法可能已经解决了Dheer的迫在眉睫的问题,但是对于以后遇到此问题/答案的任何人,我对答案的第一部分都是错误的,正如Joe指出的那样。我们可以保护工作表只能由VBA进行编辑,但是看起来" UserInterfaceOnly"选项只能在代码中调用" Worksheet.Protect"时设置。
尝试使用
Worksheet.Protect "Password", UserInterfaceOnly := True
如果UserInterfaceOnly参数设置为true,则VBA代码可以修改受保护的单元格。
我们可以通过执行以下操作通过代码修改工作表
- 解除保护
- 调整
- 保护
在代码中,这将是:
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的输入的影响。
关闭并重新打开工作簿时,此设置将丢失。工作表保护仍然保持。
因此,在尝试修改工作表的任何过程的开始处都需要包含"重新保护"代码,或者在打开工作簿时仅运行一次即可。