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

Dhe*_*eer 58 excel vba excel-vba

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

Joe*_*Joe 87

尝试使用

Worksheet.Protect "Password", UserInterfaceOnly := True
Run Code Online (Sandbox Code Playgroud)

如果UserInterfaceOnly参数设置为true,则VBA代码可以修改受保护的单元格.

  • 当然,这是一个更好的解决方案。不过,如果您回来看到此评论,请修复代码中的拼写错误 - 有一个“f”而不是“t”:UserInferfaceOnly 在我对您的代码进行 c&p 处理后,花了几分钟才找出问题所在。 (2认同)
  • 如果微软保留它的新功能,UserInterfaceOnly 会很漂亮。如果我尝试通过 VBA 在 UserInterfaceOnly = true 的受保护工作表上刷新查询表,则会失败,我必须取消保护工作表,刷新,然后再次保护。啊啊啊…… (2认同)

Rob*_*rns 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
Run Code Online (Sandbox Code Playgroud)

此方法的缺点是,如果代码被中断并且错误处理没有捕获它,则工作表可能处于不受保护的状态.

通过采取这些行动可以改进代码

  • 重新保护
  • 修改

执行此操作的代码将是:

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
Run Code Online (Sandbox Code Playgroud)

此代码更新了工作表上的保护,但"UserInterfaceOnly"设置为true.这允许VBA代码修改工作表,同时通过UI保护工作表免受用户输入,即使执行被中断.

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

因此,"重新保护"代码需要包含在尝试修改工作表的任何过程的开头,或者只能在打开工作簿时运行一次.