Boîte de dialogue Internet Explorer

Résolu
Preetamus Messages postés 14 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 10 juillet 2008 - 9 juil. 2008 à 16:19
Preetamus Messages postés 14 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 10 juillet 2008 - 10 juil. 2008 à 10:49
Bonjour,

j'ai créé une macro qui se log sur un site et ensuite va chercher un tableau. Ce tableau je veut l'ouvrir en excel donc je simule un clique sur le lien "Télécharger" sur la page. Jusqu'ici aucun problème pour implémenter sous vba. Et c'est là que je bloque. Internet Explorer me demande alors si je ve ouvrir le fichier ou l'enregistrer (avec la boîte de dialogue classique) et je ne sais pas comment "dire" à explorer d'ouvrir le fichier concerné

Sachant que j'ai plus de 500 fichier à télécharger, il me faut trouver une solution pour automatiser tout cela.

Preetamus

9 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 juil. 2008 à 09:25
Option Explicit

Private Const
READYSTATE_COMPLETE = 4
Private Const READYSTATE_INTERACTIVE = 3

Private moIE As Object

'# Cette procédure va instancier IE afin de se connecter sur le site.
Private Sub InitIE(ByRef vsLogin As String, ByRef vsPassword As String)
   Set moIE = CreateObject("InternetExplorer.Application")
   moIE.Visible = False
   moIE.navigate "http://cib.natixis.com/"
 
   '# Après un Navigate, on attend que le ReadyState soit à Complete
   Do
       DoEvents
   Loop Until moIE.readyState = READYSTATE_COMPLETE

   '# On entre les identifiants
   moIE.document.getElementsByName("pLoginName")(0).Value = vsLogin
   moIE.document.getElementsByName("pPwd")(0).Value = vsPassword
   moIE.document.getElementsByName("ctl00$column3$ctl00$buttonLogin")(0).Click

   '# Après avoir joué avec les formulaires, on attend que le ReadyState soit à Interactive
   Do
       DoEvents
   Loop Until moIE.readyState = READYSTATE_INTERACTIVE
   
   Do
       DoEvents
   Loop Until moIE.readyState = READYSTATE_COMPLETE

   '# On se rend sur la page des données
   moIE.navigate "https://cib.natixis.com/net/derivatives/aspx/interestforwardrateswap.aspx"

   Do
       DoEvents
   Loop Until moIE.readyState = READYSTATE_COMPLETE
End Sub<hr />
Private Sub QuitIE()
   moIE.Quit
   Set moIE = Nothing
End Sub<hr />
'# Cette fonction va interroger le site pour obtenir les données concernant une date donnée.
'# Le résultat se présente sous la forme de données CSV.
Private Function GetForward(ByVal vdWhen As Date) As String
   '# Pour cela, on a juste à saisir la date dans le format requis
   moIE.document.getElementsByName("_ctl0:tabVol:ucHisto1:CdcPanel1:cdb_from")(0).Value = Format$(vdWhen, "DD/MM/YYYY") 'rentre la date dans le champ de recherche
   '# On valide la saisie
   moIE.document.Links(42).Click
   
   '# Une fois les données chargées...
   Do
       DoEvents
   Loop Until moIE.readyState = READYSTATE_INTERACTIVE
   
   Do
       DoEvents
   Loop Until moIE.readyState = READYSTATE_COMPLETE

   '# On lance la conversion tableau HTML => CSV
   GetForward = HTMLToCsv(moIE.document.getElementsByName("_ctl0_tabVol_ucHisto1_CdcPanel3_BigGrid1_myGrid")(0).innerHTML)
End Function<hr />
'# Cette fonction va convertir notre tableau HTML en données CSV
'# Les tags composant ce tableau sont alignés à gauche, et ils sont organisés en lignes.
Private Function HTMLToCsv(ByRef vsInput As String) As String
Dim xsLines() As String
Dim i As Long
Dim sTag As String
Dim sData As String
Dim nPos As Long
Dim sCurrentRow As String
   '# On a donc simplement à séparer les lignes, pour qu'en tête de celles-ci nous trouvions les ouvertures des différents tags HTML
   xsLines = Split(vsInput, vbCrLf)
   For i = 0 To UBound(xsLines)
       '# On extrait le nom du tag
       nPos = InStr(xsLines(i), ">")
       sTag = Mid$(xsLines(i), 2, nPos - 2)
       If InStr(sTag, " ") Then
           sTag = Left$(sTag, InStr(sTag, " ") - 1)
       End If
       
       '# Puis les éventuelles données
       sData = Mid$(xsLines(i), nPos + 1)
       nPos = InStr(sData, "<")
       If nPos Then
           sData = Left$(sData, nPos - 1)
       End If
       If LenB(sData) Then
           sData = Replace(sData, " ", " ")
       End If
       
       '# On lance la converion pour un élément
       GoSub ConvertItem
   Next i
   '# Une fois le traitement terminé, on ajoute la dernière ligne analysée au contenu déjà récupéré
   sTag = "TR"
   GoSub ConvertItem
