2017-09-26 2 views
3

Kann überprüft werden, ob ein Objekt eine bestimmte Methode ohne Fehlerbehandlung in VBA unterstützt?Wie überprüft man, ob Objekt Methode in VBA unterstützt?

Ich habe zahlreiche Duplikate gefunden, die die Frage nach beispielsweise JavaScript und Symphony2 stellen, aber noch nicht in VBA.

Ich möchte einen .sendkeys "{ENTER}" Befehl zu einem ie.document Klassenelement verwenden und lernen, wie man überprüft, ob das Objekt eine Methode unterstützt, erlaubt mir, saubereren Code auf lange Sicht zu schreiben.

Beispielcode:

Set elements(17) = ie.document.getElementsByClassName("ng-binding ng-scope") 
for each item in elements(17) 
    item.sendkeys "{ENTER}" 
next item 

Antwort

3

Kurz der für die API in der Dokumentation suchen Sie verwenden, können Sie nicht.

Zumindest nicht auf spät gebundene Code. Per Definition ist spät gebundene Code zur Laufzeit aufgelöst, was bedeutet, dass Sie keine Kompilierung-Art und Weise haben, die Validierung, ob ein Mitglied auf diesem Objekt Schnittstelle verfügbar sein wird - das ist, warum dieser Code kompiliert:

Option Explicit 

Public Sub Test(ByVal o As Object) 
    Debug.Print o.FooBarBazz 
End Sub 

Or dies etwas realistischer ein:

Debug.Print ThisWorkbook.Worksheets("Test").Naame 'Worksheets.Item returns an Object 

Der einzige Weg, bevor die Laufzeit zu wissen, ob ein Mitglied unterstützt wird, ist früh gebundenen Anrufe zu verwenden:

Dim ws As Worksheet 
Set ws = ThisWorkbook.Worksheets("Test") 
Debug.Print ws.Naame ' typo won't compile! 

natürlich ist es nicht , dass einfach, weil sogar früh-gebundene Schnittstellen ein COM-Flag haben können, dass sie "erweiterbar" sind. Excel.Application ist eine solche Schnittstelle:

Debug.Print Excel.Application.FooBarBazz ' compiles! 

Aber ich treibe.

Sie sagen "ohne Fehlerbehandlung" ... zählt das?

On Error Resume Next 
item.sendkeys "{ENTER}" 
'If Err.Number = 438 Then Debug.Print "Not supported!" 
On Error GoTo 0 
+0

Vielen Dank @ Mat Becher, für Ihre überkomplette, und direkte Antwort. Ich habe wenig von der Erklärung verstanden und werde auf diese Frage zurückkommen, um zu sehen, ob ich der Argumentation folgen kann, sobald ich eine breitere Basis und ein besseres Verständnis der Konzepte/Terminologie habe. Soweit ich weiß, zählt es nicht für "ohne Fehlerbehandlung", aber ich möchte Ihnen für den Beitrag danken, ich hatte das letzte "Nächste" nicht hinzugefügt, was ein Problem war, das mich dazu brachte, diese Frage zu stellen in erster Instanz. –

+1

@ a.t. Sie können sich "früh gebunden" als alles vorstellen, was auf eine Bibliothek verweist, auf die von Ihrem Projekt verwiesen wird (siehe Extras> Referenzen): Diese werden zur Kompilierungszeit aufgelöst. "spät gebunden" ist jeder Aufruf, der gegen ein "Objekt" oder "Variante/Objekt" ausgeführt wird - VBA löst das Element zur Laufzeit auf (und löst den Fehler 438 aus, wenn es nicht gefunden wird). –

+1

Vielen Dank für die Einführung, es führte mich zu einer ausführlicheren Erklärung der Laufzeit und kompilieren Zeitcode [hier.] (Https://stackoverflow.com/questions/846103/runtime-vs-compile-time#846421) –

Verwandte Themen