我在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()这样可能是一个可能的解决方法,但我真正想要理解的是为什么它不能按上面显示的原始方式工作?
谁能指出我做错了什么?
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
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |