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

Tom*_*ens 4 excel vba type-mismatch

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

模组1:

Public Sub Test()
    If foo Is Nothing Then MsgBox "Foo is not initialized", vbOKOnly
End Sub
Run Code Online (Sandbox Code Playgroud)

foo:

Public foo As Object
Run Code Online (Sandbox Code Playgroud)

VBA屏幕截图

Mat*_*don 9

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

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

If Foo Is Nothing Then
Run Code Online (Sandbox Code Playgroud)

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

If UserForm1 Is Nothing Then
Run Code Online (Sandbox Code Playgroud)

要么:

If ThisWorkbook Is Nothing Then
Run Code Online (Sandbox Code Playgroud)

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


Rubberduck(免责声明:我参与了这个开源项目)可以阐明解决方案的更多内容:

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

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

If Foo.Foo Is Nothing Then
Run Code Online (Sandbox Code Playgroud)

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

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

  • ...或者只是将模块重命名为“ fooModule”。很好的解释。 (3认同)