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
6条答案
按热度按时间laawzig21#
尝试使用
如果
UserInterfaceOnly
参数设置为true,VBA代码可以修改受保护的单元格。但是请注意,这个参数does not stick。每次打开文件时都需要重新应用它。
jc3wubiy2#
您可以通过代码修改工作表,方法是执行以下操作
在代码中,这将是:
这个方法的弱点是,如果代码被中断并且错误处理没有捕获它,那么工作表可能处于未受保护的状态。
通过采取以下措施,可以改进代码
执行此操作的代码为:
此代码将更新工作表上的保护,但将“UserInterfaceOnly”设置为true。这允许VBA代码修改工作表,同时保护工作表不受用户通过UI输入的影响,即使执行被中断也是如此。
关闭并重新打开工作簿时,此设置将丢失。工作表保护仍将保留。
因此,“重新保护”代码需要包含在任何试图修改工作表的过程的开头,或者可以在打开工作簿时只运行一次。
0h4hbjxa3#
一个简单易懂的基本答案:
3mpgtkmj4#
我不认为您可以将工作表的任何部分设置为只能由VBA编辑,但是您可以执行一些基本上具有相同效果的操作--您可以在需要进行更改之前在VBA中取消对工作表的保护:
并在完成后重新保护它:
编辑:看起来这个变通方法可能已经解决了Dheer眼前的问题,但是对于以后遇到这个问题/答案的任何人来说,我的答案的第一部分是错误的,正如Joe在下面指出的那样。您 * 可以 * 保护工作表使其仅可由VBA编辑,但是似乎只有在代码中调用“Worksheet.Protect”时才能设置“UserInterfaceOnly”选项。
pzfprimi5#
作为一种解决方法,您可以创建一个隐藏工作表,用于保存更改后的值。受保护的可见工作表上的单元格应使用简单公式显示隐藏工作表中的值。
您将能够通过隐藏的工作表更改显示的值,而您的用户将无法编辑它。
ajsxfq5m6#
我在sheet1中选择了想要锁定的单元格,并将建议的代码放在open_workbook()函数中,工作起来非常顺利。