使用VBA代码将Workshhet_activate和_deactivate添加到现有工作表

时间:2013-04-15 21:21:58

标签: excel vba self-modifying

我找到了Siddharth Rout为其添加新工作表和代码的优秀代码,但我的需求与众不同。

我想将激活代码添加到现有工作表中。我尝试用该表单替换代替使用.Name属性,删除

设置ws = Worksheets.Add

并将“ws.Name”替换为我现有的工作表名称“Work”。它在那时爆炸了。

使用现有示例中的代码检查ws对象,将ws对象的属性Name显示为一个简单的字符串,因此无法使用我现有的工作表名称,这让我感到困惑。

为什么:

最初创建的现有工作表“工作”没有激活代码。它在这个多表单多功能系统中经过多次使用,我希望防止用户在手动选择时更改它 - 有理由让他看看它,做出决定,在他的互动停顿期间 - - 但是当我的VBA反弹时,保持不受保护。

因此,我想插入保护工作表的激活代码 - 删除保护的停用代码可以是工作表的永久部分,不会受到伤害 - 因此每当用户决定查看时保护工作表在手动操作时,每当我的VBA允许用户交互时,当用户离开工作表并返回到交互时,通过其Deactivate删除/更改该代码,因此通常我的代码可以免费使用,否则每次我的代码都不会添加保护切换到它。

我将永久地创建并保留Unprotect停用代码 - 不会受到伤害 - 所以它不会改变自己(这是一个可怕的禁忌)。怎么样?

对不起所有的话。我在VBA中搜索“自修改代码”的时间没有找到好的答案。

1 个答案:

答案 0 :(得分:1)

如果您只想临时捕获其他工作表上的事件,则可以使用类模块。如果要永久地将代码添加到工作表代码中,则需要使用@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中的数据。不必先激活(即使也隐藏)