0
votes

Invite quand `ElementID` introuvable

J'ai un code VBA qui navigue via des pages Web en cliquant sur EMMENTID .

Lorsque le EMMENTID est trouvé, il fournit le résultat souhaité.

Mon problème est, il n'y a pas d'erreur invitée lorsque le ElementID n'est pas trouvé. Le code continue jusqu'à la fin.


Par exemple, le code: xxx

ici, j'essaie de cliquer sur le bouton BTK .

mais ce bouton n'est pas disponible sur la page Web.
Je m'attendais à ce que mon code s'écrase, mais cela continue jusqu'à la fin.
Aucune manipulation d'erreur utilisée dans le code.


3 commentaires

Vous aurez besoin de boucler à travers tous les objets sur le test et testez l'ID pour BTK . S'il est trouvé, cliquez dessus, sinon faites autre chose.


Pouvez-vous m'aider s'il vous plaît à affiner le code si nécessaire, que j'ai écrit en fonction de votre suggestion `` `sombre htmla en tant que mshtml.ihtmlelement sombre htmlas comme mshtml.ihtmlelementcollection pour chaque HTMLA dans htmlas si htmla.getattribute (" ID ") = "BTK" puis HTMLA.Cliquez sur EXITER POUR AUTRE SORTIE SUB SUB NEXT HTMLA `` `` `


C'est mieux si vous placez ce code dans la question actuelle. Il est très difficile de lire le code dans les commentaires. Cependant, on dirait que vous quittez le sous si l'identifiant ne correspond pas à "BTK". Cela échouera sûrement sur le premier élément si l'ID n'est pas "BTK". Il suffit de supprimer le Quitter Sous complètement.


3 Réponses :


2
votes

Aussi loin que j'ai compris, vous souhaitez vérifier si ElementID code> représentant le bouton BTK code> dans la page Web existe vraiment avant d'appeler l'événement de clic.

Un manière de faire cela consiste à créer un objet (je vais appeler le boutonnemement) et essayez de le régler sur le bouton avec ID BTK code> (Utilisation de getElementyID ("BTK") CODE>, si Il n'existe pas dans la page Web, l'objet ButtonElement code> sera rien code>, mais s'il existe, l'objet obtiendra une référence à ce bouton P>

Dim buttonElement As HtmlElement
Set buttonElement = Ie.document.getElementById("btk")
'
If Not (buttonElement Is Nothing) Then
    buttonElement.click
Else:
   '
   'Do something else, buttonElement with id btk not found
End If


5 commentaires

Je m'attendais à ce que VBA reprenne des erreurs de sa propre déclaration sans la déclaration IF.


Dire par exemple lorsque nous travaillons avec des feuilles de calcul. Si nous nous référons à une feuille de calcul non présente dans un classeur, VBA renvoie une erreur. Je m'attendais à ce que la même chose se produise lorsque mon code interagit avec des pages Web


@Anand se souvient qu'utilisant VBA pour contrôler IE, c'est comme une solution de contournement, si l'élément que vous cliquez sur rien et le VBA n'écrit pas une erreur ce n'est pas votre faute. Mais c'est toujours une bonne pratique Voir si l'élément est ou non rien (dans VBA La valeur par défaut de l'objet est rien et non null ). Utilisation de l'instruction si Vous pouvez déclencher un msgbox ou sur une erreur personnalisée.


De plus, peut-être que l'erreur n'est pas déclenchée car vous utilisez la méthode de clic pour l'élément. Dans les cas comme essayant de définir un texte sur un élément d'entrée, vous pouvez obtenir une erreur d'automatisation . Il est donc toujours recommandé de vérifier si la référence à l'élément n'est «rien» ou non avant d'appeler d'autres procédures


Je m'attendais à ce que VBA retourne une erreur à ce titre sans la déclaration IF - Ce n'est pas la manière dont il fonctionne dans ce cas. Travailler avec des objets de bibliothèque externes ne fonctionne pas toujours la même chose que de travailler avec le modèle d'objet d'Excel.



0
votes

Je suggère d'essayer de mettre à jour votre OS Windows et MS Office avec les dernières mises à jour pouvant vous aider à résoudre ce problème.

J'ai testé le problème avec le code simple sur Windows 10 OS avec MS Office 2016. p>

Je peux voir qu'il génère une erreur si le code ne trouve pas l'élément sur la page. p>

code testé: p>

Sub demo()

    Dim i As Long
    Dim URL As String
    Dim IE As Object
    
    Set IE = CreateObject("InternetExplorer.Application")
     
    IE.Visible = True
    
    URL = "http://localhost/86.html"
   
    IE.Navigate URL
  
    Do While IE.ReadyState = 4: DoEvents: Loop
    Do Until IE.ReadyState = 4: DoEvents: Loop
 
    IE.document.getElementById("abc").Click
    
    Set IE = Nothing
    
End Sub


0 commentaires

0
votes

Merci à @scott Holtzman, @Tdmsoares, @ Deepak-Msft pour répondre à ma requête.

Malheureusement, la mise à niveau de l'application et du système d'exploitation n'est pas dans mon contrôle, je n'ai donc pas choisi d'utiliser si des déclarations. P> Utilisation de l'instruction IF, j'ai soulevé une erreur personnalisée lorsque le bouton ne se trouve pas pour obtenir une erreur de temps d'exécution. P>

Lorsque je connais l'élémentable qui doit être cliqué, utilisé la méthode ci-dessous. P >

Dim htmla as mshtml.ihtmlelement
Dim htmlas as mshtml.ihtmlelementcollection

Signin= 0
For each htmla in htmlas
If htmla.getattribute(“classname”) = “hero_button" Anand htmla.innertext =”Sign in" then
signin= signin+1
Htmla.click
Exit for
Next htmla
If signin<>1 then
Err.raise vbObjectError +515,,” The sign in button was not found"
End if
```




3 commentaires

Merci d'avoir posté la solution à ce problème. Je vous suggère d'essayer de marquer votre propre réponse à cette question après 48 heures lorsqu'il est disponible pour marquer. Cela peut aider les autres membres de la communauté à l'avenir dans des types de problèmes similaires. Merci pour votre compréhension.


Comment puis-je marquer cela résolu ou répondu? Je ne vois pas les options pour le marquer


Il y aura une bonne icône de ticker à côté de votre réponse. Cliquez dessus pour le marquer comme une réponse. Voyez ici: imgur.com/a/7frculd