我正在尝试读取全局公共(public)对象foo。我在一个模块中声明了它,并想在每个其他模块中读取它。为什么我会收到类型不匹配错误?
模块1:
Public Sub Test()
If foo Is Nothing Then MsgBox "Foo is not initialized", vbOKOnly
End Sub
富:
Public foo As Object
最佳答案
发生的现象称为标识符阴影:公共(public)变量 foo
与模块 foo
存在于同一范围内.
从Sub Test
开始与 foo
不存在于同一模块中变量,标识符foo
在Modul1
解析为模块 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
的限定符(变量)修复编译错误:
If Foo.Foo Is Nothing Then
现在这是明确的,因为现在 Foo.Foo
显然是指成员(member)Foo
模块的Foo
.
另一个(也许更好)的解决方案是重命名模块或变量。
关于Excel VBA 类型不匹配 - 公共(public)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55655815/