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

我正在使用Excel中某些字段被允许用户input,其他单元格将被保护。 我已经使用了工具保护工作表,但是在这样做之后,我无法更改VBA脚本中的值。 我需要限制工作表停止用户input,同时允许VBA代码根据某些计算更改单元格值。

尝试使用

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 

这种方法的弱点是,如果代码被中断,并且error handling不能捕获它,工作表可能会处于不受保护的状态。

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

  • 重新保护
  • 修改

这样做的代码是:

 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代码修改工作表,同时保持工作表不受用户通过UIinput的影响,即使执行被中断。

工作簿closures并重新打开时,此设置将丢失 。 工作表保护仍然保留。

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

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

 wksht.Unprotect() 

并在完成后重新保护它:

 wksht.Protect() 

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

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

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

作为解决方法,您可以创build一个隐藏的工作表 ,它将保存更改的值。 可见,受保护的工作表上的单元格应使用简单的公式显示隐藏工作表中的值。

您将可以通过隐藏的工作表更改显示的值 ,而用户将无法编辑它。

我select了我希望locking在sheet1中的单元格,并将build议的代码放在open_workbook()函数中,并像魅力一样工作。

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