Resultat code différent selon emplacement d'un breakpoint vba

Fermé
jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020 - 20 mai 2020 à 18:21
 jeremayb - 2 juin 2020 à 10:56
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)

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:

6 réponses

yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
20 mai 2020 à 19:26
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?
0
jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020
22 mai 2020 à 10:45
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é.
0
yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
22 mai 2020 à 12:44
la fonction StartProcessing est-elle utile?
j'essaie de tester, quel est le symptôme quand cela ne marche pas?
0
jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020
22 mai 2020 à 12:51
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.
0
jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020
22 mai 2020 à 15:33
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
0
yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
22 mai 2020 à 16:18
tu ouvres, par VBA, un autre onglet dans IE? peux-tu montrer le code?
J'ai assez bien chipoté, sans trouver de solution, on dirait que la variable IE et ses attributs ne sont pas toujours correctement mis à jour. Ce qui confirme ton observation à propos des breakpoints.
0
jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020 > yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
25 mai 2020 à 10:50
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 :

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
0
jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020 > yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
25 mai 2020 à 10:51
Est ce que tu as une idée d'où ce problème de rafraichissement de variable peut provenir ?
0
yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476 > jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020
28 mai 2020 à 15:28
cela me fait penser à un bug...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020
28 mai 2020 à 14:08
Si quelqu'un a d'autres suggestions je suis preneur !
0
yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
28 mai 2020 à 15:37
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.
0
jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020 > yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
28 mai 2020 à 15:41
Merci beaucoup d'avoir pris de ton temps pour m'aider sur ce problème, je vais continuer a chercher de mon coté.
Malheureusement je n'ai jamais utilisé python, et je me dis que le problème doit provenir du site internet lui même non ? pas forcément du code en lui même
0
yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476 > jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020
28 mai 2020 à 15:46
Le comportement du site peut avoir une influence, mais je suis persuadé que le problème est dans le code de Microsoft, dans l'intégration entre IE et VBA.
0
jeremayb Messages postés 18 Date d'inscription lundi 13 avril 2020 Statut Membre Dernière intervention 26 juin 2020 > yg_be Messages postés 22727 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
28 mai 2020 à 15:51
Je vais essayer d'utiliser C++ pour parvenir a mes fins dans ce cas.
0
Update : De mon côté le problème est toujours présent, cependant sur les pc de deux de mes collègues le programme marche parfaitement… Ils ont la même config que moi et la même version de excel et d'interet explorer que moi
0