Resultat code différent selon emplacement d'un breakpoint vba
jeremayb
Messages postés
18
Statut
Membre
-
jeremayb -
jeremayb -
Bonjour à tous,
J'essaie de récupérer des données sur le site internet "http://www.hydro.eaufrance.fr/" via un code vba.
Le site en question à pour vocation de répertorier des données hydrologiques sur les cours d'eau français sur les dernières années. Des stations hydrologiques sont éparpillées le longs de cours d'eau français un peu partout dans le pays pour recueillir ces données. Sur le site, afin de s'y retrouver, on peut rechercher les données hydrologiques en rentrant par exemple un numéro de station comme critère de recherche.
Le but de mon code est, sachant le numéro de la station hydrologiques, d'atteindre ses données (sans les downloads) et d'en copier les données utiles sur ce fichier excel.
J'ai cependant un bug qui persiste..
Voici une partie de mon code pour bien comprendre cette erreur : (normalement fonctionnel si vous voulez le tester)

Si vous lancez la fonction Recupinternet, ce code il devrait vous emmener sur la page hydro.eaufrance.fr.
J'en viens à mon problème : dans la fonction Recupinternet, au niveau du "foreach objLien In IE.Document.Links ". Cette boucle teste chaque objet HTMLLinkElement de la page si leur nom est égal à "cocher". Si c'est le cas alors on clique dessus (ObjLien.Click ).
Je vous mets en lien une image du la page internet hydro france. La fleche rouge représente l'objLien sur lequel cliquer ("cocher").
Cette boucle fonctionne lorsque je mets un breakpoint juste au dessus et que je relance le code après (voir exemple de breakpoint dans le code). Elle check bien tout les objLien de la page. Vous suivez toujours ?
Cependant lorsque je ne mets pas de breakpoint, ou alors que j'en mets par exemple au niveau du "foreach objLien In IE.Document.Links", elle ne check pas tout les objLien de la page... En effet, elle teste les premiers (accueil et d'autres sans noms), zap certains du milieu ("tout décocher" et "cocher") <- celui dont j'ai besoin, et teste les derniers ("Aide", "Conditions d'utilisation"," ... ").
Si vous avez une réponse à me fournir je m'en ferais une joie ! Je n'ai trouvé des problèmes vaguement similaire uniquement sur des forums anglais sans trouver de réponse. C'est pourquoi je me tourne vers vous.
Je reste à votre disposition pour tout compléments d'informations,
merci d'avance !
J'essaie de récupérer des données sur le site internet "http://www.hydro.eaufrance.fr/" via un code vba.
Le site en question à pour vocation de répertorier des données hydrologiques sur les cours d'eau français sur les dernières années. Des stations hydrologiques sont éparpillées le longs de cours d'eau français un peu partout dans le pays pour recueillir ces données. Sur le site, afin de s'y retrouver, on peut rechercher les données hydrologiques en rentrant par exemple un numéro de station comme critère de recherche.
Le but de mon code est, sachant le numéro de la station hydrologiques, d'atteindre ses données (sans les downloads) et d'en copier les données utiles sur ce fichier excel.
J'ai cependant un bug qui persiste..
Voici une partie de mon code pour bien comprendre cette erreur : (normalement fonctionnel si vous voulez le tester)
Public IE As InternetExplorer
Sub Recupinternet()
' il faut cocher Microsoft HTML Object Library
' et Microsoft Internet Controls dans Outils - Références
Dim Annee_debut As String
Dim Annee_fin As String
Dim test As String
Dim codestation As String
codestation = InputBox("Inscrivez le code de la station dont vous voulez visualiser les données.", "Indispensable", "U2402010")
If codestation Like "*#######" Then
Else:
If MsgBox("Erreur: Format du code station incorrect, réessayez ?", vbYesNo, "Demande de confirmation") = vbYes Then
Call Recupinternet
Else: End
End If
End If
Set IE = CreateObject("InternetExplorer.Application") 'ouverture Internet Explorer
IE.Visible = True
Call StartProcessing
IE.navigate "http://www.hydro.eaufrance.fr/selection.php" 'si Laurent tu lis ça t'as plus qu'à appeler Fabien pour qu'il t'explique
Do Until IE.readyState = READYSTATE_COMPLETE
DoEvents
Loop 'attend la fin du chargement
Do While IE.Document.readyState <> "complete"
DoEvents
Loop 'attend la fin du chargement du document
Dim IECtrl As HTMLFormElement
Set IECtrl = IE.Document.forms(0).code_station
IECtrl.Value = codestation
IE.Document.forms(0).cours_d_eau.Value = "" 'Permet de remplir le formulaire de recherche de station
IE.Document.forms(0).commune.Value = ""
IE.Document.forms(0).departement.Value = "Tous"
IE.Document.forms(0).bassin_hydrographique.Value = "Tous"
IE.Document.all("station_en_service").Checked = True
IE.Document.all("station_hors_service").Checked = True
Button ("Nouvelle Recherche") 'Lance la recherche
Dim ObjLien As HTMLLinkElement 'Sélectionne la station
For Each ObjLien In IE.Document.Links 'pour chaque lien de la page active
test = ObjLien.innerText
If test = "cocher" Then
ObjLien.Click 'clique sur le lien
Exit For
End If
Next
Call LoadPage
Button ("Visualiser") 'Lance de la visualisation de la station choisie
Button ("QJM") 'Affichage des débits journaliers
If Mid(IE.Document.DocumentElement.innerText, 1, 39) = "HYDRO - erreur Aucune donnée disponible" Then
MsgBox "Il n'y a aucune donnée disponible sur cette station", vbCritical, "Loghydro"
USF_internet.PRG_internet.Visible = False
USF_internet.LBL_progress.Visible = False
USF_internet.CMD_IE.Visible = False
IE.Quit
Exit Sub
End If
End sub
Public Function Button(Caption As String) As Boolean
' Clicks the button containing text Caption or returns false if button cannot be found
Dim Element As HTMLButtonElement
Button = True
For Each Element In IE.Document.getElementsByTagName("Input")
If InStr(Element.Value, Caption) > 0 Then
Call Element.Click
Call LoadPage
Exit Function
End If
Next Element
Button = False
End Function
Sub LoadPage()
' Pauses execution until the browser window has finished loading
Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
'If optActiveX Then ' close any activex popup notifications
'PostMessage FindWindow(”#32770?, “Microsoft Internet Explorer”), &H10, 0&, 0&
'End If
DoEvents
Loop
End Sub
Si vous lancez la fonction Recupinternet, ce code il devrait vous emmener sur la page hydro.eaufrance.fr.
J'en viens à mon problème : dans la fonction Recupinternet, au niveau du "foreach objLien In IE.Document.Links ". Cette boucle teste chaque objet HTMLLinkElement de la page si leur nom est égal à "cocher". Si c'est le cas alors on clique dessus (ObjLien.Click ).
Je vous mets en lien une image du la page internet hydro france. La fleche rouge représente l'objLien sur lequel cliquer ("cocher").
Cette boucle fonctionne lorsque je mets un breakpoint juste au dessus et que je relance le code après (voir exemple de breakpoint dans le code). Elle check bien tout les objLien de la page. Vous suivez toujours ?
Cependant lorsque je ne mets pas de breakpoint, ou alors que j'en mets par exemple au niveau du "foreach objLien In IE.Document.Links", elle ne check pas tout les objLien de la page... En effet, elle teste les premiers (accueil et d'autres sans noms), zap certains du milieu ("tout décocher" et "cocher") <- celui dont j'ai besoin, et teste les derniers ("Aide", "Conditions d'utilisation"," ... ").
Si vous avez une réponse à me fournir je m'en ferais une joie ! Je n'ai trouvé des problèmes vaguement similaire uniquement sur des forums anglais sans trouver de réponse. C'est pourquoi je me tourne vers vous.
Je reste à votre disposition pour tout compléments d'informations,
merci d'avance !
A voir également:
- Resultat code différent selon emplacement d'un breakpoint vba
- Code ascii - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
6 réponses
yg_be
Messages postés
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 585
bonjour, ce serait plus clair si tu indiquait les numéros de lignes où tu mets les breakpoint.
que veux-tu dire par "voir exemple de breakpoint dans le code"?
que se passe-t'il si tu ajoutes une attente d'une minute dans le code entre les lignes 44 et 48?
je suis étonné que, entre les lignes 44 et 48, tu n'attendes pas que la page soit chargée. est-ce intentionnel?
que veux-tu dire par "voir exemple de breakpoint dans le code"?
que se passe-t'il si tu ajoutes une attente d'une minute dans le code entre les lignes 44 et 48?
je suis étonné que, entre les lignes 44 et 48, tu n'attendes pas que la page soit chargée. est-ce intentionnel?
Bonjour, Merci de ta réponse !
Quand je disais voir exemple dans le code, c'est que je pensais avoir mis en commentaire a la ligne ou je mettais les breakpoint une indication type "ici breakpoint quand ca fonctionne" mais j'ai du oublié désolé !
Je mets le breakpoint pour que mon code se déroule correctement en ligne 44 ou plus haut. Quand je n'en mets pas ou que j'en mets en ligne 48 par exemple, la boucle foreach ne check plus tout les objLien de la page comme elle devrait le faire…
J'ai déjà essayé de mettre un wait, mais ca ne change rien au problème… J'ai également essayé de mettre manuellement dans le code un stop et de le reprendre à la main, ou de mettre un msgbox pour faire office de "breakpoint" dans le code mais aucune de ces options ne fonctionne.
Pour répondre a ta question entre les ligne 44 et 48, dans la fonction button, la fonction loadpage est appelé qui elle sert a attendre que la page soit chargé.
Quand je disais voir exemple dans le code, c'est que je pensais avoir mis en commentaire a la ligne ou je mettais les breakpoint une indication type "ici breakpoint quand ca fonctionne" mais j'ai du oublié désolé !
Je mets le breakpoint pour que mon code se déroule correctement en ligne 44 ou plus haut. Quand je n'en mets pas ou que j'en mets en ligne 48 par exemple, la boucle foreach ne check plus tout les objLien de la page comme elle devrait le faire…
J'ai déjà essayé de mettre un wait, mais ca ne change rien au problème… J'ai également essayé de mettre manuellement dans le code un stop et de le reprendre à la main, ou de mettre un msgbox pour faire office de "breakpoint" dans le code mais aucune de ces options ne fonctionne.
Pour répondre a ta question entre les ligne 44 et 48, dans la fonction button, la fonction loadpage est appelé qui elle sert a attendre que la page soit chargé.
Non aucune importance, j'ai juste oublié de l'enlever my bad
Le symptôme est que la checkbox avec le code U2402010 ne se coche pas, autrement dit le programme ne clique pas sur l'objLien "cocher" juste au dessus.
Le symptôme est que la checkbox avec le code U2402010 ne se coche pas, autrement dit le programme ne clique pas sur l'objLien "cocher" juste au dessus.
Update : Il se trouve que lorsque j'ouvre une deuxième page IE, le problème disparait. J'ai juste à l'ouvrir puis a la fermer juste après et ca contourne le problème… Toujours dans l'incompréhension si quelqu'un a une explication je suis preneur mais du coup problème résolu apparement
Alors ça marchait bien vendredi dernier en ouvrant une deuxième fenêtre IE, mais ce matin ca ne veut plus rien savoir...
Voici mon code :
Voici mon code :
Public IE As InternetExplorer
Sub Recupinternet()
' il faut cocher Microsoft HTML Object Library
' et Microsoft Internet Controls dans Outils - R?f?rences
Dim Annee_debut As String
Dim Annee_fin As String
Dim test As String
Dim codestation As String
codestation = InputBox("Inscrivez le code de la station dont vous voulez visualiser les donn?es.", "Indispensable", "U1084010") 'U1084010 U2402010
If codestation Like "*#######" Then
Else:
If MsgBox("Erreur: Format du code station incorrect, r?essayez ?", vbYesNo, "Demande de confirmation") = vbYes Then
Call Recupinternet
Else: End
End If
End If
Set IE = CreateObject("InternetExplorer.Application") 'ouverture Internet Explorer
Set IE2 = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate "http://www.hydro.eaufrance.fr/selection.php"
IE2.Quit
Do Until IE.readyState = READYSTATE_COMPLETE
DoEvents
Loop 'attend la fin du chargement
Do While IE.Document.readyState <> "complete"
DoEvents
Loop 'attend la fin du chargement du document
Dim IECtrl As HTMLFormElement
Set IECtrl = IE.Document.forms(0).code_station
IECtrl.Value = codestation
IE.Document.forms(0).cours_d_eau.Value = "" 'Permet de remplir le formulaire de recherche de station
IE.Document.forms(0).commune.Value = ""
IE.Document.forms(0).departement.Value = "Tous"
IE.Document.forms(0).bassin_hydrographique.Value = "Tous"
IE.Document.all("station_en_service").Checked = True
IE.Document.all("station_hors_service").Checked = True
Button ("Nouvelle Recherche") 'Lance la recherche
Dim ObjLien As HTMLLinkElement 'S?lectionne la station
For Each ObjLien In IE.Document.Links 'pour chaque lien de la page active
test = ObjLien.innerText
If test = "cocher" Then
ObjLien.Click 'clique sur le lien
Exit For
End If
Next
Call LoadPage
Button ("Visualiser") 'Lance de la visualisation de la station choisie
Button ("QJM") 'Affichage des d?bits journaliers
If Mid(IE.Document.DocumentElement.innerText, 1, 39) = "HYDRO - erreur Aucune donn?e disponible" Then
MsgBox "Il n'y a aucune donn?e disponible sur cette station", vbCritical, "Loghydro"
USF_internet.PRG_internet.Visible = False
USF_internet.LBL_progress.Visible = False
USF_internet.CMD_IE.Visible = False
IE.Quit
Exit Sub
End If
end sub
Public Function Button(Caption As String) As Boolean
' Clicks the button containing text Caption or returns false if button cannot be found
Dim Element As HTMLButtonElement
Dim test As String
Button = True
For Each Element In IE.Document.getElementsByTagName("Input")
test = Element.Value
If InStr(Element.Value, Caption) > 0 Then
Element.Click
Call LoadPage
Exit Function
End If
Next Element
Button = False
End Function
Sub LoadPage()
' Pauses execution until the browser window has finished loading
Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
'If optActiveX Then ' close any activex popup notifications
'PostMessage FindWindow(?#32770?, ?Microsoft Internet Explorer?), &H10, 0&, 0&
'End If
DoEvents
Loop
End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
après avoir essayé de comprendre et contourner le problème, sans succès, j'ai commencé à regarder comment faire autrement, sans passer via un navigateur.
c'est relativement plus compliqué, parce que, quand on veut envoyer des informations vers le site, au lieu de cliquer sur la page, il faut remplir les informations que le navigateur envoie au site (telle qu'on peut le voir dans la console d'un navigateur tel que chrome).
Je n'ai pas réellement essayé, et je ne peux que supposer que cela ne tomberait pas sur le même problème.
en écrivant, je me dis que cela fonctionnerait sans doute mieux avec python, par exemple.
c'est relativement plus compliqué, parce que, quand on veut envoyer des informations vers le site, au lieu de cliquer sur la page, il faut remplir les informations que le navigateur envoie au site (telle qu'on peut le voir dans la console d'un navigateur tel que chrome).
Je n'ai pas réellement essayé, et je ne peux que supposer que cela ne tomberait pas sur le même problème.
en écrivant, je me dis que cela fonctionnerait sans doute mieux avec python, par exemple.