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
另一个(也许更好)的解决方案是重命名模块或变量。
我正在尝试读取全局 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
另一个(也许更好)的解决方案是重命名模块或变量。