IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comment boucler sur les tableaux page web


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 50
    Points
    50
    Par défaut Comment boucler sur les tableaux page web
    Bonsoir,
    pour les besoin d'extrairaction des données sur une page web via excel, je souhaiterai savoir comment faire pour boucler sur plusieurs tableaux contenu dans une page web et choisir d'extraire mes données dans celui que je veux (la seule différence est le texte placé dans la première colonne ligne 1)
    Merci par avance
    ACtuellement j'itulise ce code qui marche bien, mais dès que le nombre de tableaux change, les données récupérées sont fausses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim maTable As IHTMLTable
    Dim Htable As IHTMLElementCollection
     
    Set IEDoc = IE.document
    'objet type table
    Set Htable = IEDoc.getElementsByTagName("table")
    '6eme tableau dans la page Web
    Set maTable = Htable(10)
     
    'Range("B" & z).Value = maTable.Rows(0).Cells(1).innerText
    Range("B" & z).Value = maTable.Rows(1).Cells(3).innerText
    Range("C" & z).Value = maTable.Rows(1).Cells(5).innerText
    Range("D" & z).Value = maTable.Rows(1).Cells(6).innerText

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 203
    Points : 175
    Points
    175
    Par défaut
    Bonjour,
    As-tu essayé la propriété Count pour faire une boucle sur les tableaux?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i=1 to Htable.Count
     Range(...)
    Next i

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 50
    Points
    50
    Par défaut
    Bonjour Didier, le forum
    J ai essayé avec count mais la propriété n est pas gérée par ce type d objet. Après quelques recherches j ai essayé avec lenght mais sans succès non plus.
    Je posterai le nouveau code une fois que je suis au bureau.
    Merci

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 50
    Points
    50
    Par défaut
    Bonjour,
    Voici le code modifié qui ne marche pas bien. Le but c'est d'arriver à faire une boucle sur toutes les tables et toutes les lignes de la page web pour retourver une donnée.
    Merci par avance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Dim maTable As IHTMLTable
    Dim Htable As IHTMLElementCollection
     
     
    Set IEDoc = IE.document
    'objet type table
    Set Htable = IEDoc.getElementsByTagName("table")
    '6eme tableau dans la page Web
    Set maTable = Htable(k)
    For k = 1 To Htable.Length - 1
    'boucle sur toutes les lignes du tableau
        For i = 1 To maTable.Rows.Length - 1
    'boucle sur les cellules dans chaque ligne
            For j = 1 To maTable.Rows(i).Cells.Length - 1
    '3eme cellule dans la 1ere ligne
    'Range("B" & z).Value = maTable.Rows(0).Cells(1).innerText
    Range("B" & z).Value = maTable.innerText
    Range("C" & z).Value = maTable.innerText
    Range("D" & z).Value = maTable.innerText
      Next j
      Next i
    Next k

  5. #5
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par Maxgad Voir le message
    Voici le code modifié qui ne marche pas bien.
    Bonjour,

    Avec ce genre de phrase tu as peu de chance de recevoir des réponses.

    Doit-on deviner ce qui ne "marche pas bien"?

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 50
    Points
    50
    Par défaut
    Bonjour Alain,
    J'ai finalement réussi à obtenir le résultat escompté en creusant un peu.
    Maintenant je suis confronter a un autre probleme, j'utilise jusqu'a present le code pour attendre le chargement de la page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Do Until IEDoc.readyState = "complete"
          DoEvents
        Loop
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Do
          DoEvents
      Loop Until ie.readyState = READYSTATE_COMPLETE And Not ie.Busy
    Le probleme c'est que ca ne marche pas à tous les coups !! quand je click sur un lien pour ouvrir une page, le programme n'attend pas le chargement de la page !, il passe directement à l'étape suivante .
    Une idée ? merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sheets("Feuil1").Select
    derligne = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row
     
    For z = 2 To derligne
        monisin = Sheets("feuil1").Range("A" & z).Value
            'On pointe le membre Document
     
    ' Sleep (5000)
             Set IEDoc = IE.document
         'On pointe notre Zone de texte
             Set helem = IEDoc.getElementById("go")
                helem.Value = Sheets("feuil1").Range("A" & z).Value
     
        'On définit le texte que l'on souhaite placer à l'intérieur
     
             Set IEDoc = IE.document
             Set helem = IEDoc.getElementById("go-submit")
                helem.Click
     
     
    Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    DoEvents
    Loop

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Tu as inversé les 2 actions.

    Il faut d'abord attendre que IE ait chargé la page.

    Ensuite, seulement, tu peux assigner le document à ton objet IEDoc.
    Et, bien sûr, attendre que le readyState de ce document soit "complete".

    Ce n'est qu'après ça que tu peux utiliser les elements du document.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 50
    Points
    50
    Par défaut
    Bonjour Alain,
    Merci bcp, ta méthode fonctionne bien, mais au moment de faire ma deuxieme recherche le readystate n'est plus pris en compte, il passe sans attendre le chargement complet de la page. c'est frustrant, parce que le code fonctionne bien en mode pas à pas mais pas en auto !
    du coup j'ai mis des ready state partout mais sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    Sub récup_cours_reuter()
    Application.ScreenUpdating = True
    'On Error Resume Next
     Dim IE As InternetExplorer
     Dim IEDoc As HTMLDocument
     Dim InputboursoramaZoneTexte As HTMLInputElement
     Dim FormboursoramaCherche  As DispHTMLElementCollection
     Dim htmlProfil As HTMLGenericElement
     Dim Element As IHTMLElementCollection
     Dim Cotation As HTMLSpanElement
     Dim htmlSelectElem As HTMLSelectElement
     Dim htmlGeneric As HTMLGenericElement
     Dim cours As HTMLGenericElement
     Dim DOCelement As Object
     
     'Initialisation des variables
        Set IE = CreateObject("InternetExplorer.Application")
     
    Application.DisplayAlerts = False
    'Chargement d'une page Web
    IE.navigate "https://monsite.fr"
     'On attend le chargement complet de la page
       Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    DoEvents
    Loop
     'Affichage de la fenêtre IE
     IE.Visible = True
     ''''''''''''''''''''''''saisie login et mp
         Set IEDoc = IE.document
        On Error GoTo A
        'login
         Set DOCelement = IEDoc.getElementsByName("UserId").Item
         DOCelement.Value = "721232"
     
        'password
         Set DOCelement = IEDoc.getElementsByName("Password").Item
         DOCelement.Value = "NP042311"
         DOCelement.Select
     
        'connexion
         Set DOCelement = IEDoc.forms(0)
         DOCelement.submit
     
        Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    DoEvents
    Loop
     
        Do Until IEDoc.readyState = "complete"
          DoEvents
        Loop
    ''''''''''''''''''''''''''''''''''''''''''
    A:
    Sheets("Feuil1").Select
    derligne = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row
     
    For z = 2 To derligne
        monisin = Sheets("feuil1").Range("A" & z).Value
            'On pointe le membre Document
     
    ' Sleep (5000)
             Set IEDoc = IE.document
         'On pointe notre Zone de texte
             Set helem = IEDoc.getElementById("go")
                helem.Value = Sheets("feuil1").Range("A" & z).Value
     
     
             Set IEDoc = IE.document
             Set helem = IEDoc.getElementById("go-submit")
                helem.Click
     
        Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    DoEvents
    Loop
     
        Do Until IEDoc.readyState = "complete"
          DoEvents
        Loop
    'Application.Wait (Now + TimeValue("0:00:05"))
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim maTable As IHTMLTable
    Dim Htable As IHTMLElementCollection
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'boucle pour trouver le code isin et cliquer dessus
    Dim lienFtid As HTMLLinkElement
       'On pointe le document
           Set IEDoc = IE.document
          For i = 0 To IEDoc.Links.Length - 1
          'On pointe notre lien
          'Set lienFtid = IEDoc.anchors(2)
          'On Error Resume Next
                 Set IEDoc = IE.document
             Set lienFtid = IEDoc.Links(i)
                    If IEDoc.Links(i).innerText = monisin Then
          'On exécute le lien
                        IEDoc.Links(i).Click
            ' Set IEDoc = IE.document
        'On attend le chargement complet de la page
        Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    DoEvents
    Loop
     
        'Set IEDoc = IE.document
        Do Until IEDoc.readyState = "complete"
          DoEvents
        Loop
     
         Exit For
            End If
        Next i
    Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    DoEvents
    Loop
     
        'Set IEDoc = IE.document
        Do Until IEDoc.readyState = "complete"
          DoEvents
        Loop
    'Application.Wait (Now + TimeValue("0:00:03"))
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'boucle pour trouver le price history et cliquer dessus
    Set IEDoc = IE.document
    Dim lienFtid2 As HTMLLinkElement
       'On pointe le document
                Set IEDoc = IE.document
        For u = 0 To IEDoc.Links.Length - 1
          'On pointe notre lien
          'Set lienFtid = IEDoc.anchors(2)
         ' On Error Resume Next
                Set IEDoc = IE.document
                Set lienFtid2 = IEDoc.Links(u)
            If IEDoc.Links(u).innerText = "Price History" Then
          'On exécute le lien
            IEDoc.Links(u).Click
        Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    DoEvents
    Loop
     
        'Set IEDoc = IE.document
        Do Until IEDoc.readyState = "complete"
          DoEvents
        Loop
    Exit For
            End If
        Next u
    Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    DoEvents
    Loop
     
        'Set IEDoc = IE.document
        Do Until IEDoc.readyState = "complete"
          DoEvents
        Loop
    IE.document.parentWindow.history.back
    IE.document.parentWindow.history.back
    Next z
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
    IE.Quit
      'On libère les variables
      Set IE = Nothing
     Set IEDoc = Nothing
     Set IE = Nothing
     Set IEDoc = Nothing
     Application.ScreenUpdating = True
    End Sub

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu
    bonjour
    j'ai eu a faire au meme probleme lorsque que l'on a un mdp et un login a inscrire sur une page

    pour palier au probleme j'ai utilisé l api "sleep" en 2 eme passe(apres le login et mdp) a la place de "readystate complete"

    au plaisir

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 50
    Points
    50
    Par défaut
    Bonsoir patrick et alain
    J'avais deja essayé de mettre Application.Wait (Now + TimeValue("0:00:04")). c'est vrai que ca resout le probleme mais je pensais trouver une autre atuce.

    Merci pour votre contribution

    Est ce qu'il ya possibilité de désactiver les alertes pop up internet (un peu comme application.displayalerte=false en vba). En gros, quand je fais ma recherche sur internet, et quand le code saisi n'existe pas il ya un message internet qui apparaît (en pop up), ce qui me stop mon programme tant que le message n'est pas validé.
    Ya -t-il moyen de desactiver ce type de messages ?
    Merci encore

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    encore un truc tout simple
    l'instruction "sendkeys"

    explication:
    quand le message apparaît tu a des boutons valider,annuler ,ect.....

    et bien c'est tout simple

    tu repère le bouton qui a le focus a chaque fois que le message apparaît
    et tu simule les touche droite,gauche,et enter avec sendkeys pour sélectionner le bon bouton et valider ton choix


    au plaisir

  12. #12
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour Maxgad,

    Je trouve ton code extrèment difficile à lire du fait de l'indentation fantaisiste.
    Et s'il l'est pour moi, je pense que ce doit l'être encore plus pour toi.

    Je constate, ligne 102, que tu as commenté l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set IEDoc = IE.document
    Or, tu as changé de page. Donc il faut redéfinir IEDoc.

    Je vois aussi que, après la ligne 73, tu as oublié le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set IEDoc = IE.document
    Par contre, tu le redéfinis à d'autres endroits où c'est inutile.

    Reprends toutes tes actions dans ton code et vérifie où tu changes de page.
    Chaque changement de page doit être suivi de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Do Until IE.readyState = READYSTATE_COMPLETE
      DoEvents
    Loop
     
    Set IEDoc = IE.document
     
    Do Until IEDoc.readyState = "complete"
      DoEvents
    Loop

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour

    j'ai regarder un peu ton code je l'ai netoyé un peu
    mais tu t'en doute je ne peu pas le tester n'ayant pas le lien initial
    je pense que l'on peu l'optimiser
    regarde dans le code j'ai posé des questions (en vert)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    Sub récup_cours_reuter()
        Application.DisplayAlerts = False
        Application.ScreenUpdating = True
        'On Error Resume Next
        Dim ie As InternetExplorer, IEDoc As HTMLDocument, InputboursoramaZoneTexte As HTMLInputElement, FormboursoramaCherche As DispHTMLElementCollection
        Dim htmlProfil As HTMLGenericElement, Element As IHTMLElementCollection, Cotation As HTMLSpanElement
        Dim htmlSelectElem As HTMLSelectElement, htmlGeneric As HTMLGenericElement, cours As HTMLGenericElement
        Dim DOCelement As HTMLGenericElement, validation As HTMLGenericElement, maTable As IHTMLTable
        Dim Htable As IHTMLElementCollection, lienFtid As HTMLLinkElement, lienFtid2 As HTMLLinkElement
        'Initialisation des variables
        Set ie = CreateObject("InternetExplorer.Application")
     
        'Chargement d'une page Web
        ie.navigate "https://monsite.fr"
        'On attend le chargement complet de la page
        WAITIE ie
        'Affichage de la fenêtre IE en visible
        ie.Visible = True
        'iedoc deviens le document
        Set IEDoc = ie.document
        On Error GoTo A
        ''''''''''''''''''''''''saisie login et mp
        Set DOCelement = IEDoc.getElementsByName("UserId").Item
        DOCelement.Value = "721232"
        '''''''''''''''''''''''''''saisie de MDP
        Set DOCelement = IEDoc.getElementsByName("Password").Item
        DOCelement.Value = "NP042311"
        DOCelement.Select
        ''''''''''''''''''''''''validation
        Set validation = IEDoc.forms(0)
        validation.submit
        WAITIE ie
     
        'a partir d'ici tu ne devrait plus etre sur la meme page il me semble il te faut redeterminer la page sur la quelle tu es
    A:
        Set IEDoc = ie.document
        With Sheets("Feuil1")
            derligne = .Range("A" & Rows.Count).End(xlUp).Row
            For Z = 2 To derligne
                monisin = .Range("A" & Z).Value
                'On pointe notre Zone de texte
                Set helem = IEDoc.getElementById("go")
                helem.Value =.Range("A" & Z).Value
                'es tu obligé de cliquer a chaque remplissage de tes "GO"??????????????
                Set helem = IEDoc.getElementById("go-submit")
                helem.Click
                WAITIE ie
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                'boucle pour trouver le code isin et cliquer dessus
     
                'On pointe le document
                Set IEDoc = ie.document
                For i = 0 To IEDoc.Links.Length - 1
                    'On pointe notre lien
                    'Set lienFtid = IEDoc.anchors(2)
                    'On Error Resume Next
     
                    Set lienFtid = IEDoc.Links(i)
                    If IEDoc.Links(i).innerText = monisin Then
                        'On exécute le lien
                        IEDoc.Links(i).Click
                        'On attend le chargement complet de la page
    'QUESTION: ici on es censé attendre quoi,le changement de la page ou un rafraichissement??????????
    'parceque au quel cas ca change tout on peu supprimer une boucle si c'est un simple rafraichossement de la page??????????
                        WAITIE ie
                        Exit For
                    End If
                Next i
                'les liens(moisin et "price history" ne sont til pas sur la meme page
                'au quel cas pas la peine de faire 2 boucles
                'boucle pour trouver le price history et cliquer dessus
                Set IEDoc = ie.document
                'On pointe le document
               For u = 0 To IEDoc.Links.Length - 1
                    'On pointe notre lien
                    'Set lienFtid = IEDoc.anchors(2)
                    ' On Error Resume Next
     
                    Set lienFtid2 = IEDoc.Links(u)
                    If IEDoc.Links(u).innerText = "Price History" Then
                        'On exécute le lien
                        IEDoc.Links(u).Click
                        '"""""""""""""""
                        WAITIE ie
                        Exit For
                    End If
                Next u
                ie.document.parentWindow.history.back
                ie.document.parentWindow.history.back
            Next Z
        End With
        ie.Quit
        'On libère les variables
        Set ie = Nothing
        Set IEDoc = Nothing
        Set ie = Nothing
        Set IEDoc = Nothing
        Application.ScreenUpdating = True' a quoi ca te sert ca puisque tu fait que recuperer les moisin dans les cellule de ton sheets (1)???????
    End Sub
     
    'plutot que faire des repetions dans ton code et afin d'avoir un peu plus de _ clarté j'en ai fait une fonction generique tu avais ca dans le tutoriel  de qwazerty 
    Function WAITIE(ie)
        Do While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE
            DoEvents
        Loop
    End Function
    au plaisir

  14. #14
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Patrick,

    N'oublie pas le readyState du doc.
    C'est bien souvent là-dessus que buttent les tentatives de pilotage d'IE.

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour Alain tech


    la fonction "Wait ie" devrait palier a ce problème normalement par le ready state complete

    cela dit les Questions que j'ai posé dans le code sont importantes a mon avis

    car si j'ai bien compris il y a un bon nombre de pages a ouvrir

    mais il est vrai comme je l'ai dit dans une précédente reponse j'ai eu recours a l'api sleep car meme avec la fonction wait ,il arrivait que ca bug (problème mémoire je suppose )sachant qu'il y a quand meme un "doevents " dans la fonction ce qui indique que d'autre fonctions ou subs peuvent tourner

    enfin attendons les reponse a mes question on verra bien

  16. #16
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour Patrick,

    Ta Sub WaitIE attend seulement qu'Internet Explorer ait terminé.

    Mais il peut arriver que le Document mette du temps à s'afficher.

    Je parle d'expérience...

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour alaintech

    dans ce cas la c'est peut être ca qui m'oblige de tant en tans pour certaine pages a me servir de l'api "sleep" j'ignorais meme l'existence de la gestion du ready du document de la meme manière que le ready de l'instance de IE

    on en apprend tout les jour

    au plaisir

  18. #18
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 50
    Points
    50
    Par défaut
    Bonsoir Alain et Patrick,
    Merci encore pour votre aide.
    désolé. j'ai été tres occupé ces derniers temps.
    Je vais tester çà et je vous reviens.
    Merci.

  19. #19
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 50
    Points
    50
    Par défaut
    Bonsoir,
    Merci pour ton "nettoyage" de code, c'est vrai que c'est plus lisible
    Même avec la méthode ready du document je suis obligé de mettre Application.Wait (Now + TimeValue("0:00:02"))
    C'est n'est pas le plus gênant en sois. j'ai un problème lors de la saisi d'un code qui n'existe pas, le site en question me renvoi une erreur sous forme de msgbox POP UP que je dois valider avec sendkeys. Le problème c'est que le sendkeys je l'ai placé à l'interieur de la boucle wait, mais des fois la boucle tourne sans fin. Comment je peux dire à ma boucle que si au bout de 7 secondes le Ie.doc n'est pas en ready complete donc tu sors de la boucle et passer à l étape suivante, parce que c'est a cause de la fenetre pop up qui apparaît qui bloque le process.
    Merci. j’espère que j'ai été assez précis.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    Sub récup_cours_reuter()
        Application.DisplayAlerts = False
        Application.ScreenUpdating = True
        On Error Resume Next
        Dim ie As InternetExplorer, IEDoc As HTMLDocument, InputboursoramaZoneTexte As HTMLInputElement, FormboursoramaCherche As DispHTMLElementCollection
        Dim htmlProfil As HTMLGenericElement, Element As IHTMLElementCollection, Element2 As IHTMLElementCollection, Cotation As HTMLSpanElement
        Dim htmlSelectElem As HTMLSelectElement, htmlGeneric As HTMLGenericElement, cours As HTMLGenericElement
        Dim DOCelement As HTMLGenericElement, validation As HTMLGenericElement, maTable As IHTMLTable
        Dim Htable As IHTMLElementCollection, lienFtid As HTMLLinkElement, lienFtid2 As HTMLLinkElement
        'Initialisation des variables
     
         FindAndTerminate "IExplore.exe"
     
        Set ie = CreateObject("InternetExplorer.Application")
     
        'Chargement d'une page Web
        ie.navigate "https://monsite.fr"
        'On attend le chargement complet de la page
        WAITIE1 ie
     
        'Affichage de la fenêtre IE en visible
        ie.Visible = True
        On Error GoTo A
         'iedoc deviens le document
        Set IEDoc = ie.document
        ''''''''''''''''''''''''saisie login et mp
        Set DOCelement = IEDoc.getElementsByName("UserId").Item
        DOCelement.Value = "******"
        '''''''''''''''''''''''''''saisie de MDP
        Set DOCelement = IEDoc.getElementsByName("Password").Item
        DOCelement.Value = "*****"
        DOCelement.Select
        ''''''''''''''''''''''''validation
        Set validation = IEDoc.forms(0)
        validation.submit
     
        Application.Wait (Now + TimeValue("0:00:02"))
     
     
        WAITIE1 ie
     
    A:
     
        With Sheets("Feuil1")
            derligne = .Range("A" & Rows.Count).End(xlUp).Row
            For z = 2 To derligne
                monisin = .Range("A" & z).Value
                Set IEDoc = ie.document
                'On pointe notre Zone de texte
                Set helem = IEDoc.getElementById("go")
                helem.Value = .Range("A" & z).Value
                'es tu obligé de cliquer a chaque remplissage de tes "GO"? 
    'reponse : OUi car la recherche se fait sur plusieurs codes placés dans la 'colonne A, je dois donc valider la recherche a chaque fois
                Set helem = IEDoc.getElementById("go-submit")
                helem.Click
                'SendKeys ("{ENTER}") 'enter
                WAITIE1 ie
     
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                'boucle pour trouver le code isin et cliquer dessus
                'On pointe le document
                Set IEDoc = ie.document
              '  WAITIE ie
                For i = 0 To IEDoc.Links.Length - 1
                    'On pointe notre lien
                    'Set lienFtid = IEDoc.anchors(2)
                    'On Error Resume Next
     
                    Set lienFtid = IEDoc.Links(i)
                    If IEDoc.Links(i).innerText = monisin Then
     
                        'On exécute le lien
                        IEDoc.Links(i).Click
                        'On attend le chargement complet de la page
                        WAITIE2 ie
     
                        Exit For
                    End If
                Next i
                'boucle pour trouver le price history et cliquer dessus
                Set IEDoc = ie.document
                'On pointe le document
               For u = 0 To IEDoc.Links.Length - 1
                    Set lienFtid2 = IEDoc.Links(u)
                    If IEDoc.Links(u).innerText = "Price History" Then
                        'On exécute le lien
                        IEDoc.Links(u).Click
                        '"""""""""""""""
                        WAITIE2 ie
     
                        Exit For
                    End If
                Next u
     
    Dim htmlTagCol As IHTMLElementCollection
    Dim Generic As HTMLGenericElement
    Set IEDoc = ie.document
     
       'On liste les éléments de type td
       Set htmlTagCol = IEDoc.getElementsByTagName("td")
    Range("B" & z).Value = htmlTagCol.Item(16).innerText
     
    'objet type table
    'Set htmlTabElement = getElementsByClassName(GenericElem, "RDS-EditHeaderBorder", False)
    'Set Element = IEDoc.getElementsByTagName("TD")
    '6eme tableau dans la page Web
    'Set IEDoc = ie.document
    'For k = 1 To Element.Length
    'If Element.item1.innerText = "20130125" Then
    'MsgBox "oui, trouvé"
    'End If
    'On Error Resume Next
    'Set maTable = Htable(k)
    'datereuter = maTable.Rows(1).Cells(0).innerText
    'midprice = maTable.Rows(1).Cells(5).innerText
    'Interdata3 = maTable.Rows(2).Cells(0).innerText
    'bidprice = maTable.Rows(2).Cells(5).innerText
    'Next k
            Next z
        End With
        ie.Quit
        'On libère les variables
        Set ie = Nothing
        Set IEDoc = Nothing
        Set ie = Nothing
        Set IEDoc = Nothing
        Application.ScreenUpdating = True
    End Sub
    Function WAITIE1(ie)
    Application.Wait (Now + TimeValue("0:00:02"))
     
    Do Until ie.readyState = READYSTATE_COMPLETE
    SendKeys ("{ENTER}") 'enter
      DoEvents
    Loop
     
    Set IEDoc = ie.document
    Do Until IEDoc.readyState = "complete"
    SendKeys ("{ENTER}") 'enter
      DoEvents
    Loop
    End Function
    Function WAITIE2(ie)
    'Application.Wait (Now + TimeValue("0:00:03"))
    Do Until ie.readyState = READYSTATE_COMPLETE
      DoEvents
    Loop
    Set IEDoc = ie.document
    Do Until IEDoc.readyState = "complete"
      DoEvents
    Loop
    End Function
    Sub FindAndTerminate(ByVal strProcName As String)
    On Error Resume Next
        Dim objWMIService, objProcess, colProcess
        Dim strComputer, strList
        strComputer = "."
        Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" _
        & strComputer & "\root\cimv2")
        Set colProcess = objWMIService.ExecQuery _
        ("Select * from Win32_Process Where Name = '" & strProcName & "'")
        If colProcess.Count > 0 Then
            For Each objProcess In colProcess
                objProcess.Terminate
            Next objProcess
        End If
    End Sub

  20. #20
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    déjà le sendkeys ne dois pas se trouver dans une boucle tu risque d'avoir des surprises

    ensuite quand tu attend un readystate "complète " demande le par son index
    car je suis pas sur que do.....loop par le readystate="complète" fonctionne essaie plutôt "4"

    je regarderais de plus près un peu plus tard je suis sur un autre projet

    au plaisir

Discussions similaires

  1. [Toutes versions] Recherche comment boucler sur les boites emails ?
    Par Gerard_tlse dans le forum VBA Outlook
    Réponses: 2
    Dernier message: 23/04/2015, 20h27
  2. [XSLT 1.0] Comment boucler sur les infos d'un élément précis
    Par Janko dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 18/06/2012, 13h45
  3. [JDOM] Parsage : comment boucler sur les enfants d'un noeud ?
    Par Nelieru dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 12/02/2009, 16h28
  4. Réponses: 3
    Dernier message: 11/05/2006, 17h47
  5. Répeter les modifications sur tous mes pages web?
    Par mamiberkof dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 19/04/2006, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo