保护Excel中的单元格,但允许VBA脚本修改这些单元格

fwzugrvs  于 2023-03-09  发布在  其他
关注(0)|答案(6)|浏览(358)

我正在使用Excel,其中某些字段允许用户输入,而其他单元格将受到保护。我已经使用了工具保护工作表,但在执行此操作后,我无法更改VBA脚本中的值。我需要限制工作表以停止用户输入,同时允许VBA代码根据某些计算更改单元格值。

laawzig2

laawzig21#

尝试使用

Worksheet.Protect "Password", UserInterfaceOnly := True

如果UserInterfaceOnly参数设置为true,VBA代码可以修改受保护的单元格。
但是请注意,这个参数does not stick。每次打开文件时都需要重新应用它。

jc3wubiy

jc3wubiy2#

您可以通过代码修改工作表,方法是执行以下操作

  • 取消保护
  • 修改
  • 保护

在代码中,这将是:

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输入的影响,即使执行被中断也是如此。
关闭并重新打开工作簿时,此设置将丢失。工作表保护仍将保留。
因此,“重新保护”代码需要包含在任何试图修改工作表的过程的开头,或者可以在打开工作簿时只运行一次。

0h4hbjxa

0h4hbjxa3#

一个简单易懂的基本答案:

Sub Example()
    ActiveSheet.Unprotect
    Program logic...
    ActiveSheet.Protect
End Sub
3mpgtkmj

3mpgtkmj4#

我不认为您可以将工作表的任何部分设置为只能由VBA编辑,但是您可以执行一些基本上具有相同效果的操作--您可以在需要进行更改之前在VBA中取消对工作表的保护:

wksht.Unprotect()

并在完成后重新保护它:

wksht.Protect()

编辑:看起来这个变通方法可能已经解决了Dheer眼前的问题,但是对于以后遇到这个问题/答案的任何人来说,我的答案的第一部分是错误的,正如Joe在下面指出的那样。您 * 可以 * 保护工作表使其仅可由VBA编辑,但是似乎只有在代码中调用“Worksheet.Protect”时才能设置“UserInterfaceOnly”选项。

pzfprimi

pzfprimi5#

作为一种解决方法,您可以创建一个隐藏工作表,用于保存更改后的值。受保护的可见工作表上的单元格应使用简单公式显示隐藏工作表中的值。
您将能够通过隐藏的工作表更改显示的值,而您的用户将无法编辑它。

ajsxfq5m

ajsxfq5m6#

我在sheet1中选择了想要锁定的单元格,并将建议的代码放在open_workbook()函数中,工作起来非常顺利。

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True

相关问题