Enregistrer en local un Fichier excel étant sur un serveur FTP

anthooooony

XLDnaute Occasionnel
Bonjour à toutes à et à tous,

Je cherche un moyen d'enregistrer en local un Fichier excel étant sur un serveur FTP.

J'ai trouvé plein de forum à ce sujet, mais c'était plus pour enregistrer un document en local vers un serveur FTP.

Alors j'ai un code assez simple mais qui ne marche pas vraiment..
Auriez vous une piste ?
L'éditeur devra engistrer un doc xlsx chaque mois avec un nom de fichier identique&"Mois"

Code:
open ftp://00.00.00.000
user xxx_xxx
xxx
hash
bin
get "extract_pieces_non_soldees.xlsx"
bye

Merci d'avance

Anthooooony
 

pyfux

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Bonsoir,

Ce n'est pas vraiment une question pour Excel. Si j'ai bien compris tu veux récupérer un fichier xlsx présent sur un FTP et l'enregistrer en local?

A partir d'excel ou d'une commande DOS?
Si c'est pour du DOS, tu n'es pas sur le bon forum...

++
 

bérylion

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Bonjour à toutes à et à tous,

Je cherche un moyen d'enregistrer en local un Fichier excel étant sur un serveur FTP.

J'ai trouvé plein de forum à ce sujet, mais c'était plus pour enregistrer un document en local vers un serveur FTP.

Alors j'ai un code assez simple mais qui ne marche pas vraiment..
Auriez vous une piste ?
L'éditeur devra engistrer un doc xlsx chaque mois avec un nom de fichier identique&"Mois"

Code:
open ftp://00.00.00.000
user xxx_xxx
xxx
hash
bin
get "extract_pieces_non_soldees.xlsx"
bye

Merci d'avance

Anthooooony


Salut

un bout de code qui peut faire la maille :

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

Function RecupFTP(serveur$, port%, login$, password$, DirOfFileToGet$, NameOfFileToGet$, TargetFullname$) As Boolean
ConnectionInternet = InternetOpen("", 1, "", "", 0)
If ConnectionInternet Then _
    ConnectionFTP = InternetConnect(ConnectionInternet, serveur, port, login, password, 1, 0, 0)
If FtpSetCurrentDirectory(ConnectionFTP, DirOfFileToGet) Then _
RecupFTP = FtpGetFile(ConnectionFTP, NameOfFileToGet, TargetFullname, False, 0, &H0, 0)
End Function

Sub ExempleTest()
' paramètres à ajuster chez toi :
RecupFTP _
         "hd1.freebox.fr", _
         21, _
         "freebox", _
         "", _
         "/Disque dur/test", _
         "TestCopieFTP.xlsx", _
         "c:\CopieFTPTestOK.xlsx"
End Sub

Je te laisse terminer la partie "nom de fichier identique&"Mois", à mettre en variable qqpart dans la sub qui appelle la function.

Enjoy...

;)
 

anthooooony

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Bonjour pyfux et bérylion

pyfux C'est bien de récupérer un fichier xlsx présent sur un FTP et l'enregistrer en local que je souhaite

bérylion :J'ai copié ton code, mais rien ne se passe, il n'y a aucun message d'erreur ce qui est bizarre..
 

bérylion

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Salut

recopie ce code intégralement dans un module standard :
(petite modif au niveau de l'exemple mais le reste est identique à celui donné plus haut)

VB:
'Code à insérer dans un module standard :

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

Function RecupFTP(serveur$, port%, login$, password$, DirOfFileToGet$, NameOfFileToGet$, TargetFullname$) As Boolean

' Cette fonction copie un fichier en local depuis un serveur FTP 
' et renvoie VRAI si la copie a été réalisée ou FAUX dans le cas contraire

ConnectionInternet = InternetOpen("", 1, "", "", 0)
If ConnectionInternet Then _
    ConnectionFTP = InternetConnect(ConnectionInternet, serveur, port, login, password, 1, 0, 0)
If FtpSetCurrentDirectory(ConnectionFTP, DirOfFileToGet) Then _
    RecupFTP = FtpGetFile(ConnectionFTP, NameOfFileToGet, TargetFullname, False, 0, &H0, 0)
End Function

Sub ExempleTest()
' Procédure "exemple" servant à appeler la fonction de copie
' dans ce cas on peut exploiter la valeur renvoyée (vrai ou faux) pour afficher un msg

' paramètres à ajuster chez toi dans l'ordre :
' nom du serveur FTP
' port de connexion au serveur
' nom d'utilisateur (login)
' mot de passe
' chemin du fichier à copier
' nom du fichier à copier
' chemin et nom du fichier à créer / à toi de mettre ce paramètre en variable 

select case RecupFTP _
         	"hd1.freebox.fr", _
         	21, _
         	"freebox", _
         	"", _
         	"/Disque dur/test", _
         	"TestCopieFTP.xlsx", _
         	"c:\CopieFTPTestOK.xlsx"
	case true: msgbox "Fichier copié avec succès"
	case false: msgbox "Le fichier n'a pas été copié"
end select
End Sub

Tu peux m'envoyer ton code en MP mais ça m'aidera pas plus.
Le mieux est encore de le poster ici, on n'a pas besoin de connaitre les noms de serveur login et MdP puisqu'ils sont passés en argument de la fonction.

Fais un essai en pas à pas, et regarde la ou ça coince puis revient nous dire...

A+
 

anthooooony

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Salut !

Merci encore

J'ai un message d erreur de compilation : "erreur de syntaxe."
Au niveau du select case
j'ai l'impression que c est l'url du ftp qui n'aime pas. J'ai essayé
"ftpperso.sfr.fr
ftpperso.sfr.fr/index.php
http://ftpperso.sfr.fr/index.php" Mais j'ai toujours la meme erreur.

Select case RecupFTP _
"ftpperso.sfr.fr", _
21, _
"sop.......perso.sfr.fr", _
"eK9obFeJmj", _
"/Disque dur/", _
"Classeur1.xlsx", _
"C:\Documents and Settings\RC1194\Desktop\Classeur1.xlsx"
Case True: MsgBox "Fichier copié avec succès"
Case False: MsgBox "Le fichier n'a pas été copié"
End Select
End Sub

Désolé de vous resolliciter..
Anthooooony
 

bérylion

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Salut !

Merci encore

J'ai un message d erreur de compilation : "erreur de syntaxe."
Au niveau du select case
j'ai l'impression que c est l'url du ftp qui n'aime pas. J'ai essayé
"ftpperso.sfr.fr
ftpperso.sfr.fr/index.php
http://ftpperso.sfr.fr/index.php" Mais j'ai toujours la meme erreur.



Désolé de vous resolliciter..
Anthooooony

toutes mes confuses...

j'ai fait ça à la volée, entre la nicotine et la caféine, et j'ai omis le détail kifalaipa !

VB:
'Code à insérer dans un module standard :

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

Function RecupFTP(serveur$, port%, login$, password$, DirOfFileToGet$, NameOfFileToGet$, TargetFullname$) As Boolean

' Cette fonction copie un fichier en local depuis un serveur FTP
' et renvoie VRAI si la copie a été réalisée ou FAUX dans le cas contraire

ConnectionInternet = InternetOpen("", 1, "", "", 0)
If ConnectionInternet Then _
    ConnectionFTP = InternetConnect(ConnectionInternet, serveur, port, login, password, 1, 0, 0)
If FtpSetCurrentDirectory(ConnectionFTP, DirOfFileToGet) Then _
    RecupFTP = FtpGetFile(ConnectionFTP, NameOfFileToGet, TargetFullname, False, 0, &H0, 0)
End Function

Sub ExempleTest()
' Procédure "exemple" servant à appeler la fonction de copie
' dans ce cas on peut exploiter la valeur renvoyée (vrai ou faux) pour afficher un msg

' paramètres à ajuster chez toi dans l'ordre :
' nom du serveur FTP
' port de connexion au serveur
' nom d'utilisateur (login)
' mot de passe
' chemin du fichier à copier
' nom du fichier à copier
' chemin et nom du fichier à créer / à toi de mettre ce paramètre en variable

select case RecupFTP( _
            "hd1.freebox.fr", _
            21, _
            "freebox", _
            "", _
            "/Disque dur/test", _
            "TestCopieFTP.xlsx", _
            "c:\CopieFTPTestOK.xlsx")
    case true: msgbox "Fichier copié avec succès"
    case false: msgbox "Le fichier n'a pas été copié"
end select
End Sub

Rajoute les parenthèses manquantes :

select case RecupFTP(...)

et tes arguments à la place des "..."

le nom du serveur devrait être "perso.sfr.fr" (sans le "ftp://")


;)
 

pyfux

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Bonjour,

Un fichier .bat (de commandes dos) contenant:
ftp -n -s:Recup.ftp
exit


Et dans le même dossier, un fichier nommé: Recup.ftp contenant:
open [Nom-du-serveur-ftp]
user
[Login]
[Mot de passe]
binary
cd [dossier-contenant-le-fichier]/
mget [nom du fichier].xlsx
yes
quit


Il suffit de remplacer les paramètres entre crochet par tes valeurs.

On peut envisager le lancement de ce script DOS à partir d'Excel avec la commande VBA:
Shell ("[Chemin d'accès au script]\[FichierDOS].bat")

A l'issu de ce script, en VBA on peut vérifier si le fichier est bien récupéré, le renommer...

Pyfux
 

anthooooony

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Bonjour bérylion,

Je suis une quiche grr!!! CA ne marche pas malgré tes retours grrrr !!!!
Ca marque "Le fichier n'a pas été copié"
Je ne sais pas, pourquoi, et à quel moment ça bloque, est ce qu'il a reussi en rentrer sur le ftp, et ce qu'il a trouvé le fichier, s'il a réussi à copier, et a t il était bloqué pour le coller.

Je continue à regarder de mon côté, merci de ton aide bérylion

Code:
'Code à insérer dans un module standard :

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

Function RecupFTP(serveur$, port%, login$, password$, DirOfFileToGet$, NameOfFileToGet$, TargetFullname$) As Boolean

' Cette fonction copie un fichier en local depuis un serveur FTP
' et renvoie VRAI si la copie a été réalisée ou FAUX dans le cas contraire

ConnectionInternet = InternetOpen("", 1, "", "", 0)
If ConnectionInternet Then _
    ConnectionFTP = InternetConnect(ConnectionInternet, serveur, port, login, password, 1, 0, 0)
If FtpSetCurrentDirectory(ConnectionFTP, DirOfFileToGet) Then _
    RecupFTP = FtpGetFile(ConnectionFTP, NameOfFileToGet, TargetFullname, False, 0, &H0, 0)
End Function

Sub ExempleTest()
' Procédure "exemple" servant à appeler la fonction de copie
' dans ce cas on peut exploiter la valeur renvoyée (vrai ou faux) pour afficher un msg

' paramètres à ajuster chez toi dans l'ordre :
' nom du serveur FTP
' port de connexion au serveur
' nom d'utilisateur (login)
' mot de passe
' chemin du fichier à copier
' nom du fichier à copier
' chemin et nom du fichier à créer / à toi de mettre ce paramètre en variable

Select Case RecupFTP( _
            "ftpperso.sfr.fr", _
            21, _
            "sophiegomez.perso.sfr.fr", _
            "eK9obFeJmj", _
            "/Disque dur/", _
            "Classeur1.xlsx", _
            "C:\Classeur1.xlsx")
    Case True: MsgBox "Fichier copié avec succès"
    Case False: MsgBox "Le fichier n'a pas été copié"
End Select
End Sub
 

anthooooony

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Bonjour pyfux,
Le fichier nommé "Recup.ftp" c'est quoi son extention?


1- Je crée un fichier bat avec comme info

ftp -n -s:Recup.ftp
exit

2- Je crée un autre fichier nommé Recup.ftp quelle doit etre son extention? Et j'ai bien noté qu'il fallait la mettre dans le même dossier

Merci à vous deux
 

pyfux

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Salut anthooooony,

le fichier Recup.ftp a pour extension .ftp
Mais tu utilises bloc-note pour l'éditer (commande contextuelle suite clique gauche :"ouvrir avec")

Tu peux aussi utiliser l'extension .txt (cela sera plus simple) mais modifie les commandes DOS:
ftp -n -s:Recup.txt
exit


Courage
 

bérylion

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

Bonjour bérylion,

Je suis une quiche grr!!! CA ne marche pas malgré tes retours grrrr !!!!
Ca marque "Le fichier n'a pas été copié"
Je ne sais pas, pourquoi, et à quel moment ça bloque, est ce qu'il a reussi en rentrer sur le ftp, et ce qu'il a trouvé le fichier, s'il a réussi à copier, et a t il était bloqué pour le coller.

Je continue à regarder de mon côté, merci de ton aide bérylion

Salut

bon, une petite modif qui te donne les résultats par étape :

VB:
'Code à insérer dans un module standard :

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

Function RecupFTP(serveur$, port%, login$, password$, DirOfFileToGet$, NameOfFileToGet$, TargetFullname$)

' Cette fonction copie un fichier en local depuis un serveur FTP
' et renvoie VRAI si la copie a été réalisée ou FAUX dans le cas contraire

ConnectionInternet = InternetOpen("", 1, "", "", 0)

If ConnectionInternet Then
    ConnectionFTP = InternetConnect(ConnectionInternet, serveur, port, login, password, 1, 0, 0)
    msg = "Connection internet OK"
Else
    msg = "Connection internet non active"
End If

If ConnectionFTP Then
        msg = msg & vbCrLf & "connection serveur OK"
Else
        msg = msg & vbCrLf & "connection serveur non activée"
End If


If FtpSetCurrentDirectory(ConnectionFTP, DirOfFileToGet) Then
    msg = msg & vbCrLf & "répertoire distant OK"
Else
    msg = msg & vbCrLf & "répertoire distant introuvable"
End If

If FtpGetFile(ConnectionFTP, NameOfFileToGet, TargetFullname, False, 0, &H0, 0) Then
    msg = msg & vbCrLf & "fichier copié"
Else
    msg = msg & vbCrLf & "fichier introuvable"
End If

RecupFTP = msg

End Function

Sub ExempleTest()
' Procédure "exemple" servant à appeler la fonction de copie
' dans ce cas on peut exploiter la valeur renvoyée (vrai ou faux) pour afficher un msg

' paramètres à ajuster chez toi dans l'ordre :
' nom du serveur FTP
' port de connexion au serveur
' nom d'utilisateur (login)
' mot de passe
' chemin du fichier à copier
' nom du fichier à copier
' chemin et nom du fichier à créer / à toi de mettre ce paramètre en variable

MsgBox RecupFTP( _
            "hd1.freebox.fr", _
            21, _
            "freebox", _
            "", _
            "/Disque dur/test", _
            "TestCopieFTP.xlsx", _
            "c:\CopieFTPTestOK.xlsx")

End Sub

ça te dira à quel niveau ça coince, et on verra ce qu'on peut faire.

A+
 

anthooooony

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

bérylion bonjour!

Merci ! c'est super complet !

L'erreur viendrait de la connexion au Ftp, "connection serveur non activée", du coup le reste ne marche pas !
Peux etre que c'est la faute du Ftp de SFR.

Lorsque j'utilise l'adresse ftp / l'ID et le mdp je reussi à me connecter c 'est bizarre, mais pas en passant par ton script.
Je vais voir, merci beaucoup en tout cas
 

bérylion

XLDnaute Occasionnel
Re : Enregistrer en local un Fichier excel étant sur un serveur FTP

bérylion bonjour!

Merci ! c'est super complet !

L'erreur viendrait de la connexion au Ftp, "connection serveur non activée", du coup le reste ne marche pas !
Peux etre que c'est la faute du Ftp de SFR.

Lorsque j'utilise l'adresse ftp / l'ID et le mdp je reussi à me connecter c 'est bizarre, mais pas en passant par ton script.
Je vais voir, merci beaucoup en tout cas

Salut

vérifie bien la syntaxe du nom de serveur : ftpperso.sfr.fr

la moindre faute de frappe ou "." en plus ou en moins et ça marchera pas...

(EDIT : meme remarque pour le login et le mot de passe !!)

bonne chance.

;)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 099
Membres
103 116
dernier inscrit
kutobi87