VBA- comment extraire des données sur internet via un programme vba ?
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 2012
-
3 août 2012 à 09:52
mlbzh -
15 nov. 2012 à 11:23
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 !!!
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 20121 8 août 2012 à 09:28
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 !
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention 2 juin 20161 3 août 2012 à 11:32
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
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 20121 3 août 2012 à 14:15
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....
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention 2 juin 20161 3 août 2012 à 15:41
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
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 20121 6 août 2012 à 15:22
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
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention 2 juin 20161 8 août 2012 à 13:08
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)
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 20121 9 août 2012 à 12:20
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 !
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 10 août 2012 à 16:50
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
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 20121 10 août 2012 à 17:45
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
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 20121 13 août 2012 à 09:47
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 !
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 20121 13 août 2012 à 09:51
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?
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 20121 13 août 2012 à 15:38
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....
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 14 août 2012 à 10:21
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.
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
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 20121 14 août 2012 à 10:55
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 ...
cs_cecile64
Messages postés15Date d'inscriptionvendredi 15 juin 2012StatutMembreDernière intervention17 août 20121 14 août 2012 à 12:02
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).
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.