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 :

VBA- comment extraire des données sur internet via un programme vba ?


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut VBA- comment extraire des données sur internet via un programme vba ?
    Bonjour,
    J'ai crée un code qui calcule un tableau d'amortissement en fonction du type de taux : il marche pour les taux fixes, et je voudrais maintenant le faire marcher avec les taux variables.

    J'ai une userform qui permet à l'utilisateur de rentrer les caractéristiques nécessaires à tous les calculs. je voudrais par exemple que lorsqu'il choisisse parmi la liste des taux l'EURIBOR12M, mon code aille chercher la valeur du taux sur un site internet (boursorama). j'ai trouvé la page où il faut aller pour avoir la valeur du taux ( pour l'exemble, c'est http://www.boursorama.com/cours.phtm...UR8Y&vue=histo).

    je cherche depuis 2 jours comment extraire cette donnée via vba, mais je ne comprends rien à ce que je lis : existe-il une fonction en vba qui permette d'extraire les données du net et de les utiliser dans mon programme? si oui pourrais-je avoir un exemple SIMPLE?

    et de plus je vais avoir une autre difficulté : je voudrais la valeur du taux à une date que l'utilisateur rentrera. Mais cela signifie qu'il faut se connecter sur la bonne page internet (la page donnée dans mon exemple est le taux du jour, mais comment faire pour avoir la page à n'importe quel jour?)

    A la limite, je me concentrerai sur le pb de date apres avoir bien compris comment extraire une donnée du web en vba. Mais bon si quelqu'un a en plus la solution pour ca, ce sera la cerise sur mon gateau

    Je vous remercie pour votre aide précieuse ! j'espère que j'ai bien expliqué mon problème....
    Bonne journée et bientot bon week-end !!!

    ps: pour info, j'utilise firefox et windows 7...

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 266
    Points
    34 266
    Par défaut
    Salut,

    quelques points importants concernant ce genre de démarche :
    - fournir des données boursières historiques n'est pas un élément gratuit (une requête historique auprès d'un fournisseur de données boursières (bbg, reuters, cqg, markit, credit edge...) a un coût. Aussi les sites qui les affichent n'ont pas vocation à être "récupéré" si aisément

    - mieux vaut privilégier des sites qui fourniraient des extraits csv/excel directement plutôt que d'avoir à
    > enregistrer le fichier au format html
    > le parser en VBA

    - pour ton problème de date si tu restes sur une interface page web, il te faudra vraisemblablement faire une analyse et trouver l'algorithme de génération de la page (format, nom de page etc. )
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Vous devriez trouver a peu près tous dans ce tutorial :
    http://qwazerty.developpez.com/tutor...-et-vba-excel/

    C’est intéressant mais un peu coton,
    On ne trouve pas beaucoup d’infos sur le sujet, c’a veut peut-etre dire que ce n’est pas trop utilisé(ou pas trop utilisable !)

    Henri

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    rebonjour à tous! bon apres quelques recherches de plus j'ai fini par arriver à faire la première étape de ce que je voulais faire, cad d'aller récupérer le taux sur internet.
    j'utilise pour cela la fonction :

    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
     
     
         'fonction pour récuperer la valeur sur internet
    Public Function recup_euribor12m(lienInternet As SHDocVw.InternetExplorer, pageInternet As MSHTML.HTMLDocument, leTaux As MSHTML.HTMLSpanElement, tauxWeb As String) As Variant
     
     
    Set lienInternet = New SHDocVw.InternetExplorer
     
    lienInternet.Visible = False
     
    lienInternet.navigate "http://www.boursorama.com/cours.phtml?symbole=1xEUR8Y&vue=histo"
     
    ' Attente avec timeout de 10 s
    If WaitIE(lienInternet, 10) Then
       ' 10 s écoulées et page non chargée
       MsgBox "Time out!"
    Else
       ' Page chargée, on continue
       Set pageInternet = lienInternet.Document
       ' on va dans le item où est située la valeur du taux
       Set leTaux = pageInternet.getElementsByClassName("cotation").Item(0)
        ' le taux est dans le texte de l'item
        tauxWeb = leTaux.innerText
     
       'on converti le taux en nombre
        recup_euribor12m = CDbl(Val(tauxWeb))
     
    End If
    End Function
     
     
    ' Attend que la page internet soit chargée
    ' pTimeOut est un time out en secondes (WaitIE vaut True si Timeout)
    Public Function WaitIE(oIE As InternetExplorer, Optional pTimeOut As Long = 0) As Boolean
    Dim lTimer As Double
    lTimer = Timer
    Do
        DoEvents
       If oIE.readyState = READYSTATE_COMPLETE And Not oIE.Busy Then Exit Do
       If pTimeOut > 0 And Timer - lTimer > pTimeOut Then
           WaitIE = True
           Exit Do
       End If
    Loop
    End Function
    et j'appelle cette fonction depuis mon main, ça compile je suis contente

    Maintenant j'ai VRAIMENT besoin d'aide pour l'étape 2 : vraiment, ça fait une semaine que je cherche et j'essaie les tuto sur le net, mais je n'y arrive pas, peut-etre à cause de mon manque de connaissance en html ( j'ai quand même lu un tuto dessus mais tjs pas de résultats...)

    ce que je voudrais faire, c'est, au lieu de prendre un taux sur la page web donnée dans ma fonction, je voudrais, apres que l'utilisateur de mon code ait rentré une date, pouvoir changer la date du calendrier (cf photo ci-dessous) afin de récupérer le taux à cette date là! J'ai trouvé des tuto pour apprendre à cliquer sur un bouton d'une page web, mais ca ne marche pas pour mon code...

    pour info je veux agir sur ce calendrier de la page suivante :

    au milieu de la page, il y a marqué "cours de la valeur au" puisu ne date, modifiable par un clic sur le calendrier. c'est sur ce calendrier que je veux pouvoir cliquer et modifier la date...
    (cependant si c'est trop compliqué, cela ne me dérange pas de changer de site, mais c'est le seul que j'ai trouvé pour avoir les taux à une date souhaitée).

    Merci beaucoup pour votre aide, j'ai déja bien avancé!
    bonne journée !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Pourriez-vous attacher le dossier en pièce jointe ?

    Cordialement,
    Henri

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    je suis désolée je ne peux pas, ca me répond "fichier non valide"...
    mais je pense que tout peut se faire du module donc vous avez le bon module dans mon message précédent !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Salut,

    Tu as 2 solutions pour realiser ceci :

    Dans le cas ou cliquer sur le bouton genere une autre page, tu passes par l'URL pour parser les bons resultats.
    Ce n'est pas ton cas car les resultats donnés sont générés par du JS et ne sont pas routés vers une autre page donc tu n'as pas le choix que de reproduire le "click" sur le bouton et de parser ensuite les resultats.

    Pour cela je te conseille d'utiliser une librairie et d'appeler une fonction "click". tu pourrais bien entendu la créer toi même mais cela te prendrait du temps.

    Je n'ai jamais utilisé de librairies de wrapper en VBA (tres peu courant de créer des bots en VBA) mais en cherchant un peu j'ai trouvé ceci qui semble convenir a tes besoins
    http://code.google.com/p/selenium-vba/

    A+
    Steve

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    merci bcp pour ton aide steeve, je regarde ca dès maintenant !

    ps: jai tenté de simuler un click a l'aide d'un tuto qui avait l'air bien, mais le clic n'a pas marché sur mon calendrier j'espère que j'aurai plus de chance avec ton document!!

    encore merci !

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    bonjour !
    Je suis toujours avec ce fameux problème de controle de date, j'avance, enfin je pense, mais ca bloque toujours.
    En fait, plutot que de simuler un clic sur le calendrier et de choisir la date ( ce qui est impossible en vba car je ne controle pas la souris qui peut effectuer le clic), il faut que j'active la fonction qui se sert de la date que je donnerai pour afficher le bon taux, que je pourrai alors récupérer comme je sais le faire.

    donc j'y suis presque, il faut juste que je parvienne a écrire la bonne syntaxe !

    voici mon code actuel :
    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
     
    Public Sub recup_taux_euribor12m()
     
    Dim lienInternet As SHDocVw.InternetExplorer
    Dim pageInternet As MSHTML.HTMLDocument
    Dim leTaux As MSHTML.HTMLSpanElement
    Dim cadre_calendrier As MSHTML.HTMLFormElement
     
    Dim calendrier As MSHTML.HTMLGenericElement
    Dim dateRecup As String
    Dim dateRecup2 As String
    Dim tauxWeb As String
    Dim tauxeuribor12m As Double
    'Dim bouton As MSHTML.HTMLDocument
     
     
    Set lienInternet = New SHDocVw.InternetExplorer
     
    lienInternet.Visible = True
     
    lienInternet.navigate "http://www.boursorama.com/cours.phtml?symbole=1xEUR8Y&vue=histo"
     
    ' Attente avec timeout de 10 s
    If WaitIE(lienInternet, 10) Then
       ' 10 s écoulées et page non chargée
       MsgBox "Time out!"
    Else
       ' Page chargée, on continue
       Set pageInternet = lienInternet.Document
      ' On clique sur le calendrier
     
        Set calendrier = pageInternet.all("span_date_cal")
        dateRecup = calendrier.innerText
     
     
         'On affiche le texte
       MsgBox dateRecup, Title:="la date est"
     
          'on change la date
     
     
     
     
           ' Valeur recherchée
    'pageInternet.parentWindow.execScript "showCalendar('date_cal', '%Y-%m-%d', true, 'span_date_cal')", "JavaScript"
    pageInternet.parentWindow.execScript "$('form').submit(dateRecup)", "JavaScript"
    pageInternet.parentWindow.execScript "$('form').submit()", "JavaScript"
    'pageInternet.parentWindow.execScript "showCalendar('date_cal', '%Y-%m-%d', true, 'dateRecup')", "JavaScript"
     
        'On exécute le script showActu 'Attention à la Casse!!!! showActu
          'IEDoc.parentWindow.execScript "showCalendar(" & yNumActu & ")", "JavaScript" code du tuto
     
        'dateRecup2 = calendrier.innerText
          'On affiche le texte
       MsgBox dateRecup2, Title:="la date est"
     
          'on recalcule le taux sur le site
     
     
            'Set calendrier = pageInternet.all("span_date_cal")
            'calendrier.Click
    End If
    End Sub
     
     
     
     
    ' Attend que la page internet soit chargée
    ' pTimeOut est un time out en secondes (WaitIE vaut True si Timeout)
    Public Function WaitIE(oIE As InternetExplorer, Optional pTimeOut As Long = 0) As Boolean
    Dim lTimer As Double
    lTimer = Timer
    Do
        DoEvents
       If oIE.readyState = READYSTATE_COMPLETE And Not oIE.Busy Then Exit Do
       If pTimeOut > 0 And Timer - lTimer > pTimeOut Then
           WaitIE = True
           Exit Do
       End If
    Loop
    End Function
     
    ' Recherche d'un bouton par son nom dans le document
    Private Function GetButton(Document As HTMLDocument, ButtonId As String) As MSHTML.HTMLInputElement
    If Document.getElementById(ButtonId).Length > 1 Then
       Set GetButton = Document.getElementById(ButtonId)(1)
    Else
       Set GetButton = Document.getElementsById(ButtonId)(0)
    End If
    End Function
    les lignes importantes et à corriger sont donc les lignes
    pageInternet.parentWindow.execScript "$('form').submit(dateRecup)", "JavaScript"
    pageInternet.parentWindow.execScript "$('form').submit()", "JavaScript"

    qui servent à piloter la fonction du web via vba.

    pour info, j'ai trouvé ces lignes grace au tuto suivant :
    http://qwazerty.developpez.com/tutor...-et-vba-excel/

    dans la partie IV. 1.

    merci encore pour votre aide, j'avance lentement, mais j'avance !!

  10. #10
    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,

    Je ne vais malheureusement pas répondre à ton problème de Submit mais...

    Le chalenge m'intéressait alors j'ai cherché la solution.
    Et j'en ai trouvé une.

    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
    Option Explicit
     
    Sub test()
      Dim dblEuribor As Double
      dblEuribor = recup_euribor12m(Date - 7)
      MsgBox dblEuribor
    End Sub
     
    Public Function recup_euribor12m(dDate As Date) As Double
      Dim oDiv As MSHTML.HTMLDivElement
      Dim oDoc As MSHTML.HTMLDocument
      Dim oIE As SHDocVw.InternetExplorer
      Dim oTable As MSHTML.HTMLTable
      Dim strDate As String
      Dim strDernEch As String
     
      Set oIE = New SHDocVw.InternetExplorer
     
      strDate = Format(dDate, "yyyy-mm-dd")
      oIE.Visible = False
     
      oIE.navigate "http://www.boursorama.com/cours.phtml?symbole=1xEUR8Y&vue=histo&date=" & strDate
     
      ' Attente avec timeout de 10 s
      If WaitIE(oIE, 10) Then
        ' 10 s écoulées et page non chargée
        MsgBox "Time out!"
      Else
        ' Page chargée, on continue
        Set oDoc = oIE.Document
        ' on va dans le item où est située la valeur du taux
        For Each oDiv In oDoc.getElementsByTagName("DIV")
          If oDiv.className = "bd" Then
            If InStr(1, oDiv.innerHTML, "PMSelect") > 0 Then
              Set oTable = oDiv.Children(2)
              strDernEch = oTable.Cells(2).outerText
              Exit For
            End If
          End If
        Next oDiv
      End If
      recup_euribor12m = Val(strDernEch)
      oIE.Quit
      Set oDoc = Nothing
      Set oIE = Nothing
    End Function
     
    ' Attend que la page internet soit chargée
    ' pTimeOut est un time out en secondes (WaitIE vaut True si Timeout)
    Public Function WaitIE(oIE As InternetExplorer, Optional pTimeOut As Long = 0) As Boolean
      Dim lTimer As Double
      lTimer = Timer
      Do
        DoEvents
        If oIE.readyState = READYSTATE_COMPLETE And Not oIE.Busy Then Exit Do
        If pTimeOut > 0 And Timer - lTimer > pTimeOut Then
          WaitIE = True
          Exit Do
        End If
      Loop
    End Function
    2 Références à activer:
    Microsoft HTML Object Library (MSHTML.TLB)
    Microsoft Internet Controls (shdocvw.dll)

    A toi, maintenant, de gérer les dates pour lesquelles il n'y a pas de cotation.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    merci pour ton aide AlainTech !!!

    j'ai testé ton code mais j'ai un message d'erreur quand je compile : "Variable Objet ou variable de bloc With non définie".
    Du coup je n'ai pas de résultat...

  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
    As-tu bien activé les 2 références nécessaires?
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    j'ai trouvé une autre solution pour aller chercher le bon taux :

    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
     
    Sub Demo()
        MsgBox recup_euribor12m("13-07-2012")
    End Sub
    Public Function recup_euribor12m(ByVal DateDuTaux As String) As Double
     
    Dim pageInternet As Object, LesTD As Object, tauxWeb As String
    Dim objtIE As Object, lesEntrées As Object, LaForm As Object, lignes As Object
    Dim newDate As String
     
        'on verifi que la valeur du paramatre est bien une date
        If IsDate(DateDuTaux) = True Then
            'c'est une date donc on la converti au format attendu
            newDate = Format(CDate("13-07-2012"), "yyyy-mm-dd")
        Else 'ce n'est pas une date
            recup_euribor12m = 0
            Exit Function
        End If
     
        Set objtIE = New SHDocVw.InternetExplorer
        objtIE.Visible = False
     
        objtIE.navigate "http://www.boursorama.com/cours.phtml?symbole=1xEUR8Y&vue=histo"
     
        WaitIE objtIE
     
        Set pageInternet = objtIE.Document
        'récupération des objets "input"
        Set lesEntrées = pageInternet.getElementsBytagname("input")
        'on boucle pour retrouver le champ date de la form
        For i = 0 To lesEntrées.Length - 1
            'pour la recherche on utilise l'ID
            If lesEntrées(i).ID = "date_cal" Then
                'le WaitIE plus haut ne suffit pas à garantir que la page à pris en compte la nouvelle valeur de date
                'on vas donc boucler pour verifier
                Do
                    lesEntrées(i).Value = newDate
                    Application.Wait Now + TimeValue("0:00:01")
                    DoEvents
                Loop Until lesEntrées(i).Value = newDate
                Exit For
            End If
        Next
     
        'envoi de la form
        pageInternet.getElementById("form").submit '(autre methode : 'pageInternet.parentWindow.execScript "document.forms[1].submit();", "javascript1.1")
     
        '/!\ attention ici pour que cela fonctionne il faut imperativement que objtIE.Busy soit à false !!!
        Do While objtIE.Busy: DoEvents: Loop
     
        ' Page chargée, on continue
       Set LesTD = pageInternet.getElementsBytagname("td")
        For i = 0 To LesTD.Length - 1
            Range("a" & i + 1).Value = LesTD(i).classname
            If LesTD(i).innerText = "Dernier échange" Then
                'le taux
                tauxWeb = LesTD(i + 2).innerText
                Exit For
            End If
        Next
     
       'on converti le taux en nombre
        recup_euribor12m = CDbl(Val(tauxWeb))
        objtIE.Quit
        Set pageInternet = Nothing
        Set LesTD = Nothing
        Set lesEntrées = Nothing
        Set objtIE = Nothing
    End Function
     
     
    ' Attend que la page internet soit chargée
    ' pTimeOut est un time out en secondes (WaitIE vaut True si Timeout)
    Public Function WaitIE(oIE As Object, Optional pTimeOut As Long = 0) As Boolean
     
     
    Dim lTimer As Double
    lTimer = Timer
    Do
        DoEvents
       If oIE.readyState = READYSTATE_COMPLETE And Not oIE.Busy Then Exit Do
       If pTimeOut > 0 And Timer - lTimer > pTimeOut Then
           WaitIE = True
           Exit Do
       End If
    Loop
    End Function
    le problème c'est que (je pense) le code n'attends pas que la page change la date demandée avant de récupérer le taux. Du coup parfois le taux récupéré est celui d'aujourd'hui, et parfois c'est le bon taux à la bonne date...

    Donc comment faire pour que le code n'aille pas trop vite et attende le chargement de la bonne page internet??

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Et avec ça :

    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
     
       'MsgBox dateRecup, Title:="la date est" '13/03/2012
     
     Dim form_1 As HTMLElementCollection
     Set form_1 = pageInternet.forms(1)
     Dim date_cal As IHTMLInputElement
     Set date_cal = form_1.all(1)
     date_cal.Value = "2012-08-06"  'ICI on ecrit la date que l'on desir
     form_1.submit
     
       MsgBox dateRecup2, Title:="la date est"
     
          'on recalcule le taux sur le site
     
     
            'Set calendrier = pageInternet.all("span_date_cal")
            'calendrier.Click
    End If
    End Sub

    Chez moi c’a fonctionne très bien, je vois bien le taux évoluer

    A+
    Henri

  15. #15
    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
    Ah ben c'est bien la peine d'essayer de te trouver une solution qui marche si tu décides qu'il vaut mieux une solution boîteuse.

    Citation Envoyé par AlainTech Voir le message
    As-tu bien activé les 2 références nécessaires?
    Les 2 Références à activer sont:
    Microsoft HTML Object Library
    Microsoft Internet Controls

    Si tu avais bien regardé mon code, tu aurais vu qu'on peut atteindre la bonne page directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oIE.navigate "http://www.boursorama.com/cours.phtml?symbole=1xEUR8Y&vue=histo&date=" & strDate
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Comme Cecile_64 est sorti des écrans radar ou en vacance elle en profitera à la rentrée, sinon pour les autres :

    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
     
    Public Sub recup_taux_euribor12m()
     
    Dim lienInternet As SHDocVw.InternetExplorer
    Dim pageInternet As MSHTML.HTMLDocument
     
    Set lienInternet = New SHDocVw.InternetExplorer
     
    lienInternet.Visible = True
     
    lienInternet.navigate "http://www.boursorama.com/cours.phtml?symbole=1xEUR8Y&vue=histo"
     
    Do
    Loop Until lienInternet.readyState = READYSTATE_COMPLETE ' Wait till the Browser is loaded
     
       Set pageInternet = lienInternet.Document
     
     Dim form_1 As HTMLElementCollection
     Set form_1 = pageInternet.forms(1)
     Dim date_cal As IHTMLInputElement
     Set date_cal = form_1.all(1)
     
     'Il n'y pas de cotations pour cette valeur à la date du : 03 / 04 / 2012 et prevoir de verifier sinon c'a plante
     'Juste à mttre la date dans cette celule
     date_cal.Value = Format(Cells(1, 1), "yyyy-mm-dd")
     
     form_1.submit
     
    Do
    Loop Until lienInternet.readyState = READYSTATE_COMPLETE ' Wait till the Browser is loaded
     
     
    Dim y As Integer
    Dim b As Integer
    y = pageInternet.all.Length
     
    Application.Wait (Now + TimeValue("0:00:03")) 'C'est ce qui me plais pas dans cette technique, mais si on ne mets pas de temporisation c'a plante
     
    For b = 0 To pageInternet.all.Length
        If pageInternet.all(b).nodeName = "SPAN" And pageInternet.all(b).className = "cotation" Then
            If pageInternet.all(b).parentElement.nodeName = "STRONG" Then
            'c'a peut servir pour l'avenir
    '            MsgBox ("node name : " & pageInternet.all(b).nodeName & vbCrLf & b & vbCrLf _
    '            & "className : " & pageInternet.all(b).className & vbCrLf _
    '            & "parentElement : " & pageInternet.all(b).parentElement.nodeName & vbCrLf _
    '            & "innerText : " & pageInternet.all(b).innerText & vbCrLf _
    '            & "uniqueID  : " & pageInternet.all(b).uniqueID)
                Cells(1, 2) = pageInternet.all(b).innerText
                Exit For 'On a le resultat et on se sauve
            End If
        End If
    Next
     
    lienInternet.Quit  'On ferme Internet Explorer
     
    End Sub
    Cordialement,
    Henri

  17. #17
    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,

    Je ne comprends toujours pas pourquoi vous essayez de remplir le calendrier alors qu'il est possible d'atteindre la bonne page par l'URL.

    Enfin... Pourquoi faire simple quand on peut faire compliqué???
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Et Oui, votre façon est parfaitement appropriée,
    Mais j’étais parti sur cette l’idée sens lire tous les messages (y a des jours comme ça ! ! !)
    Mon but était aussi de me familiariser avec les objets IHTMLxxxxxxxx, le debugger, la touche F12 du navigateur pour disséquer le HTML
    Enfin essayer de faire quelque chose d’intelligent(c’est loupé )

    Henri

Discussions similaires

  1. Extraire des données depuis Chrome via VBA
    Par Korleone dans le forum VBA Access
    Réponses: 2
    Dernier message: 06/01/2015, 00h52
  2. Extraire des données sur internet.
    Par lovlov33 dans le forum Général VBA
    Réponses: 1
    Dernier message: 06/06/2014, 12h19
  3. Réponses: 1
    Dernier message: 03/01/2010, 12h49
  4. Réponses: 1
    Dernier message: 31/12/2009, 11h22
  5. Réponses: 4
    Dernier message: 29/09/2009, 16h00

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