簡體   English   中英

為什么這不是類型不匹配?

[英]Why isn't this a type mismatch?

我回答了這個問題,顯然是對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。 不過,我不太相信這個功能,我仍然對這里發生的事情感到困惑。

VBA將嘗試將&運算符每一側的表達式轉換為數據值。 語言規范指出:

  • 如果表達式的目標變量的值類型是類:
  • 如果目標的聲明類型是Variant,則運行時錯誤9
    (下標超出范圍)被提出。
  • 如果目標的聲明類型不是Variant,並且目標具有公共默認屬性Get或函數,則數據值的值是使用此參數列表為該目標調用此默認成員的結果。 這會消耗參數列表。
  • 否則,引發運行時錯誤438(對象不支持此屬性或方法)。

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

callbyname(O, "_Default", VbGet)

這將在適當時引發438錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM