免责声明 - 我绝不是 VBA 专家;我是一名黑客。
但是,我有一些静态的类模块(使用Attribute VB_PredeclaredId = True
)
我也想用它们定义一些自定义事件(Public Event Foo(ByVal Bar As Boolean
);但是,由于我没有实例化该类,所以我没有找到任何当“PreDeclaredID”为 true 时,有关将包含“WithEvents”的任何“属性”的信息。
是的,我可以使用该类而不需要它是静态的;但是,如果可能的话,我更愿意找到一种自动声明它的方法 WithEvents。
最佳答案
该类具有静态语义,但它不是您所指的静态
意义上的静态。
VB_PredeclaredId
属性设置为 True
表示编译器生成一个以类模块本身命名的全局(或项目范围,如果该类是私有(private)的)实例.
换句话说,有一个名为 Class1
的对象/实例(假设类模块名为 Class1
),公开默认值由 Class1
模块定义的接口(interface)(即,它是一个编译时类型为 Class1
的对象,无论该类可能实现什么其他接口(interface))。
所以您并没有实例化它,而是 VBA 编译器实例化了它。
该对象的行为与您可能拥有的任何其他对象相同 - 没有理由不能在其中声明公共(public)事件
,并且您可以设置
一个 WithEvents
对象变量到该“自由”全局实例,您可以从项目中的任何位置通过名称引用它:
Private WithEvents Thing As Class1 '<~ requires Public Event declaration in Class1.
Private Sub Class_Initialize()
Set Thing = Class1 '<~ will not compile unless Class1 has VB_PredeclaredId=True.
End Sub
关于VBA静态类 "WithEvents"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67707876/