我正在尝试读取全局公共对象foo。我在一个模块中声明了它,并希望在其他模块中读取它。为什么会出现类型不匹配错误?
模组1:
Public Sub Test()
If foo Is Nothing Then MsgBox "Foo is not initialized", vbOKOnly
End Sub
foo:
Public foo As Object
发生的现象是称为标识符阴影的现象:公共变量foo
与模块存在于同一范围内foo
。
并且由于Sub Test
与foo
变量不在同一个模块中,因此标识符foo
inModul1
解析为模块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
显然是指Foo
模块的成员Foo
。
另一个(也许更好)的解决方案是重命名模块或变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句