“VBA静态类”;WithEvents";?

“VBA静态类”;WithEvents";?,vba,events,static,Vba,Events,Static,免责声明-我绝不是VBA专家;我是个黑客 但是,我有一些静态的类模块(使用属性VB\u PredeclaredId=True ) 我也想用它们定义一些自定义事件(Public Event Foo(ByVal Bar为Boolean);但是,由于我没有实例化该类,所以在“PreDeclaredID”为true时,我找不到任何包含“WithEvents”的“属性”信息 是的,我可以使用这个类,而不需要它是静态的;但是,如果可能的话,我更愿意找到一种方法,让它通过事件自动声明。这个类有静态语义,但在您

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

但是,我有一些静态的类模块(使用
属性VB\u PredeclaredId=True
)

我也想用它们定义一些自定义事件(
Public Event Foo(ByVal Bar为Boolean
);但是,由于我没有实例化该类,所以在“PreDeclaredID”为true时,我找不到任何包含“WithEvents”的“属性”信息

是的,我可以使用这个类,而不需要它是静态的;但是,如果可能的话,我更愿意找到一种方法,让它通过事件自动声明。

这个类有静态语义,但在您所指的
静态
意义上它不是静态的

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

换句话说,实际上有一个名为
Class1
的对象/实例(假设类模块名为
Class1
),公开了
Class1
模块定义的默认接口(也就是说,它是一个编译时类型为
Class1
的对象,而不考虑该类可能实现的其他接口)

因此,您没有实例化它,但VBA编译器会实例化它

并且该对象的行为与您可能拥有的任何其他对象的行为都相同-没有理由不能在其中声明
公共事件
,并且您可以
WithEvents
对象变量设置为“free”全局实例,您可以从项目中的任何位置通过名称引用该实例:


Private with events Thing As Class1'您尝试过吗?因为它没有理由不起作用。只需添加,
WithEvents
对象不能在标准模块中声明。啊。我现在明白了。我一直在使用类的方法和属性,但没有将任何其他对象声明为该类。有一次我在另一个模块中声明了一个对象er模块(“当然是WithEvents”),自定义事件在该模块中可用。