IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Upload fichier sur FTP via Macro VBA ne fonctionne pas [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut Upload fichier sur FTP via Macro VBA ne fonctionne pas
    Bonjour,

    Je tente d'uploader un fichier texte sur un serveur FTP en VBA sous Excel 2010 en utilisant le code suivant (qui s'inspire du tuto https://access.developpez.com/source...hiers#EnvoiFTP) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    Private Declare Function InternetCloseHandle Lib "wininet.dll" _
      (ByVal hInet As Long) As Integer
     
    Private 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
     
    Private 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
     
    Private Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias _
    "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, _
    ByVal lpszDirectory As String) As Boolean
     
    Private 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
     
    Private Declare Function FtpPutFile Lib "wininet.dll" Alias _
    "FtpPutFileA" (ByVal hConnect As Long, ByVal lpszLocalFile As String, _
    ByVal lpszNewRemoteFile As String, ByVal dwFlags As Long, _
    ByVal dwContext As Long) As Boolean
     
    Private Declare Function FtpGetCurrentDirectory Lib "wininet.dll" Alias "FtpGetCurrentDirectoryA" ( _
    ByVal hFtpSession As Long, _
    ByVal lpszDirectory As String, _
    ByRef lpdwCurrentDirectory As Long) As Boolean
     
    Sub Dashboard_export()
     
        Dim blok As Boolean
        Dim errorCode As Long
     
        'Gestion FTP
        Dim HwndConnect As Long
        Dim HwndOpen As Long
     
        'Ouvre Internet
        HwndOpen = InternetOpen("SiteWeb", 0, vbNullString, vbNullString, 0)
        'Connection au site ftp
        HwndConnect = InternetConnect(HwndOpen, "monftp", 21, "monidentifiant", "monmotdepasse", 1, 0, 0)
     
        'positionnement du curseur dans le répertoire
        blok = FtpSetCurrentDirectory(HwndConnect, "/tmp")
     
        ' Téléchargement du fichier sur le FTP
        blok = FtpPutFile(HwndConnect, "C:\test\test.txt", "coucou.txt", &H0, 0)
        errorCode = Err.LastDllError
     
        InternetCloseHandle HwndConnect 'Ferme la connection
        InternetCloseHandle HwndOpen 'Ferme internet
     
    End Sub
    Lorsque j'accède au FTP, je vois bien qu'un fichier "coucou.txt" a été créé mais il est vide !
    FtpSetCurrentDirectory renvoit bien "True" par contre FtpPutFile renvoit "False" même si un fichier "coucou.txt" est bien créé.
    Je ne suis pas sur de bien utiliser "Err.LastDllError" mais j'ai un code renvoyé égal à 12002 mais ce dernier ne me renseigne pas beaucoup sur mon problème...

    Auriez-vous une idée de ce qui ne va pas ?

    Merci par avance pour votre aide

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 11
    Par défaut
    Salut,
    je suis parfaitement nul, je vais donc probablement pas pouvoir t'aider mais dans le doute, as tu bien rentré du texte dans le fichier C:\test\test.txt ?

    nvm c'est débile mais si le fichier ce crée sa veux dire que la fonction ce lance mais qu'elle plante en cours de route puisqu'elle retour false

    ici tu as un exemple similaire : http://docvb.free.fr/apidetail.php?idapi=199

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blok = FtpPutFile(HwndConnect, "C:\test\test.txt", "coucou.txt", &H0, 0)
    peux-tu remplacer " &H0" par "FTP_TRANSFER_TYPE_ASCII" ou par un autre type de transfert car sa vient forcement de par la

    après s'il faut je piges rien du tout mais avec de la chance xD au moins tu as une réponse

    bon courage a toi

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Bonjour Shibiko,

    Déjà merci pour ta réponse

    Il y a bien du texte dans le fichier. Et lors je copie/colle le chemin dans l'explorateur, le fichier s'ouvre bien.

    Du coup, j'ai fait ce que tu as dit en déclarant d'abord l'énum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    Private Declare Function InternetCloseHandle Lib "wininet.dll" _
      (ByVal hInet As Long) As Integer
     
    Private 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
     
    Private 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
     
    Private Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias _
    "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, _
    ByVal lpszDirectory As String) As Boolean
     
    Private 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
     
    Private Declare Function FtpPutFile Lib "wininet.dll" Alias _
    "FtpPutFileA" (ByVal hConnect As Long, ByVal lpszLocalFile As String, _
    ByVal lpszNewRemoteFile As String, ByVal dwFlags As Long, _
    ByVal dwContext As Long) As Boolean
     
    Private Declare Function FtpGetCurrentDirectory Lib "wininet.dll" Alias "FtpGetCurrentDirectoryA" ( _
    ByVal hFtpSession As Long, _
    ByVal lpszDirectory As String, _
    ByRef lpdwCurrentDirectory As Long) As Boolean
     
    Public Enum eTRANSFERT_TYPE
        FTP_TRANSFER_TYPE_ASCII = &H1
        FTP_TRANSFER_TYPE_BINARY = &H2
    End Enum
     
    Sub Dashboard_export()
     
        Dim blok As Boolean
        Dim errorCode As Long
     
        'Gestion FTP
        Dim HwndConnect As Long
        Dim HwndOpen As Long
     
        'Ouvre Internet
        HwndOpen = InternetOpen("SiteWeb", 0, vbNullString, vbNullString, 0)
        'Connection au site ftp
        HwndConnect = InternetConnect(HwndOpen, "monftp", 21, "monidentifiant", "monmotdepasse", 1, 0, 0)
     
        'positionnement du curseur dans le répertoire
        blok = FtpSetCurrentDirectory(HwndConnect, "/tmp")
     
        ' Téléchargement du fichier sur le FTP
        blok = FtpPutFile(HwndConnect, "C:\test\test.txt", "coucou.txt", FTP_TRANSFER_TYPE_ASCII, 0)
        errorCode = Err.LastDllError
     
        InternetCloseHandle HwndConnect 'Ferme la connection
        InternetCloseHandle HwndOpen 'Ferme internet
     
    End Sub
    Mais même combat, le fichier est toujours créé vide...d'autres idées ?

    Merci par avance

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Par défaut FTP_TRANSFER_TYPE_UNKNOWN
    Bonjour,

    Vous pouvez tester en utilisant FTP_TRANSFER_TYPE_UNKNOWN (=&H0) au lieu de FTP_TRANSFER_TYPE_ASCII.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    blok = FtpPutFile(HwndConnect, "C:\test\test.txt", "coucou.txt", FTP_TRANSFER_TYPE_UNKNOWN, 0)
    Sinon, vérifiez que votre serveur est bien calibré sur le port 21, faites un test avec FileZilla.
    Bonne chance.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Bonjour,

    Merci beaucoup pour ton retour Araigné !

    Bon on progresse :
    - en utilisant le paramètre FTP_TRANSFER_TYPE_UNKNOWN (=&H0) au lieu de FTP_TRANSFER_TYPE_ASCI ça ne fonctionne pas.
    - en utilisant Filezilla, ça fonctionne.

    Du coup, j'ai installé Wireshark et j'ai essayé de regarder les différences.

    En utilisant la macro, voici les traces :

    Nom : Capture_1.PNG
