自定义事件未触发

时间:2014-10-27 13:48:27

标签: excel vba excel-vba

我在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

有谁可以指出我做错了什么?

1 个答案:

答案 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,因此“初始化后...”消息会按预期显示。