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

Signaler
Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
-
 mlbzh -
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...

17 réponses

Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
1
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 :

     '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, ca 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 !
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
Bonjour

as tu regardé les programmes sur le site en VB6 peu de différence en VBA, parfois un simple copier coller (au moins pour les modules, les formulaires c'est un peu plus compliqué) peut fonctionner sinon aller en pas à pas et essayer de comprendre

cote de la bourse
http://www.vbfrance.com/telecharger.aspx?ID=45685

telechargement des cours boursiers sur boursorama
http://www.vbfrance.com/telecharger.aspx?ID=37489
Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
1
oui jai regardé mais je ne vois pas quel sujet est pour moi, et puis je ne saurai peut-etre pas l'adapter a mon problème....
pour me donner un exemple, est-ce que quelqu'un pourrait me donner un code simple qui va recupérer une donnée dans une page web ( n'importe laquelle) et qui la met dans une cellule excel par exemple?
Ce serait vraiment gentil....

merci d'avoir répondu si vite en tout cas!
Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
bonjour

Il faut connaitre HTML
apprendre la programmation et le débeugage
savoir lire le code source des pages Html succeptibles d'être parcourus par programme
ton lien ne fonctionne pas
Et si cela ne fonctionne pas avec boursorama regarder si yahoo.finance n'est pas mieux

Donc le projet dans VBA devra référencer les objets
Microsoft HTML Object LIbrary
+Microsoft Internet Controls


Sub LoadPage(sHttpPage as String)

Récupère un texte brut contenu dans une page Web

'Déclaration des variables
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument

'Chargement de la page
IE.Navigate sHttpPage

'Affichage de la fenêtre IE
IE.Visible = True

'On attend le chargement complet de la page
Do Until IE.ReadyState = 4
DoEvents
Loop

'On pointe le document
Set IEDoc = IE.document

' par exemple : On liste les éléments de commençant par '<a'
' commande a href contenant ensuite des renvoie dans la page ou des liens vers d'autre pages à charger (faire ensuite d'autres navigations )

Dim htmlTagCol As IHTMLElementCollection
' plusieurs méthode possible GetElementById or ByName or ByTagName
Set htmlTagCol = IEDoc.getElementsByTagName("a")

' Il faut encore extraire les informations dans la collection

Set IE = Nothing
Set IEDoc = Nothing

End Sub

http://qwazerty.developpez.com/tutoriels/vba/ie-et-vba-excel/
Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
1
merci loulou69 !
ton tuto m'a bien aidé ! par contre je suis en train de tester le code du tuto avant de le lancer pour mon cas, mais jai un problème : le code du tuto permet d'aller sur la page google, de taper ce qu'on veut dans la barre d'accueil ( j'ai choisi "coucou"), et de cliquer sur rechercher pour activer la recherche google.
Or, quand j'execute le code à la lettre, le code marche jusqu'au clic sur "recherche". en fait il faut que je clique quelque part dans la page google pour que le code clique sur recherche et que celle-ci soit activée ! est-ce que c'est normal?
parce que du coup mon code ne peut pas avancer plus loin sans que je clique sur la page internet, c'est quand même embettant...

je transmet le code (copié sur le tuto)

'fenetre de récupération des données internet

Sub PremierIE()
'Déclaration des variables
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim InputGoogleZoneTexte As HTMLInputElement
Dim InputGoogleBouton As HTMLInputElement

   'Suite du code
   'Chargement d'une page web Google
   IE.navigate "www.google.fr"
   'IE.navigate "http://www.boursorama.com/cours.phtml?symbole=1xEUR8Y&vue=histo"

   'Affichage de la fenêtre IE
   IE.Visible = True
   
   'On attend le chargement complet de la page
   WaitIE IE

   'On pointe le membre Document
   Set IEDoc = IE.document
   
   'AGIR SUR UN BOUTON
   'On pointe notre Zone de texte
   Set InputGoogleZoneTexte = IEDoc.all("q")

'On définit le texte que l'on souhaite placer à l'intérieur
InputGoogleZoneTexte.Value = "coucou"

'On pointe notre bouton
Set InputGoogleBouton = IEDoc.all("btnG")

'On simule un clic
InputGoogleBouton.Click

'On attend la fin de la recherche
WaitIE IE

   'On libère les variables
   Set IE = Nothing
   Set IEDoc = Nothing
   
End Sub



Sub WaitIE(IE As InternetExplorer)

   'On boucle tant que la page n'est pas totalement chargée
   Do Until IE.readyState = READYSTATE_COMPLETE
      DoEvents
   Loop
End Sub

Messages postés
672
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
2 juin 2016
1
bonjour cecile64

Attention, Je n'ai pas forcément la réponse à ta demande.

Lors de l'utilisation du calendrier, l'url du navigateur (firefox, IE) ne change t'elle pas pour ajouter le paramétre date : première piste pour trouver ton taux à une date souhaitée?

Dans une page IE, un bouton de recherche correspond à une action Submit qui lance un traitement : cela pourrait être une deuxieme piste? (pour une page javascript dont le code est distant)
Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
1
merci pour ta réponse loulou69, il n'y a aucun changement d'url lorsque je change la date du calendrier, donc je m'oriente vers la deuxième possibilité... ca va etre coton je sens.
bonne journée !
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
Salut,

Pourquoi ta fonction est dimensionnée en variant alors que tu convertis le résultat en Double ?
Pourquoi les variables de ta fonction sont elles déclarées en paramètres ? cela ne sert à rien ici !!!

Ta méthode de récupération du taux ne fonctionne pas si la date n'est pas la date du jour courant ! En fait c'est plus compliqué !!!

Voici ce qui devrait être la version définitive :

Tu noteras que les variables on été typées en object simple plutôt qu'en object spécifique au html ou IE. Cela simplifie la portabilité.

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 oIE.Busy Then Exit Do
   If pTimeOut > 0 And Timer - lTimer > pTimeOut Then
       WaitIE = True
       Exit Do
   End If
Loop
End Function


A+
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
re,

les déclarations : LaForm As Object, lignes As Object

sont des reliquats de développement qui ne servent à rien !

A+
Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
1
OH - MY - GOD
tu es mon dieu !!!! vraiment merci pour ton aide, je teste le code dès lundi et je vous tiens au courant s'il fonctionne !!!
Vraiment merciiiii
Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
1
Bonjour,
avant toute chose, je tiens a te remercier bigfish_le vrai, car tu m'as vraiment bcp bcp aidé!!!
ton code marche, mais il y a juste un petit détail ...
J'utilise ta fonction recup_euribor12m dans mon main, dans une boucle pour avoir le taux à chaque échéance ( pour l'instant, je ne vais récupérer que le taux à la date du code de la fonction, on verra plus tard pour la récup en boucle :) )
donc lorsque je lance mon code, ca compile, ca calcule, mais la récup du taux en date choisie dans la fonction ( ici 13/07/2012) ne fonctionne que partiellement : parfois j'ai la bonne récup à la bonne date du 13 juillet, parfois la récup prends encore le taux d'aujourd'hui... bien sur, je n'ai pas 2 fois la meme recup si je compile mon code 2 fois de suite ^^

dc voila si quelqu'un a une idée du pourquoi de cette affaire, ce sera la cerise sur le gateau !
ci-joint une partie de mon main() qui utilise la fonction recup_euribor12m :

 'remplissage du tableau d'amortissement, avec le TEG donné
        For i = 7 To (nbre_echeances + 6)
            duree_i = DateDiff("d", date_avant, date_echeance)
            Sheets(nomonglet).Cells(i, 1).Value = taux_phase2
                Select Case (tauxvar)
                    Case "euribor12m":
                        taux = recup_euribor12m("13-07-2012")
                   
                End Select
            
            
            Sheets(nomonglet).Cells(i, 3).Value = taux / 100
       ' suite du code ( inutile pour résoudre le probleme)


