为什么这不是类型不匹配?

时间:2016-06-21 11:32:40

标签: vba excel-vba excel

我回答this问题,显然是对OP的满意,但仍然发现他们的问题令人费解。他们的问题涉及一个表达式,其中工作簿对象与字符串连接,触发Run-time Error '438': Object doesn't support this property or method。只需键入

即可重现此类错误
?"Hello, " & ThisWorkbook

在立即窗口中。

我的问题是 - 为什么这会引起 错误,而不是错误13 - 类型不匹配?一个合理的猜测是VBA尝试查找工作簿对象的默认属性,并且默认属性不存在。但是,如果是这样,我希望它是Microsoft的Visual Basic 6.0错误代码列表中的以下错误:Automation object doesn't have a default value (Error 443)

这主要是学术上的兴趣,但是如果将没有默认属性的对象与字符串连接的结果总是错误438,这是触发错误438的唯一方法,而不是在连接字符串时可能出现的另一个错误一个对象,然后可能使用以下代码:

Function HasDefault(O As Variant) As Boolean
    Dim i As Long
    If Not IsObject(O) Then Exit Function
    On Error Resume Next
    i = Len("Hello, " & O)
    If Err.Number = 438 Then
        HasDefault = False
    Else
        HasDefault = True
    End If
End Function

我已经在各种对象上对此进行了测试,对于那些我在其上测试过的对象,当_Default在查看时未显示为对象的(隐藏)成员时,它返回了False在对象浏览器中。尽管如此,我不太相信这个功能,我仍然对这里发生的事情感到困惑。

1 个答案:

答案 0 :(得分:9)

VBA将尝试将&运算符每一侧的表达式转换为数据值。语言规范指出:

  • 如果表达式的目标变量的值类型是类:
  • 如果目标的声明类型是Variant,则运行时错误9
    (下标超出范围)被提出。
  • 如果目标的声明类型不是Variant,则目标具有 公共默认属性Get或函数,数据值的值是 使用此方法为该目标调用此默认成员的结果 参数列表。这会消耗参数列表。
  • 否则,运行时错误438(对象不支持此属性或 方法)被提出。

关于你的功能,我只是使用:

callbyname(O, "_Default", VbGet)

会在适当时引发438错误。