Excel VBA 类型不匹配 - Public 对象

Excel VBA type mismatch - Public Object

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

模块 1:

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

foo:

Public foo As Object

正在发生的是一种称为 标识符隐藏 的现象:public 变量 foo 与模块 foo 存在于同一范围内。

并且由于 Sub Test 不存在于与 foo 变量相同的模块中,因此 Modul1 中的标识符 foo 解析为模块 foo,因为它语法可以:语法不区分标准模块和class模块VB_PredeclaredId 属性,所以这个:

If Foo Is Nothing Then

在句法上与:

没有区别
If UserForm1 Is Nothing Then

或:

If ThisWorkbook Is Nothing Then
如果模块以该名称存在,

VBA 将始终尝试将范围内标识符解析为模块...除非它是 class 模块 without 一个 VB_PredeclaredId 属性,在这种情况下它知道你不可能指的是 class 本身(class 是一个 type,不是 对象)。可以说 VBA 应该足够聪明,也知道标准模块也不是对象,但我不会屏住呼吸等待修复 ;-)


Rubberduck(免责声明:我大量参与了这个开源项目)可以更清楚地说明什么正在解决什么:

您可以使用 Foo(模块)作为 Foo(变量)的限定符来修复编译错误:

If Foo.Foo Is Nothing Then

这已经很明确了,因为现在 Foo.Foo 显然指的是模块 Foo.

的成员 Foo

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