自定义事件未触发

11 excel vba excel-vba

我在Excel 2010中,我似乎得到一个奇怪的意外行为使用自定义事件.

我肯定99%肯定这种方法几年前对我有用(也许是在Excel 03/07中 - 记不住了) 或者 我刚搞砸了什么 ......

这是一个复制品:

添加一个新的类模块并为其命名 Factory

Public Event AfterInitialize()

Private Sub Class_Initialize()
    RaiseEvent AfterInitialize
End Sub
Run Code Online (Sandbox Code Playgroud)

添加另一个类模块,名称是 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
Run Code Online (Sandbox Code Playgroud)

和标准,Module1并运行以下

Sub Main()

    Dim fTest As FactoryTest
    Set fTest = New FactoryTest

End Sub
Run Code Online (Sandbox Code Playgroud)

此时我预计会after initialized..在立即窗口看到,但我不...

逐步执行代码似乎Private Sub cFactory_AfterInitialize()永远不会达到......

注意:

我可以RaiseAfterInitialize()Factory类中添加一个public sub:然后Initialize()FactoryTest类似的事件中显式调用它,cFactory.RaiseAfterInitialize()这样可能是一个可能的解决方法,但我真正想要理解的是为什么它不能按上面显示的原始方式工作?

MSDN上的VBA事件并不多

谁能指出我做错了什么?

Bla*_*awk 16

基于VBA语言规范部分5.3.1.10生命周期处理程序声明,我猜这是原因(强调我的):

如果一个类定义了一个Class_Initialize生命周期处理程序,那么每次New运算符创建该类的实例时,通过引用一个声明为a <as-auto-object>且当前值为Nothing 的变量,或者通过调用,该子例程将作为方法调用VBA标准库的CreateObject函数(第6.1.2.8.1.4节).调用的目标对象是新创建的对象.调用发生在从创建它的操作返回对新创建的对象的引用之前.

所以在你的情况下,在行

Set cFactory = New Factory

Class_Initialize方法Factory在运行之前在作出转让,这意味着同时引发该事件的FactoryTest类的实例并不知道这件事.


UPDATE

我通过添加Factory调用Class_Initialize函数的方法给它快速测试:

Public Sub test()
    Class_Initialize
End Sub
Run Code Online (Sandbox Code Playgroud)

然后作为FactoryTest.Class_Initialize方法的一部分添加了对它的调用:

Private Sub Class_Initialize()
    Set cFactory = New Factory
    cFactory.test
End Sub
Run Code Online (Sandbox Code Playgroud)

由于在分配方法test之后调用该方法,因此"按初始化...后"消息将按预期显示.New FactorycFactory