2016-06-21 66 views
18

我回答this的問題,顯然對OP的滿意度,但仍然覺得他們的問題令人費解。他們的問題涉及一個表達式,其中一個工作簿對象與一個字符串連接,觸發Run-time Error '438': Object doesn't support this property or method。您可以通過簡單地輸入爲什麼這不是一個類型不匹配?

?"Hello, " & ThisWorkbook 

在即時窗口中重現此類錯誤。

我的問題是 - 爲什麼這會增加錯誤,而不是錯誤13 - 類型不匹配?合理的猜測是VBA試圖爲工作簿對象查找默認屬性,並且默認屬性不存在。但是,如果是這樣,我期望它是微軟的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 

我已經在各種不同的物體進行了測試,對於那些我已經測試了它返回false什麼時候_Default不在對象瀏覽器中查看時顯示爲該對象的(隱藏)成員。儘管如此,我並不完全相信這個功能,我仍然對這裏發生的事情感到困惑。

+0

你給自己的答案對我來說似乎很完美。 :) –

回答

9

VBA將嘗試將&運算符各邊的表達式轉換爲數據值。語言規範規定:

  • 如果表達式的目標變量的值類型是一個類:
  • 如果目標聲明的類型是變型中,運行時錯誤9
    (下標超出範圍)是上調。
  • 如果目標聲明的類型不變,目標具有 公共默認屬性獲取或功能,數據值的值爲 調用此默認成員與此 參數列表這一目標的結果。這消耗參數列表。
  • 否則,會引發運行時錯誤438(對象不支持此屬性或 方法)。

至於你的功能,我只是用:

callbyname(O, "_Default", VbGet) 

這將提高一個438錯誤適當。

+0

好的答案,我搜索了一下文檔(這是我如何發現那個隱晦的錯誤443),但顯然沒有正確的關鍵字。 –

相關問題