保护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的输入的影响。

关闭并重新打开工作簿时,此设置将丢失。工作表保护仍然保持。

因此,在尝试修改工作表的任何过程的开始处都需要包含"重新保护"代码,或者在打开工作簿时仅运行一次即可。