Boîte de dialogue Internet Explorer [Résolu]

Preetamus
Messages postés
14
Date d'inscription
mercredi 25 juin 2008
Dernière intervention
10 juillet 2008
- 9 juil. 2008 à 16:19 - Dernière réponse : Preetamus
Messages postés
14
Date d'inscription
mercredi 25 juin 2008
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
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 10 juil. 2008 à 09:25
3
Merci
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

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de Renfield
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 juil. 2008 à 16:27
0
Merci
envoies toi même la requete HTTP ... tu recevra le contenu du fichier directement...

passes par MsInet, par exemple
Commenter la réponse de Renfield
Preetamus
Messages postés
14
Date d'inscription
mercredi 25 juin 2008
Dernière intervention
10 juillet 2008
- 9 juil. 2008 à 16:50
0
Merci
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
Commenter la réponse de Preetamus
Preetamus
Messages postés
14
Date d'inscription
mercredi 25 juin 2008
Dernière intervention
10 juillet 2008
- 9 juil. 2008 à 16:53
0
Merci
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
Commenter la réponse de Preetamus
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 juil. 2008 à 16:56
0
Merci
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.
Commenter la réponse de Renfield
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 juil. 2008 à 17:01
0
Merci
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.
Commenter la réponse de Renfield
Preetamus
Messages postés
14
Date d'inscription
mercredi 25 juin 2008
Dernière intervention
10 juillet 2008
- 9 juil. 2008 à 17:05
0
Merci
Merci pour ta réponse je vais creuser un peu plus le sujet.. au pire je reviendrais si jai besoin de précisions ^^
Commenter la réponse de Preetamus
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 10 juil. 2008 à 09:23
0
Merci
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).
Commenter la réponse de Renfield
Preetamus
Messages postés
14
Date d'inscription
mercredi 25 juin 2008
Dernière intervention
10 juillet 2008
- 10 juil. 2008 à 10:49
0
Merci
Merci beaucoup. jvai voir plus en détail ce code que tu as écrit. en tout cas jvai surement apprendre plein de trucs

Preetamus
Commenter la réponse de Preetamus

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.