Excel VBA:如何只允许macros进行单元格input

我目前正在做一个工作表,它应该使用不同的用户表单来执行任务和计算。 用户表单通过button调用。

所以用户的所有input都应该通过这些用户表单来完成; 实际的工作表应该只包含应该是只读的结果(对于用户)。

问题:

  1. 保护工作表也将阻止macros进行更改。
  2. 以下代码与保护工作表的问题相同。

    Private Sub Worksheet_Change(ByVal Target As Range) If Not IsEmpty(Target) Then Target.Clear MsgBox "SomeAlertMSG" End If End Sub 

任何build议如何做到这一点,而不使用自制的布尔标志?

您在这里查找的是UserInterfaceOnly:=True标志,用于保护VBA中的表单。

通过以下行保护VBA中的工作表:

 ActiveWorkbook.Sheets("YourSheet").Protect Password:="123", UserInterfaceOnly:=True 

这将保护工作表,并防止用户手动进行编辑,但任何macros仍然可以更改工作表! 显然你可以select不同的密码,或者把它作为一个input,所以它不会在你的代码中被显示。

文档: https : //msdn.microsoft.com/en-us/library/office/ff840611.aspx

UserInterfaceOnly – True保护用户界面,但不保留macros。 如果省略此参数,则保护适用于macros和用户界面。

调用另一个子写入范围,并处理事件如下:

 Sub WriteToCell(ByVal cell As Excel.Range, ByVal cellValue) Application.EnableEvents = False cell.Value = cellValue Application.EnableEvents = True End Sub 

然后在你的用户表单中,当你想写一些东西到一个范围只写:

 WriteToCell Sheets("someSheet").Range("A1"), "I can stay here!" 

您可以通过使用代码中的下面的代码来保护您的工作表不受macros保护。

 Sheet1.Protect Password:="Secret" 

代码执行后,表单将再次被locking。