J'ai un code VBA qui navigue via des pages Web en cliquant sur Lorsque le Mon problème est, il n'y a pas d'erreur invitée lorsque le Par exemple, le code: p> ici, j'essaie de cliquer sur le bouton mais ce bouton n'est pas disponible sur la page Web. EMMENTID code>.
EMMENTID code> est trouvé, il fournit le résultat souhaité. P>
ElementID code> n'est pas trouvé. Le code continue jusqu'à la fin. P>
BTK code>. p>
Je m'attendais à ce que mon code s'écrase, mais cela continue jusqu'à la fin.
Aucune manipulation d'erreur utilisée dans le code. P> p>
3 Réponses :
Aussi loin que j'ai compris, vous souhaitez vérifier si 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 ElementID code> représentant le bouton
BTK code> dans la page Web existe vraiment avant d'appeler l'événement de clic.
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
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 code> 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 code> (dans VBA La valeur par défaut de l'objet est
rien code> et non
null code>). Utilisation de l'instruction
si code> Vous pouvez déclencher un
msgbox code> 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 code>. 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 code> - 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.
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
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 ```
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
Vous aurez besoin de boucler à travers tous les objets sur le test et testez l'ID pour
BTK code>. 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 code> complètement.