2017-09-26 4 views
3

Est-il possible de vérifier si un objet supporte une certaine méthode sans gestionnaire d'erreur dans VBA?Comment vérifier si l'objet supporte la méthode dans vba?

J'ai trouvé de nombreux doublons posant la question pour par exemple JavaScript et Symphony2, mais pas encore en VBA.

Je voudrais utiliser une commande .sendkeys "{ENTER}" à un élément de classe ie.document et apprendre à vérifier si l'objet prend en charge une méthode me permet d'écrire du code plus propre à long terme.

exemple de code:

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

Répondre

3

Court de regarder la documentation de l'API que vous utilisez, vous ne pouvez pas.

Au moins pas sur le code lié en retard. Par définition, le code tardif lié est résolu à l'exécution, ce qui signifie que vous avez aucun moyen de compilation de valider si un membre sera disponible sur l'interface de cet objet - c'est pourquoi ce code compile:

Option Explicit 

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

Ou cela un peu plus réaliste un:

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

La seule façon de savoir avant l'exécution si un membre est pris en charge, est d'utiliser les appels à liaison précoce:

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

Bien sûr, il est pas que simple, car même les interfaces à liaison anticipée peuvent avoir un drapeau COM disant qu'ils sont "extensibles". Excel.Application est une telle interface:

Debug.Print Excel.Application.FooBarBazz ' compiles! 

Mais je dérive.

Vous dites "sans erreur" ... cela compte-t-il?

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

Merci beaucoup @ Mug Mug, pour votre réponse incomplète, et directe. J'ai peu compris l'explication, et je reviendrai à cette question pour voir si je peux suivre l'argumentation une fois que j'aurai une base et une compréhension plus larges des concepts/terminologie. Pour autant que je sache, ça ne compte pas pour "sans erreur de manipulation", mais je voudrais vous remercier pour la contribution, je n'avais pas ajouté le dernier 'Next', qui était un problème qui m'a amené à poser cette question en première instance. –

+1

@ a.t. vous pouvez penser à "early-bound" comme tout ce qui fait référence à une bibliothèque référencée par votre projet (voir Outils> Références): elles sont résolues au moment de la compilation. "late-bound" est un appel fait contre un 'Object' ou' Variant/Object' - VBA résout le membre à l'exécution (et renvoie l'erreur 438 s'il ne le trouve pas). –

+1

Merci pour l'introduction, il m'a conduit à une explication plus élaborée sur l'exécution et le code temporel de compilation [ici.] (Https://stackoverflow.com/questions/846103/runtime-vs-compile-time#846421) –