2016-06-21 4 views
18

Ich antwortete this Frage, offenbar zu OPs Zufriedenheit, aber immer noch ihre Frage rätselhaft finden. Ihre Frage umfasste einen Ausdruck, in dem ein Arbeitsmappenobjekt mit einer Zeichenfolge verkettet wurde, die Run-time Error '438': Object doesn't support this property or method auslöst. Sie können diese Art von Fehler reproduzieren, indem Sie einfachWarum ist das nicht ein Typenkonflikt?

im Direktfenster eingeben.

Meine Frage ist - warum verursacht dies , dass Fehler, anstatt eines Fehlers 13 - Typ Mismatch? Eine vernünftige Schätzung ist, dass VBA versucht, eine Standardeigenschaft für ein Arbeitsmappenobjekt zu finden, und dass eine Standardeigenschaft nicht vorhanden ist. Aber, wenn dem so ist, würde ich erwarten, dass es der folgende Fehler von Microsofts Liste der Visual Basic 6.0-Fehlercodes ist: Automation object doesn't have a default value (Error 443).

Es ist meist von akademischem Interesse, aber wenn das Ergebnis der Verkettung eines Objekts ohne eine Standardeigenschaft mit einer Zeichenfolge ist immer Error 438, und das ist die einzige Möglichkeit zum Auslösen von Fehler 438 statt möglicherweise einen anderen Fehler beim Verketten einer Zeichenfolge mit einem Objekt, dann könnte der folgende Code von nutzen sein:

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 

ich das auf einer Vielzahl von Objekten getestet haben, und für die ich es auf sie getestet haben ist falsch genau zurückgegeben, wenn _Default nicht der Fall ist Wenn das Objekt im Objektbrowser angezeigt wird, wird es als (verborgenes) Mitglied des Objekts angezeigt. Trotzdem traue ich dieser Funktion nicht ganz und bin immer noch verwirrt darüber, was hier vor sich geht.

+0

Die Antwort, die Sie selbst gegeben haben, scheint mir völlig in Ordnung zu sein. :) –

Antwort

9

VBA wird versuchen, die Ausdrücke auf jeder Seite des &-Operators in einen Datenwert zu konvertieren. Die Sprache spec besagt:

  • Wenn der Wert Typ der Zielgröße des Ausdrucks ist eine Klasse:
  • wenn der angegebene Typ des Ziels ist Variant, Laufzeitfehler 9
    (Index außerhalb des Bereichs) ist angehoben.
  • Wenn der deklarierte Typ des Ziels nicht Variant ist und das Ziel hat einen öffentlichen Standard Property Get oder die Funktion, der Wert des Datenwertes das Ergebnis dieses Standardelement mit dieser Argumentliste für dieses Ziel zu berufen. Dies verbraucht die Argumentliste.
  • Andernfalls wird Laufzeitfehler 438 (Objekt unterstützt diese Eigenschaft oder Methode) ausgelöst.

Wie Ihre Funktion betrifft, so würde ich nur verwenden:

callbyname(O, "_Default", VbGet) 

, die einen 438 Fehler entsprechend erhöhen wird.

+0

Gute Antwort, ich habe die Dokumentation ein wenig durchsucht (so habe ich diesen obskuren Fehler gefunden 443), aber anscheinend nicht mit den richtigen Keywords. –