Excel VBA 类型不匹配 - 公共(public)对象

标签 excel vba type-mismatch

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

模块1:

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

富:

Public foo As Object

VBA Screenshot

最佳答案

发生的现象称为标识符阴影:公共(public)变量 foo与模块 foo 存在于同一范围内.

Sub Test开始与 foo 不存在于同一模块中变量,标识符fooModul1解析为模块 foo ,因为它在语法上可以:语法不区分标准模块和带有 VB_PredeclaredId 的类模块属性,所以这样:

If Foo Is Nothing Then

在语法上与以下内容没有什么不同:

If UserForm1 Is Nothing Then

或者:

If ThisWorkbook Is Nothing Then

如果模块以该名称存在,VBA 将始终尝试将范围内标识符解析为模块...除非它是一个没有 VB_PredeclaredId 的类模块属性,在这种情况下,它知道您不可能引用类本身(类是类型,而不是对象)。可以说,VBA 应该足够聪明,也知道标准模块也不是对象,但我不会屏住呼吸等待修复;-)

<小时/>

Rubberduck (免责声明:我积极参与了这个开源项目)可以更多地了解正在解决的问题:

context-sensitive selection shows what 'Foo' is resolving to

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

If Foo.Foo Is Nothing Then

现在这是明确的,因为现在 Foo.Foo显然是指成员(member)Foo模块的Foo .

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

关于Excel VBA 类型不匹配 - 公共(public)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55655815/

相关文章:

python - Python 中的异或错误 (2.7)

c# - 为什么 OleDbDataAdapter.Fill() 非常慢?

vba - 复制和粘贴错误 “Action can'不适用于多个部分”

excel - For-Next 循环使用月末日期作为迭代

vba - 如何将长字符串分成多行

excel - 对于包含不同类型的组的每个下一个循环 VBA Excel 中的类型不匹配

java - 多态二叉搜索树类型不匹配错误

c# - 迭代 Excel 引用范围的最快方法 ("C20:F22")

excel - 使用宏设置 Excel 数据连接 (csv)

美国国债报价的 Excel 自定义数字格式