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