encore merci pour ton aide, et pour l'aide de toute le monde d'ailleurs !
Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
1
autre question : dans le code que tu m'as donné, tu me dis qu'il faut que objectIE.busy soit à false. comment je peux voir cela et qu'est-ce que cela signifie?
Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
1
je pense que le problème vient du fait que la page internet se charge moins vite que le code qui va chercher le taux, du coup parfois le code est trop rapide et prend le taux en date d'aujourd'hui, et parfois la page internet a le temps de s'ouvrir avant, du coup le taux est celui de la date demandée.

cependant, ceci est une supposition... mais quand je met un objtIE.Visible = True apres la récup du taux j'ai bien la page internet qui s'affiche, puis qui change de date, et enfin je vois le taux. c'est pour ca que je pense que c'est un problème de vitesse.

Il faudrait donc trouver le moyen de ralentir le code ou d'accélérer le changement de date....
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
Salut,

bah en fait la ligne : objectIE.busy sert, normalement, à éviter le problème que tu décris !
C'est quelque chose que j'ai déjà rencontré avec certain site. Ces de toute façon un probleme connu.

objectIE.busy est egale à true tant que IE est occupé une fois que tout terminé objectIE.busy passe à false.


Voir ici

Bon voici une nouvelle version de la fonction à tester:

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
Dim newDate As String, VerifDateSelectionné As Object, IndexVerifDateSelectionné As Long
Dim DateDeVerif 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(DateDuTaux), "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.
    objtIE.navigate "http://www.boursorama.com/cours.phtml?symbole=1xEUR8Y&vue=histo"

    WaitIE objtIE
    
    'cette partie permet de noter l'index de l'element qui contient notre nouvelle date afin de verifié que la soumission de form à fonctionné.
    Set pageInternet = objtIE.Document
    'récupération des objets "input"
    Set VerifDateSelectionné = pageInternet.getElementsBytagname("h3")
    'on boucle pour retrouver l'object qui contient la date pour verif de prise en compte du changement
    For i = 0 To VerifDateSelectionné.Length - 1
        'pour la recherche on utilise la classe
        If VerifDateSelectionné(i).className = "PMSelect" Then
            'on note l'index de l'objet
            IndexVerifDateSelectionné = i
            Exit For
        End If
    Next
    
    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
    
   
    Do
        'envoi de la form
        pageInternet.getElementById("form").submit '(autre methode : 'pageInternet.parentWindow.execScript "document.forms[1].submit();", "javascript1.1")
        Do While objtIE.Busy: DoEvents: Loop
        DoEvents
        'parfois même si objtIE.Busy est false le submit n'a pas fonctionné
        'on vas donc verifié en recuperant la date inscrite dans la table et la comparer avec notre date
        'recuperation de la date
        Set VerifDateSelectionné = pageInternet.getElementsBytagname("h3")
        DateDeVerif = VerifDateSelectionné(IndexVerifDateSelectionné).innerText
        DateDeVerif = Right$(DateDeVerif, Len(Format(CDate(DateDuTaux), "dd / mm / yyyy")))
    'on boucle tant qua la date n'est ne correspond pas
    Loop While Not DateDeVerif = Format(CDate(DateDuTaux), "dd / mm / yyyy")
    
    ' 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


A+
Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
1
bonjour,
en fait j'avais fini par trouver une solution hier soir, il suffisait de rajouter une ligne de code avec la fonction sleep :
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Function recup_euribor01m(ByVal DateDuTaux As Date) As Double

Dim pageInternet As Object, LesTD As Object, tauxWeb As String
Dim objtIE As Object, lesEntrees As Object, LaForm As Object, lignes As Object
Dim newDate As String
Dim i As Integer

    '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(DateDuTaux), "yyyy-mm-dd")
    Else 'ce n'est pas une date
        recup_euribor01m = 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 lesEntrees = pageInternet.getElementsByTagName("input")
    'on boucle pour retrouver le champ date de la form
    For i = 0 To lesEntrees.Length - 1
        'pour la recherche on utilise l'ID
        If lesEntrees(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
                lesEntrees(i).Value = newDate
                Application.Wait Now + TimeValue("0:00:01")
                DoEvents
            Loop Until lesEntrees(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")
    
       Sleep 10000
        
    '/!\ 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
    
    objtIE.Visible = True
    
   'on converti le taux en nombre
    recup_euribor01m = CDbl(Val(tauxWeb))
   ' objtIE.Quit
    Set pageInternet = Nothing
    Set LesTD = Nothing
    Set lesEntrees = Nothing
    Set objtIE = Nothing
End Function
       

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




voila je ne sais pas si c'est aussi bien que toi niveau programmation, je ne suis qu'une débutante :)

Le site internet que j'utilise ne me permet pas d'avoir les taux si on est un jour férié, et ne permet pas d'avoir les anticipation des taux pour les échéances postérieures à aujourd'hui.
Donc je pensais utiliser un autre site, et utiliser le code que j'ai déja en l'adaptant aux petites subtilités...

première subtilité : le nouveau site necessite un mot de passe et login (que j'ai). J'ai déja lu des tuto pour le connecter via un mot de passe et login, mais sur mon site il y a deux problèmes : je peux me connecter à 3 espaces différents sur la meme page, et le code html est tres similaire pour ces 3 espaces (id, name,...) donc je n'arrive pas à différencier ces balises pour appuyer sur le bon bouton.
Et deuxième problème : le bouton pour se connecter n'a pas l'air d'etre défini comme un bouton, j'ai juste la ligne de code "" sur la page web, donc je ne vois pas la commande qu'il faut que j'écrive en vba pour simuler le clic sur ce bouton (en sachant que la ligne de code du site web est la meme pour se connecter à un autre espace).

j'ai essayé avec le code suivant :
'fenetre de récupération des données internet


Sub PremierIE()
'Déclaration des variables
Dim IE As New InternetExplorer
Dim pageInternet As Object
Dim login, motDePasse As Object
Dim InputGoogleBouton As Object
Dim lesEntrees As Object
Dim connection As Object
Dim i As Integer

   'Suite du code
   'Chargement d'une page web Google
   IE.navigate "https://www.seldon-finance.com/seldon/login.html"
  
   'Affichage de la fenêtre IE
   IE.Visible = True
   
    'On attend le chargement complet de la page
   WaitIE IE

   'On pointe le membre Document
   Set pageInternet = IE.Document
   
   'AGIR SUR UN BOUTON
'On pointe notre login
Set login = pageInternet.getElementById("monlogin")

'On définit le texte que l'on souhaite placer à l'intérieur
login.Value = "monmotdepasse"

'On pointe notre mot de passe
Set motDePasse = pageInternet.getElementById("txtPwd_WebDetteclear")

'On définit le texte que l'on souhaite placer à l'intérieur
motDePasse.Value = "baichah2"

 Set lesEntrees = pageInternet.getElementsByTagName("authen")
    'on boucle pour retrouver le champ date de la form
    For i = 0 To lesEntrees.Length - 1
        'pour la recherche on utilise l'ID
        If lesEntrees(i).Action = "https://webdette.seldon-finance.com/WebDette/esp_public/login" 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
                lesEntrees(i).Value = newDate
                Application.Wait Now + TimeValue("0:00:01")
                DoEvents
            Loop Until lesEntrees(i).Value = newDate
            Exit For
        End If
    Next


    
       'Sleep 10000

'On attend la fin de la recherche
'WaitIE IE

   'On libère les variables
   Set IE = Nothing
   Set pageInternet = Nothing
   
End Sub


Sub WaitIE(IE As InternetExplorer)

   'On boucle tant que la page n'est pas totalement chargée
   Do Until IE.readyState = READYSTATE_COMPLETE
      DoEvents
   Loop
End Sub





voila bon bien sur je ne peux pas donner mon mot de passe et login, mais si le code marche, j'aurai une fenetre qui me dit au moins que le mot de passe et/ou login est incorrect nn?


Vous m'avez déja bcp aidé, mais un petit coup de pouce de plus ce serait super :) et je suis sure que bcp de personnes rencontrent le même problème que moi ...

Merci encore
Messages postés
15
Date d'inscription
vendredi 15 juin 2012
Statut
Membre
Dernière intervention
17 août 2012
1
en fait j'ai reussi toute seule !
par tatonnement : il fallait se connecter sur la page suivante apres s'etre identifié :
'fenetre de récupération des données internet


Sub PremierIE()
'Déclaration des variables
Dim IE As New InternetExplorer
Dim pageInternet As Object
Dim login, motDePasse As Object
Dim InputGoogleBouton As Object
Dim lesEntrees As Object
Dim connection As Object
Dim i As Integer

   'Suite du code
   'Chargement d'une page web Google
   IE.navigate "https://www.seldon-finance.com/seldon/login.html"
  
   'Affichage de la fenêtre IE
   IE.Visible = True
   
    'On attend le chargement complet de la page
   WaitIE IE

   'On pointe le membre Document
   Set pageInternet = IE.Document
   
   'AGIR SUR UN BOUTON
'On pointe notre login
Set login = pageInternet.getElementById("IdWebDette")

'On définit le texte que l'on souhaite placer à l'intérieur
login.Value = "MonIdentifiant"

'On pointe notre mot de passe
Set motDePasse = pageInternet.getElementById("txtPwd_WebDette")

'On définit le texte que l'on souhaite placer à l'intérieur
motDePasse.Value = "monMotDePasse"

IE.navigate "https://webdette.seldon-finance.com/WebDette/esp_public/login"
    
       'Sleep 10000

'On attend la fin de la recherche
'WaitIE IE

   'On libère les variables
   Set IE = Nothing
   Set pageInternet = Nothing
   
End Sub


Sub WaitIE(IE As InternetExplorer)

   'On boucle tant que la page n'est pas totalement chargée
   Do Until IE.readyState = READYSTATE_COMPLETE
      DoEvents
   Loop
End Sub



Bonjour à tous!
Pour commencer, merci beaucoup à tous ceux qui ont contribué à ce topic. Cela m'a beaucoup aidé moi aussi pour développer ma propre appli VBA récupérant des données sur internet.

J'ai un petit défi supplémentaire à ajouter, et jusqu'ici je ne vois pas du tout comment m'en sortir : il s'agirait de récupérer des données depuis une page (php) qui s'ouvre dans un nouvelle fenêtre, après clic sur un bouton d'une première page.

Pour être plus clair, le site où je récupère mes données fonctionne comme suit : on a tout d'abord une page où on doit pointer sur un lieu (google map) et définir certains paramètres, avant de cliquer sur un bouton qui va lancer le calcul des données qui m'intéressent. Et ces données apparaissent dans une autre page (nouvelle fenêtre IE).

Si besoin, voici la page en question :
http://re.jrc.ec.europa.eu/pvgis/apps4/pvest.php
(statistiques d'ensoleillement et de température en Europe)

J'ai donc réussi (grâce à vous ) à automatiser toutes les étapes jusqu'à un point dur : est-il possible de récupérer les données de la deuxième fenêtre, sachant que ce qu'elle contient dépend directement des paramètres définis sur la première ? (c'est-à-dire, si on écrit l'adresse de la 2e fenêtre directement dans le navigateur, il affichera une erreur, n'ayant reçu aucun paramètre).

Une autre solution consisterait à télécharger les résultats recherchés en fichier texte et l'ouvrir ensuite... mais l'idéal serait de ne rien télécharger, d'où ma question.

Merci par avance pour tout conseil!
Matthieu