自定义事件不会触发

我在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() ,然后在FactoryTestInitialize()事件中像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

FactoryClass_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之后,“预初始…”消息按预期显示。