Excel VBA类型不匹配-公共对象

汤姆·史蒂文斯

我正在尝试读取全局公共对象foo我在一个模块中声明了它,并希望在其他模块中读取它。为什么会出现类型不匹配错误?

模组1:

Public Sub Test()
    If foo Is Nothing Then MsgBox "Foo is not initialized", vbOKOnly
End Sub

foo:

Public foo As Object

VBA屏幕截图

马修·金登(Mathieu Guindon)

发生的现象是称为标识符阴影的现象:公共变量foo与模块存在于同一范围内foo

并且由于Sub Testfoo变量不在同一个模块中,因此标识符fooinModul1解析为模块foo,因为它语法可以:语法不会区分标准模块和具有VB_PredeclaredId属性的类模块,因此:

If Foo Is Nothing Then

语法上来说没有什么不同:

If UserForm1 Is Nothing Then

要么:

If ThisWorkbook Is Nothing Then

VBA将始终尝试解决一个在范围内的标识符的模块如果存在同名的模块......除非它是一个类模块没有一个VB_PredeclaredId属性,在这种情况下,它知道你不可能被引用类本身(类是类型,不是对象)。可以说,VBA应该足够聪明,以至于也知道标准模块也不是对象,但是我不会屏住呼吸进行修复;-)


Rubberduck(免责声明:我参与了这个开源项目)可以为解决问题提供更多的思路

上下文相关的选择显示“ Foo”要解决的问题

您可以将Foo(模块)用作Foo(变量)的限定词,以修复编译错误:

If Foo.Foo Is Nothing Then

现在这是明确的,因为现在Foo.Foo显然是指Foo模块的成员Foo

另一个(也许更好)的解决方案是重命名模块或变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章