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

VBA Discussion :

FileCopy et erreur 75 pour copier un fichier sur un serveur avec chemin absolu


Sujet :

VBA

  1. #1
    Membre du Club
    Homme Profil pro
    Automaticien
    Inscrit en
    Octobre 2019
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : Octobre 2019
    Messages : 75
    Points : 51
    Points
    51
    Par défaut FileCopy et erreur 75 pour copier un fichier sur un serveur avec chemin absolu
    Bonjour à tous,

    J'ai créé un classeur contenant une macro qui se lance sur l'évènement d'ouverture du classeur.
    L'objectif est de le diffuser à mes collègues. Lorsqu'ils le lanceront, la macro créera un dossier "interne" à la racine "C:\" de leur PC respectif.
    Ensuite la macro est censé copier LE classeur finale dans le dossier "C:\interne", j'ai utilisé la fonction FileCopy, mais celle-ci me retourne une erreur 75.
    Voici la macro:
    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
    Sub main()
        createInterne
        FileCopy serveurFile, "C:\interne"
        'Workbooks.Open serveurFile
    End Sub
     
    Sub createInterne()
        If Not FichierExiste("C:\interne") Then
            MkDir "C:\interne"
            SetAttr "C:\interne", 2
        End If
    End Sub
     
    Function serveurFile()
        Dim Fichier As String
        Fichier = "\\serveur\boite-outils\DIVERS BE\BE Tools\Feuille d heure\Feuille d'Heures Hebdo BE_V0.0.xlsm"
        serveurFile = Fichier 'extractVersion(Fichier, nbCharVersion)
    End Function
    L'instruction 'Workbooks.Open serveurFile m'a permi de m'assurer que j’accédais bien au fichier finale,
    Ensuite j'ai testé les droit d'écriture sur "C:\interne" avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set a = fs.CreateTextFile("C:\interne\MonFichier.txt", True)
        a.WriteLine ("Ma première ligne")
        a.WriteLine ("Ma deuxième ligne")
        a.Close
    End Sub
    Du coup je suppose que les droits d'accès sont correct.
    Quelle serait les autres raisons possibles à l'erreurs 75 dans mon cas?

    Merci d'avance.

  2. #2
    Membre du Club
    Homme Profil pro
    Automaticien
    Inscrit en
    Octobre 2019
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : Octobre 2019
    Messages : 75
    Points : 51
    Points
    51
    Par défaut
    Je m'auto répond...
    Weetoz: boulet!!!
    pour copier dans un dossier, bah faut mettre l'antislash à la suite du nom de dossier!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileCopy serveurFile, "C:\interne\"
    Le genre de p'tits détails qui emmène loins du sujet de base quand même.

  3. #3
    Membre du Club
    Homme Profil pro
    Automaticien
    Inscrit en
    Octobre 2019
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : Octobre 2019
    Messages : 75
    Points : 51
    Points
    51
    Par défaut
    Du coup, cela fonctionne sur mon poste, mais pas sur d'autre...

    Sur mon poste:
    Call fso.CopyFile(serveurFile, "C:\interne\") fonctionne.
    FileCopy serveurFile, "C:\interne\" : Erreur 76 Chemin d'accès introuvable
    FileCopy serveurFile, "C:\interne" : Erreur 75 Erreur d'accès Chemin/Fichier

    J'ai modifier les droits du dossier "C:\interne" selon l'utilisateur local, mais je ne sais pas si l'application Excel utilise l'utilisateur local connecté à la machine...
    De plus, Excel arrive à créer le dossier à la racine de "C" sans problème sur le poste qui me sert à faire mes tests. Donc j'ai vraiment du mal à comprendre ce qui l'empêche d'y copier un fichier.

    Voici la procédure qui créé le repertoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub createInterne()
        If Not FichierExiste("C:\interne") Then
            MkDir "C:\interne"
            SetAttr "C:\interne", 2
        End If
    End Sub
    Même en commentant SetAttr "C:\interne", 2 , j'ai l'erreur 75.

    Je vous remercie d'avance pour les pistes ou solutions.

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Avec FileCopy, tu dois renseigner le nom du fichier cible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test()
      Dim Filename As String
      Dim SourcePath As String
      Dim TargetPath As String
     
      SourcePath = "c:\data\temp\source\"
      TargetPath = "c:\data\temp\target"
      Filename = "image.png"
     
      FileCopy SourcePath & Filename, TargetPath & Filename
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 947
    Points : 4 058
    Points
    4 058
    Par défaut
    Bonjour.
    Effectivement, si vous avez les mêmes droits que vos collègues, un traitement qui marche sur votre poste devrait marcher sur un autre poste.
    Mais peut-être que vos collègues ne sont pas habilités à créer un répertoire depuis la racine "C:\" ?
    À vérifier manuellement.
    Dans ce cas est-il possible d'utiliser leur répertoire utilisateur au lieu de "C:\interne" ?
    À vérifier aussi si le séparateur de dossier est bien "\" et pas autre chose. (les versions d'Excel sont-elles toutes les mêmes ?)
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mkdir Environ("USERPROFILE") & Application.PathSeparator & "interne"
    soit chez moi :
    Si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dir (Environ("USERPROFILE") & Application.PathSeparator & "interne", vbDirectory)
    est non nul alors le répertoire est bien créé.

    Quant à "FileCopy" (qui est très bien) je vous propose d'utiliser l'API "CopyFileEx" qui permet d'obtenir la progression de la copie. C'est pratique quand on doit faire une copie qui dure longtemps (cas rencontré par le télétravail avec des utilisateurs qui ont un faible débit) pour avertir l'utilisateur de la progression du traitement, à condition d'être en version 32 bits.

    Ici un exemple de la fonction "CopieFichierEx" :
    - mettre dans FichierSrc et FichierDest les fichiers source et destination comme pour FileCopy ;
    - mettre SupprSiExiste a TRUE s'il faut supprimer le fichier destination s'il existe déjà ;
    - ne pas renseigner CallBack si vous utilisez CopieFichierExProgression par défaut.


    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
    Public Declare Function CopyFileEx Lib "kernel32.dll" Alias "CopyFileExA" _
                    (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, _
                     ByVal lpProgressRoutine As Long, lpData As Any, ByRef pbCancel As Long, _
                     ByVal dwCopyFlags As Long) As Long
     
    '----------------------------------------------------------------------------------------
    Public Function CopieFichierEx(FichierSrc As String, FichierDest As String, _
                                   Optional SupprSiExiste As Boolean = True, _
                                   Optional CallBack As Long = 0) As Long
    '----------------------------------------------------------------------------------------
    ' Copie FichierSrc vers FichierDest et affiche une progression.
    ' Retourne 0 si échec dans la copie, ou si le fichier existait déjà car l'API
    ' est configurée dwCopyFlags = 1 : ne remplace pas un fichier existant.
    ' Si SupprSiExiste = True alors suppression de la destination avant la copie.
    ' Retourne une autre valeur si la copie est réussie.
    ' Pour afficher la progression :
    ' Utilise la fonction de rappel CopieFichierExProgression ou l'adresse passée
    ' dans l'argument : CopieFichierEx(FichierSrc, FichierDest, True, AddressOf MaProgression)
    '----------------------------------------------------------------------------------------
    Dim bCancel As Long
    Dim AncStatusBar As Variant
    Dim AncCursor As XlMousePointer
     
    ' Mémorise l'état de la barre d'état et la forme du curseur:
    AncCursor = Application.Cursor
    AncStatusBar = Application.DisplayStatusBar
    Application.DisplayStatusBar = True
     
    ' Supprime le fichier s'il existe et que c'est demandé dans les arguments:
    On Error Resume Next
    If SupprSiExiste = True Then Kill FichierDest
    On Error GoTo 0
     
    ' Copie et utilise la fonction de rappel CopieFichierExProgression ou une autre fonction si renseigné:
    If CallBack = 0 Then
        CopieFichierEx = CopyFileEx(FichierSrc, FichierDest, AddressOf CopieFichierExProgression, 0, bCancel, 1)
    Else
        CopieFichierEx = CopyFileEx(FichierSrc, FichierDest, CallBack, 0, bCancel, 1)
    End If
     
    ' Restaure l'état de la barre d'état et la forme du curseur:
    Application.StatusBar = False
    Application.DisplayStatusBar = AncStatusBar
    Application.Cursor = AncCursor
     
    End Function
     
    '----------------------------------------------------------------------------------------
    Private Function CopieFichierExProgression(ByVal TotalFileSize As Currency, _
             ByVal TotalBytesTransferred As Currency, _
             ByVal StreamSize As Currency, ByVal StreamBytesTransferred As Currency, _
             ByVal dwStreamNumber As Long, ByVal dwCallbackReason As Long, _
             ByVal hSourceFile As Long, ByVal hDestinationFile As Long, ByVal lpData As Long) As Long
    '----------------------------------------------------------------------------------------
    ' Mise à jour de la barre d'état:
    Application.StatusBar = "Copie en cours : " & Int(TotalBytesTransferred / TotalFileSize * 100) & "%"
    ' Continue la copie:
    CopieFichierExProgression = 0
    End Function

    Cordialement.

Discussions similaires

  1. Réponses: 19
    Dernier message: 08/04/2009, 15h06
  2. Chemin pour enregistrer un fichier sur le serveur
    Par Scrountch dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 11/03/2008, 11h52
  3. Copier un fichier sur le réseau avec un autre utilisateur du domaine
    Par Corben dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 30/01/2008, 16h19
  4. un conseil pour exporter des fichier sur un serveur ftp
    Par pierrot67 dans le forum Delphi
    Réponses: 1
    Dernier message: 03/12/2006, 11h15
  5. Réponses: 6
    Dernier message: 08/04/2005, 03h00

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