我正在使用 Excel,其中某些字段允许用户输入,而其他单元格将受到保护。我使用了工具保护表,但是在这样做之后我无法更改 VBA 脚本中的值。我需要限制工作表以停止用户输入,同时允许 VBA 代码根据某些计算更改单元格值。
6 回答
尝试使用
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 输入的影响,即使执行被中断。
关闭并重新打开工作簿时,此设置将丢失。仍然保持工作表保护。
因此,“重新保护”代码需要包含在任何尝试修改工作表的过程的开头,或者可以在打开工作簿时运行一次。
一个基本但易于理解的答案:
Sub Example()
ActiveSheet.Unprotect
Program logic...
ActiveSheet.Protect
End Sub
我不认为您可以将工作表的任何部分设置为只能由 VBA 编辑,但您可以做一些具有基本相同效果的事情 - 您可以在需要进行更改之前取消保护 VBA 中的工作表:
wksht.Unprotect()
完成后重新保护它:
wksht.Protect()
编辑:看起来这种解决方法可能已经解决了 Dheer 的直接问题,但是对于以后遇到这个问题/答案的任何人来说,我的答案的第一部分是错误的,正如乔在下面指出的那样。您可以保护工作表仅可由 VBA 编辑,但似乎只有在代码中调用“Worksheet.Protect”时才能设置“UserInterfaceOnly”选项。
作为一种解决方法,您可以创建一个隐藏的工作表,它将保存更改的值。可见的受保护工作表上的单元格应使用简单公式显示隐藏工作表中的值。
您将能够通过隐藏的工作表更改显示的值,而您的用户将无法对其进行编辑。
我在 sheet1 中选择了我想要锁定的单元格,并将建议的代码放在 open_workbook() 函数中,并像魅力一样工作。
ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
UserInterfaceOnly:=True