Exit Function
ConvertItem:
   Select Case sTag
       Case "TR"
           If LenB(sCurrentRow) Then
               '# On ajoute une ligne a la sortie
               If LenB(HTMLToCsv) Then
                   HTMLToCsv = HTMLToCsv & vbCrLf
               End If
               '# Et on ajoute la ligne que l'on vient d'analyser
               HTMLToCsv = HTMLToCsv & sCurrentRow
               sCurrentRow = vbNullString
           End If
       Case "TD"
           '# On ajoute un séparateur ";" entre chaque colonne
           If LenB(sCurrentRow) Then
               sCurrentRow = sCurrentRow & ";"
           End If
           sCurrentRow = sCurrentRow & sData
   End Select
   Return
End Function<hr />

  ' Et pour faire fonctionner le tout :
  ' On initialise le transfert
   InitIE "xxxxxx", "************"
       '# On demande les données pour une date précise
       MsgBox GetForward(#7/7/2008#), vbOKOnly, "Lundi 07/07/2008"
       MsgBox GetForward(#7/8/2008#), vbOKOnly, "Mardi 08/07/2008"
       MsgBox GetForward(#7/9/2008#), vbOKOnly, "Mercredi 09/07/2008"
   '# Enfin, on ferme IE
   QuitIE

<hr />,
,
,
,
,

----

By Renfield








Renfield





Admin CodeS-SourceS

- MVP Visual Basic
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 juil. 2008 à 16:27
envoies toi même la requete HTTP ... tu recevra le contenu du fichier directement...

passes par MsInet, par exemple
0
Preetamus Messages postés 14 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 10 juillet 2008
9 juil. 2008 à 16:50
Comme d'habitude tu es le plus rapide à répondre. merci

Le prob c que le tableau que je ve ouvrir dépends de la saisie que je fais sur le site. tu penses que c possible de lancer la requête directement de vba- et ensuite ouvrir le tableau xls via excel?

je ne connais pas MsInet
0
Preetamus Messages postés 14 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 10 juillet 2008
9 juil. 2008 à 16:53
pour info voilà mon code vba (simplifié mais il marche aussi). ddada est la date à laquelle je veux obtenir les données du tableau.

Function forward(ddada)


'fonction qui va chercher les taux forward de l'euribor 3M et les télécharge dans excel
'dans un fichier s'appelant downloadPage


Set IE = CreateObject("InternetExplorer.application")


IE.Visible = False


muda = CStr(ddada)
IE.navigate "http://cib.natixis.com/"
   




While Timer = False
Wend


IE.document.all("pPwd").Value = "****"
IE.document.all("pLoginName").Value = "****"
IE.document.all("ctl00$column3$ctl00$buttonLogin").Click




While Timer = False
Wend


IE.navigate "https://cib.natixis.com/net/derivatives/aspx/interestforwardrateswap.aspx"


While Timer = False
Wend


IE.document.all("_ctl0:tabVol:ucHisto1:CdcPanel1:cdb_from").Value = muda 'rentre la date dans le champ de recherche
IE.document.Links(42).Click 'click sur valider




IE.document.Links(43).Click 'click sur télécharger
'IE.Application.Wait


 


End Function
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 juil. 2008 à 16:56
tu peux faire joujou avec ton site web (manuellement ou en pilotant la chose)...

ca finira, je pense par un envoi de tes parametres en POST ou GET, selon méthode du formulaire concerné...

reste que tout cela peut être fait sans WebBrowser, en dialoguant avec le serveur web, en face.

tu te fais en gros passer IE, validant le forumlaire que tu viens de remplir...

MsInet (ou autre, hein) est un composant Microsoft qui permet justement de dialoguer en HTTP. c'est assez documenté, et le siet possède, j'en suis sur un tas d'exemples.

a voir le site concerné, etc.
j'ai pas de réponse toute faite.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 juil. 2008 à 17:01
ah, un domaine que je connais bien ^^
(et Natexis, euh, pardon, Natixis était un de nos clients)


concernant ton code, méfies toi de
While Timer = False
Wend

qui ne garantie pas grand chose, au final...
se fier plutot au ReadyState

si le coeur t'en dit, files moi Login & Pass par MP, je verrai demain ce que je puis faire pour toi.
0
Preetamus Messages postés 14 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 10 juillet 2008
9 juil. 2008 à 17:05
Merci pour ta réponse je vais creuser un peu plus le sujet.. au pire je reviendrais si jai besoin de précisions ^^
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 juil. 2008 à 09:23
finalement, après avoir vu précisément la chose, on peux greffer quelques choses a ton code afin de récupérer les données.

ci dessous, le code complété, corrigé, commenté...

a toi par la suite de placer les données CSV obtenues dans Excel (ce qui n'est pas très complexe, c'est un format reconnu par ce dernier).
0
Preetamus Messages postés 14 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 10 juillet 2008
10 juil. 2008 à 10:49
Merci beaucoup. jvai voir plus en détail ce code que tu as écrit. en tout cas jvai surement apprendre plein de trucs

Preetamus
0
Rejoignez-nous