Affichages : 1655
Taille : 7,7 Ko

    Et rien ne se passe après. La fonction FTPPUTFILE sort avec une valeur "False".

    En tentant depuis Filezilla, le résultat est le suivant :

    Nom : Capture_2.PNG
Affichages : 1682
Taille : 11,4 Ko

    J'ai l'impression que Filezilla utilise la commande PASV qui se traduit par le passage en mode PASSIF de la connexion et le transfert fonctionne bien. Ce mode est obligatoire car je suis en entreprise et il doit y avoir du firewall entre mon poste et le serveur FTP.
    D'ailleurs, si je force Filezilla en mode actif sans retour possible en mode passif, ça ne fonctionne plus non plus.

    Du coup savez vous comment ce paramètre peut se gérer côté vb ?

    Merci par avance !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    C'est bon, ça fonctionne !

    Pour passer la connexion en mode passif et ainsi laisser le serveur en attente d'une deuxième connexion sur un port dynamique côté serveur (vs port 20 en mode actif), il faut spécifier le paramètre suivant dans la fonction InternetConnect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HwndConnect = InternetConnect(HwndOpen, "monftp", 21, "monidentifiant", "monmotdepasse", 1, &H8000000, 0)
    &H8000000 correspond à la constante INTERNET_FLAG_PASSIVE (voir doc doc microsoft). On voit ensuite bien sous Wireshark que la commande PASV est envoyée du client vers le serveur.

    Merci pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Winsocks : Upload fichier sur ftp via proxy
    Par evuillet dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/08/2015, 03h50
  2. [PHP 5.3] upload fichier sur ftp via php
    Par victoires dans le forum Langage
    Réponses: 1
    Dernier message: 11/10/2011, 14h49
  3. [.NET2]Upload Fichier sur FTP (FtpWebRequest)
    Par nephhh dans le forum C#
    Réponses: 0
    Dernier message: 16/08/2007, 22h16
  4. [.NET 2.0] Probleme upload fichier sur ftp avec My
    Par Aspic dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/03/2007, 09h10
  5. [Upload] upload fichier sur ftp free
    Par Halukard dans le forum Langage
    Réponses: 61
    Dernier message: 12/02/2006, 20h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo