Preetamus
Messages postés14Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention10 juillet 2008
-
9 juil. 2008 à 16:19
Preetamus
Messages postés14Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention10 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.
'# 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
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
Preetamus
Messages postés14Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention10 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?
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202172 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.