comment agir sur internet via un code VBA ?

cecile_64

XLDnaute Nouveau
Bonjour à tous,

Je voudrais faire un code qui va chercher un taux sur une page internet (avec internet explorer), à une date rentrée par l'utilisateur, pour l'utiliser plus tard.
J'ai réussi à aller chercher un taux sur la page d'un site, mais le taux est celui du jour... pour pouvoir avoir le bon taux à la bonne date, il faut quand je suis sur le site internet, que je clique sur un petit calendrier, et choisissent une date dedans. à ce moment, la page web se modifie (sans changer son url) pour changer la date, et le taux qui va avec.
Je pense que mon principal problème est que ce calendrier est enfoui dans une grosse arborescence de html, et mon manque de connaissance en html me bloque pour avancer.
Les tuto que je lis m'aident à cliquer et modifier la barre d'adresse de google par exemple, mais je n'arrive pas à les adapter pour cliquer sur ce calendrier.

Je voudrais savoir si quelqu'un pourrait m'aider à avancer?
voici l'adresse de la page internet : EUR 1Y Euribor (360 Day) | EUR8Y | Cotations en temps réel
Je voudrais cliquer sur le calendrier situé au milieu gauche de la page, en mettant par exemple la date au 01/01/2012.

ci_joint mon code pour simplement obtenir le taux en date du jour (sans intervenir sur le calendrier) :

Code:
Public Sub recup_taux_euribor12m()

Dim lienInternet As SHDocVw.InternetExplorer
Dim pageInternet As MSHTML.HTMLDocument
Dim leTaux As MSHTML.HTMLSpanElement
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 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
    tauxeuribor12m = CDbl(Val(tauxWeb))
   
   'cadreDate = pageInternet.getElementById("form")(0)
    MsgBox tauxeuribor12m, Title:="Le taux euribor12m"
   

       
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

Merci d'avance pour votre aide !
 

cecile_64

XLDnaute Nouveau
Re : comment agir sur internet via un code VBA ?

Après plus de recherche, j'ai l'impression ( je dis bien l'impression) qu'il faut que je commande le code de la page web avec une commande en vba. je vous met le code actuel, qui ne marche pas mais bon, c'est peutetre plus facile de corriger que de partir de rien....

Code:
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
 

cecile_64

XLDnaute Nouveau
Re : comment agir sur internet via un code VBA ?

bon personne ne me répond mais j'avance petit à petit...
voici la version actuelle de mon code :

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




ce code va bien sur internet, modifie la date du calendrier, prends le taux recherché.
Le problème c'est que souvent le code est trop rapide et n'attends pas que la date soit changée pour récupérer le taux. Du coup il me récupère le taux d'aujourd'hui et pas celui de la date à laquelle je le veux....

Donc maintenant je cherche un moyen de faire patienter mon code avant de récupérer le taux.

des idées?
 

cecile_64

XLDnaute Nouveau
Re : comment agir sur internet via un code VBA ?

bon ben personne ne m'a aidé sur ce forum, mais je met la solution au probleme quand meme : ce code permet d'aller sur internet, de choisir une date et de récupérer le taux de cette date :

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




J'espère que ca aidera au moins quelqu'un !
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa