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

Joh*_*man 18 excel vba excel-vba

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

?"Hello, " & ThisWorkbook
Run Code Online (Sandbox Code Playgroud)

在立即窗口中.

我的问题是-为什么会发生这种提高错误,而不是错误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
Run Code Online (Sandbox Code Playgroud)

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

Ror*_*ory 9

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

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

至于你的功能,我只想使用:

callbyname(O, "_Default", VbGet)
Run Code Online (Sandbox Code Playgroud)

这将在适当时引发438错误.