我在Excel 2010中,我似乎在使用自定义事件时遇到一种奇怪的意外行为。
我肯定99%肯定这种方法几年前对我有用(也许是在Excel 03/07中 - 不记得了) 或 < em>也许我刚搞砸了什么 ......
这是一个复制品:
添加新的类模块并将其命名为Factory
Public Event AfterInitialize()
Private Sub Class_Initialize()
RaiseEvent AfterInitialize
End Sub
添加另一个类模块,名称为FactoryTest
Private WithEvents cFactory As Factory
Private Sub Class_Initialize()
Set cFactory = New Factory
End Sub
Private Sub cFactory_AfterInitialize()
Debug.Print "after inialized..."
End Sub
和标准Module1
并运行以下
Sub Main()
Dim fTest As FactoryTest
Set fTest = New FactoryTest
End Sub
此时我希望在立即窗口中看到after initialized..
,但我不会......
单步执行代码似乎永远不会达到Private Sub cFactory_AfterInitialize()
...
注意:
我可以向RaiseAfterInitialize()
类添加公开子Factory
,然后在Initialize()
中的FactoryTest
事件中明确地调用{@ 1}}这可能是一个可能的解决方法,但我真正想要理解的是为什么它不能按照上面显示的原始方式工作?
There isn't much on VBA events on MSDN
有谁可以指出我做错了什么?
答案 0 :(得分:16)
基于VBA语言规范部分5.3.1.10 Lifecycle Handler Declarations,我猜这就是原因(强调我的):
如果一个类定义了一个Class_Initialize生命周期处理程序,那么每当New运算符创建该类的一个实例时,通过引用一个用
<as-auto-object>
声明的变量来调用该子程序作为方法当前值为Nothing,或者通过调用VBA标准库的CreateObject函数(第6.1.2.8.1.4节)。调用的目标对象是新创建的对象。 调用发生在从创建对象的操作返回对新创建的对象的引用之前。
所以在你的情况下,在行
Set cFactory = New Factory
Class_Initialize
Factory
方法在分配之前运行,这意味着在引发事件时,FactoryTest
类实例不会了解它。
<强>更新强>
我通过向调用Factory
函数的Class_Initialize
添加方法对其进行了快速测试:
Public Sub test()
Class_Initialize
End Sub
然后在FactoryTest.Class_Initialize
方法中添加了对它的调用:
Private Sub Class_Initialize()
Set cFactory = New Factory
cFactory.test
End Sub
由于在test
被分配到New Factory
之后调用方法cFactory
,因此“初始化后...”消息会按预期显示。