VBA静态Class"WithEvents"?

VBA Static Class "WithEvents"?

免责声明 - 我绝不是 VBA 专家;我是黑客。

但是,我有一些 class 静态模块(使用 Attribute VB_PredeclaredId = True )

我也想用它们定义一些自定义事件 (Public Event Foo(ByVal Bar As Boolean);但是,由于我没有实例化 class,因此当“PreDeclaredID”为真时,我没有找到任何关于将包含“WithEvents”的“属性”的信息。

是的,我可以使用 class 而不是静态的;但是,如果可能的话,我更愿意找到一种自动声明它的方法WithEvents

class 具有静态 语义 ,但在您所指的 static 意义上它不是静态的。

VB_PredeclaredId 属性设置为 True 意味着编译器生成一个全局(或项目范围,如果 class 是私有的)实例,该实例以 class 模块本身。

换句话说,字面上一个object/instance命名为Class1(假设class模块命名为Class1 ),公开由 Class1 模块定义的默认接口(即它是一个编译时类型为 Class1 的对象,而不管 class 可能正在实现的其他接口)。

所以没有实例化它,但是VBA编译器实例化了它。

并且该对象的每一点行为都与您可能拥有的任何其他对象相同 - 没有理由不能在其中声明 Public Event,您可以 Set a 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