Ouvrir un lien csv bien précis par macro

  • Initiateur de la discussion Initiateur de la discussion Chris57
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Chris57

XLDnaute Occasionnel
Bonjour à tous,
au boulot nous devons chaque jours ouvrir une page internet qui nous renvoit sur une liste de fichiers .csv :
http://www.casimages.com/img.php?i=110123091205732085.jpg
Je peux pas vous donner le lien car il faut un abonnement pour y accéder...

Nous devons ouvrir le dernier csv, celui qui correspond à la date d'aujourd'hui. Le nom des .csv est sous la forme :
Jan 20 2011 05:45 1981 eon-france_prognose_20110119.csv
Jan 21 2011 05:45 1968 eon-france_prognose_20110120.csv
Jan 22 2011 05:45 1994 eon-france_prognose_20110121.csv
Jan 23 2011 05:45 1982 eon-france_prognose_20110122.csv
(ce qui est souligné est le lien)

puis avec une macro on récupère les données vers un autre classeur qui les traites.

Est-il possible d'automatiser cette action : Ouvrir la page internet puis ouvrir le bon lien .csv ?
 
Re : Ouvrir un lien csv bien précis par macro

Salut,la réponse est oui il te suffit d'extraire la date et de la comparer à la date courante,grossierement qqch comme
Code:
Option Explicit

Sub Tst()
Dim i As Long
Dim LastRow As Long, Ar() As String, d As Date

    LastRow = Feuil1.Range("A" & Rows.Count).End(xlUp).Row
    For i = 1 To LastRow
       Ar = Split(Feuil1.Range("A" & i), " ")
       d = CDate(Ar(0) & "/" & Ar(1) & "/" & Ar(2))
       If d = Date Then Debug.Print "OK"
    Next i
End Sub
à adapter à ton contexte
 
Dernière édition:
Re : Ouvrir un lien csv bien précis par macro

Effectivement on voit le lien du site mais il faut un abonnement pour accéder aux fichiers...

Salut,et alors il faut bien que tu cherches un peu : pour cela tu as le macro recorder et sous Excel Menu Données/Données Externes/Nouvelle Requete sur le Web
J'ai déjà pas mal cherché et j'ai pensé à une requète, mais voici le résultat si je la lance :
http://www.casimages.com/img.php?i=110126105955914400.jpg
et il n'y a rien d'importable. C'est peut être parce que c'est une adresse ftp...
Effectivement si je pouvais rapatrier les liens sur Excel, ce serai facile de dégoter le bon fichier...
 
Re : Ouvrir un lien csv bien précis par macro

Bonsoir à tous,


En fouillant un peut sur internet, j'ai trouvé cette macro qui copie un fichier d'internet en local (pour en faire ensuite le traitement qu'on désire) :
VB:
Function SaveWebBinary(strUrl, strFile) As Boolean
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Const ForWriting = 2
Dim web, varByteArray, strData, strBuffer, lngCounter, ado, fs, ts
    On Error Resume Next
    'Download the file with any available object
    Err.Clear
    Set web = Nothing
    Set web = CreateObject("WinHttp.WinHttpRequest.5.1")
    If web Is Nothing Then Set web = CreateObject("WinHttp.WinHttpRequest")
    If web Is Nothing Then Set web = CreateObject("MSXML2.ServerXMLHTTP")
    If web Is Nothing Then Set web = CreateObject("Microsoft.XMLHTTP")
    web.Open "GET", strUrl, False
    web.Send
    If Err.Number <> 0 Then
        SaveWebBinary = False
        Set web = Nothing
        Exit Function
    End If
    If web.Status <> "200" Then
        SaveWebBinary = False
        Set web = Nothing
        Exit Function
    End If
    varByteArray = web.ResponseBody
    Set web = Nothing
    'Now save the file with any available method
    On Error Resume Next
    Set ado = Nothing
    Set ado = CreateObject("ADODB.Stream")
    If ado Is Nothing Then
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set ts = fs.OpenTextFile(strFile, ForWriting, True)
        strData = ""
        strBuffer = ""
        For lngCounter = 0 To UBound(varByteArray)
            ts.Write Chr(255 And AscB(MidB(varByteArray, lngCounter + 1, 1)))
        Next
        ts.Close
    Else
        ado.Type = adTypeBinary
        ado.Open
        ado.Write varByteArray
        ado.SaveToFile strFile, adSaveCreateOverWrite
        ado.Close
    End If
    SaveWebBinary = True
End Function

et voici comment l'utiliser :
VB:
Sub Test()
Dim adressInternet As String, nomFichierInternet As String, pathFichierCopie As String, copieReussie As Boolean

    'adapter les variables suivante
    adressInternet = "http://www.ig.gmodules.com/"
    nomFichierInternet = "robots.txt"
    pathFichierCopie = "C:\tmpInternet.txt"
    
    'copier le fichier
    copieReussie = SaveWebBinary(adressInternet & nomFichierInternet, pathFichierCopie)
    
    If Not copieReussie Then MsgBox "Error lors de la copie du fichier"
    
End Sub

Elle fonctionne très bien pour des fichier texte, ou csv avec une adresse HTTP.
Peux-tu tester avec le FTP ?

Sinon, voici comment générer le nom du fichier csv "d'aujourd'hui" :
VB:
nomFichierInternet = "eon-france_prognose_" & Format(Now, "yyyymmdd") & ".csv"
A+
 
Re : Ouvrir un lien csv bien précis par macro

Hello,

j'avais déjà testé de récupérer le csv directement en créant son nom en fonction de la date, mais il me répond "fichier indispo". Peut-être parce que le site est protégé..
J'ai tenté ta macro et pareil, message d'erreur. Elle plante directement à l'adresse FTP du site.

J'ai tenté de faire une requète avec un autre site, puis dans la macro j'ai remplacé le nom du site par celui qui m'interresse.
Là il m'importe effectivement le texte du site, mais pas les liens hypertexte qui me renvoit vers les fichiers .csv..

Je poursuit ma recherche sur le net.
 
Re : Ouvrir un lien csv bien précis par macro

Re bonsoir,

En continuant à fouiner, j'ai trouvé cette macro (tout juste retouchée de cette source). J'ai essayé de l'adapter à ton cas, il ne te reste qu'à compléter le login et le mot de passe.
VB:
Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" (ByVal hConnect As Long, ByVal lpszRemoteFile As String, ByVal lpszNewFile As String, ByVal fFailIfExists As Long, ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, ByRef dwContext As Long) As Boolean

Sub TestCopie()
Dim bConnexion As Boolean, bFtp As Boolean, bCopie As Boolean, sSite As String, sDossier As String, sLogin As String, sMdp As String, sFichier As String, sPathCopie As String
    
    'variables à adapter
    sSite = "ftp1.meteomedia.ch"
    sDossier = ""       'Apparemment, dans ton exemple, il faut laisser cette variable vide
    sLogin = ""         'Utilisateur
    sMdp = ""           'Mot de passe
    sFichier = "eon-france_prognose_" & Format(Now, "yyyymmdd") & ".csv"
    sPathCopie = "C:\" & sFichier
    
    'récupérer le fichier
    bConnexion = InternetOpen("", 1, "", "", 0)
    If bConnexion Then
        bFtp = InternetConnect(bConnexion, sSite, 21, sLogin, sMdp, 1, 0, 0)
        If FtpSetCurrentDirectory(bFtp, sDossier) Then
            bCopie = FtpGetFile(bFtp, sFichier, sPathCopie, False, 0, &H0, 0)
        End If
    End If
    If Not bCopie Then MsgBox "Erreur: le fichier n'a pas été copié."
End Sub
Par contre, n'ayant accès à aucun site FTP avec mot de passe, je n'ai pas pu testé le code. Peux-tu me dire si il marche s'il te plait ?


A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour