自定义事件不会触发
我在Excel 2010,我似乎正在得到一个奇怪的意外的行为与自定义事件。
我很确定这种方法在几年前对我来说很有效(也许是在Excel 03/07 – 不记得了), 或者 我只是搞砸了一些东西 。
这是一个repro:
添加一个新的类模块并将其命名为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..
立即窗口after initialized..
,但我不…
通过代码似乎Private Sub cFactory_AfterInitialize()
永远不会到达…
注意:
我可以在Factory
类中添加一个public sub: RaiseAfterInitialize()
,然后在FactoryTest
的Initialize()
事件中像cFactory.RaiseAfterInitialize()
那样明确地调用它,这样可能是一个可能的解决方法,但是我真正想要理解的是是为什么它不工作原来的方式显示在上面?
MSDN上的VBA事件并不多
任何人都可以指出我做错了什么?
基于VBA语言规范第5.3.1.10节生命周期处理程序声明 ,我想这是原因(重点是我的):
如果一个类定义了一个Class_Initialize生命周期处理程序,每当New运算符创build该类的一个实例时,该子程序将作为一个方法调用,通过引用一个用
<as-auto-object>
声明的variables,值是Nothing,或者通过调用VBA标准库的CreateObject函数(第6.1.2.8.1.4节)。 调用的目标对象是新创build的对象。 调用在对创build对象的引用从创build它的操作返回之前发生。
所以在你的情况下,在线
Set cFactory = New Factory
Factory
的Class_Initialize
方法在赋值之前运行,这意味着在引发事件时, FactoryTest
类实例不知道它。
UPDATE
我给Factory
添加了一个调用Class_Initialize
函数的方法,给了它一个快速testing:
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
之后,“预初始…”消息按预期显示。