我目前正在处理一个工作表,它应该使用不同的用户窗体来执行任务和计算。用户窗体通过按钮调用。
因此,用户的所有输入都应通过这些用户表单进行;实际工作表应仅包含应为只读的结果(对于用户(。
问题:
- 保护工作表还将防止宏进行更改。
-
以下代码与保护工作表具有相同的问题。
Private Sub Worksheet_Change(ByVal Target As Range) If Not IsEmpty(Target) Then Target.Clear MsgBox "SomeAlertMSG" End If End Sub
任何建议如何在不使用自制布尔标志的情况下完成此操作?
调用另一个 sub 为你写入范围并处理如下事件:
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!"
您在这里寻找的是用于保护VBA中工作表的UserInterfaceOnly:=True
标志。
通过以下行保护您的工作表免受 VBA 的侵害:
ActiveWorkbook.Sheets("YourSheet").Protect Password:="123", UserInterfaceOnly:=True
这将保护工作表并防止用户手动编辑它,但是任何宏仍然可以更改工作表!显然,您可以选择不同的密码,或者将其作为输入,这样它就不会在您的代码中烘焙/可见。
文档:https://msdn.microsoft.com/en-us/library/office/ff840611.aspx
仅用户界面 - 如果为 true,则保护用户界面,但不保护宏。如果省略此参数,则保护同时适用于宏和用户界面。
您可以通过在单击宏后要执行的代码中使用以下代码来使工作表不受保护。
Sheet1.Protect Password:="Secret"
执行代码后,工作表将再次被锁定。