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)

发生的现象是称为标识符阴影的现象:公共变量foo与模块存在于同一范围内foo。
并且由于Sub Test与foo变量不在同一个模块中,因此标识符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(变量)的限定词,以修复编译错误:
If Foo.Foo Is Nothing Then
Run Code Online (Sandbox Code Playgroud)
现在这是明确的,因为现在Foo.Foo显然是指Foo模块的成员Foo。
另一个(也许更好)的解决方案是重命名模块或变量。