我发现了Siddharth Rout用于添加新工作表和代码的伟大代码,但我的需求略有不同。
我要将激活码添加到现有工作表。我尝试使用该表名称来代替使用.Name
属性,删除
Set ws = Worksheets.Add
并将ws.Name
替换为我现有的工作表名称"Work“。它在这一点上爆炸了。
使用现有示例中的代码检查ws对象时,会发现ws对象的属性名称是一个简单的字符串,因此不能在其中使用现有工作表的名称会让我感到困惑。
原因:
现有工作表"Work“最初是在没有激活码的情况下创建的。在这个多页多功能系统中,它在许多步骤中被大量使用,如果用户手动选择它,我想防止用户更改它--有理由让他在交互暂停期间查看它,做出决定--但当我的VBA来回跳动时,它却不受保护。
因此,我想插入保护工作表的激活代码--移除保护的停用代码可以是工作表的永久部分,不会受到伤害--这样每当用户决定手动查看工作表时,只要我的VBA允许用户交互,就可以保护工作表,然后在用户离开工作表并返回交互时通过其停用来删除/更改该代码,因此它通常可以免费供我的代码使用,否则每次我的代码切换到它时都不会添加保护。
我将在那里创建并永久保留取消保护的停用代码--这不会有什么坏处--这样它就不会改变自己(这是一个可怕的禁忌)。多么?
很抱歉说了这么多话。我在VBA中用谷歌搜索“自修改代码”,但没有找到好的答案。
发布于 2013-04-16 06:24:57
如果您只想临时捕获其他工作表上的事件,则可以使用类模块。如果您想永久地将代码添加到工作表代码中,则需要使用@Sorceri提到的VBA可扩展性内容。
使用类模块捕获工作簿的事件
在类模块中(名称: SheetEvent)
Public WithEvents Sheet As Worksheet
Public Sub Capture(ByVal Worksheet As Worksheet)
Set Sheet = Worksheet
End Sub
Private Sub Class_Terminate()
Set Sheet = Nothing
End Sub
Private Sub Sheet_Activate()
Debug.Print "Sheet_Activate Fired! (Sheet:" & Sheet.Name & ")"
End Sub
Private Sub Sheet_Change(ByVal Target As Range)
Debug.Print "Sheet_Activate Fired! (Sheet:" & Sheet.Name & " Target:" & Target.Address & ")"
End Sub
Private Sub Sheet_Deactivate()
Debug.Print "Sheet_Deactivate Fired! (Sheet:" & Sheet.Name & ")"
End Sub
在模块中:
Public S As SheetEvent
Sub Main()
Set S = New SheetEvent
S.Capture ThisWorkbook.Worksheets("Sheet1")
End Sub
这种方法的问题是,如果您的VBA出现错误或您停止执行,则需要重新启动它。
使用上面的示例,如果您运行Main()
,然后在Sheet1和Sheet2之间来回切换,或者更改Sheet1中的任何单元格,您将在“即时”窗口中收到一条消息。
如果在工作表之间“跳转”意味着您正在激活工作表以读取(或设置一些单元格),然后重新激活前一个工作表,您可能会发现使用工作表对象更容易(也更快)。
Dim Sheet1 As Worksheet
Dim Sheet2 As Worksheet
Set Sheet1 = ThisWorkbook.Worksheets("Sheet1")
Set Sheet2= ThisWorkbook.Worksheets("Sheet2")
使用上面的代码,您可以通过这两个对象访问sheet1和sheet2中的数据。不需要先激活任何一个(即使是隐藏的)
https://stackoverflow.com/questions/16024905
复制相似问题