Microsoft 365 faire une copie d'un fichier stocké dans un sous sous... sous répertoire

  • Initiateur de la discussion Initiateur de la discussion yaka
  • 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 !

yaka

XLDnaute Occasionnel
Bonjour

Je n'ai pas trouvé de discussions à ce sujet mais peut être ai-je mal effectué ma recherche... dans ce cas, désolé et merci de m'indiquer un lien exploitable.

Mon problème
J'ai un fichier qui contient un programme qui permet de lister les fichiers contenus dans un répertoire et ses sous répertoires.
résultat = un onglet dédié qui m'affiche la liste des fichiers trouvés >> j'ai en colonne A le nom du fichier et en colonne B son adresse... pour tous les fichiers
...
puis traitement sur l'onglet = ajout de colonnes "info 1, info 2, info 3" et de valeurs dans ces colonnes pour certaines lignes. résultats

1758563202417.png

...
..
puis j'utilise une 2ème macro pour faire une copie des fichiers choisis (=ceux qui ont des valeurs dans les nouvelles colonnes "info1, info2,...") vers un répertoire dédié.
J'utilise alors FileCopy FichierOriginal, FichierDeplace
où FichierOriginal = valeur de la colonne "Répertoire (source)" & '\" & valeur de la colonne "Nom du fichier" et FichierDeplace = "mon adresse de destination\" & valeur de la colonne "Nom de fichier"

Problème : quand la longueur de la chaîne de caractères FichierOriginal dépasse 241 caractères la copie ne s'effectue pas

Quelle est la solution pour corriger ou contourner cela?

Par avance merci pour vos retours.
 
Bonjour

Je n'ai pas trouvé de discussions à ce sujet mais peut être ai-je mal effectué ma recherche... dans ce cas, désolé et merci de m'indiquer un lien exploitable.

Mon problème
J'ai un fichier qui contient un programme qui permet de lister les fichiers contenus dans un répertoire et ses sous répertoires.
résultat = un onglet dédié qui m'affiche la liste des fichiers trouvés >> j'ai en colonne A le nom du fichier et en colonne B son adresse... pour tous les fichiers
...
puis traitement sur l'onglet = ajout de colonnes "info 1, info 2, info 3" et de valeurs dans ces colonnes pour certaines lignes. résultats

Regarde la pièce jointe 1222741
...
..
puis j'utilise une 2ème macro pour faire une copie des fichiers choisis (=ceux qui ont des valeurs dans les nouvelles colonnes "info1, info2,...") vers un répertoire dédié.
J'utilise alors FileCopy FichierOriginal, FichierDeplace
où FichierOriginal = valeur de la colonne "Répertoire (source)" & '\" & valeur de la colonne "Nom du fichier" et FichierDeplace = "mon adresse de destination\" & valeur de la colonne "Nom de fichier"

Problème : quand la longueur de la chaîne de caractères FichierOriginal dépasse 241 caractères la copie ne s'effectue pas

Quelle est la solution pour corriger ou contourner cela?

Par avance merci pour vos retours.
Ha les fameuses limitation de FileCopy, Vous devez passer par FileSystemObject pour faire cela :
VB:
Sub CopyFileWithFSO(Byval sourcePath AsString, Byval ciblePath)
    ' // Fonctionne avec des chemins longs
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    

    'Utilisez la méthode CopyFile de l'objet FSO
    fso.CopyFile sourcePath, ciblePath
    
    If Not fso Is Nothing Then Set fso = Nothing
End Sub
 
Ha les fameuses limitation de FileCopy, Vous devez passer par FileSystemObject pour faire cela :
VB:
Sub CopyFileWithFSO(Byval sourcePath AsString, Byval ciblePath)
    ' // Fonctionne avec des chemins longs
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
  

    'Utilisez la méthode CopyFile de l'objet FSO
    fso.CopyFile sourcePath, ciblePath
  
    If Not fso Is Nothing Then Set fso = Nothing
End Sub

un GRAND merci Valtrase, je teste cela demain.
 
Ha les fameuses limitation de FileCopy, Vous devez passer par FileSystemObject pour faire cela :
VB:
Sub CopyFileWithFSO(Byval sourcePath AsString, Byval ciblePath)
    ' // Fonctionne avec des chemins longs
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
   

    'Utilisez la méthode CopyFile de l'objet FSO
    fso.CopyFile sourcePath, ciblePath
   
    If Not fso Is Nothing Then Set fso = Nothing
End Sub

verdict = ça ne fonctionne pas... hélas...
 
Bonjour,


C'est un peu court, jeune homme...

Es-tu sûr d'avoir utilisé la macro correctement ?
As-tu corrigé le AsString ?

Merci pour le jeune homme... ça fait très longtemps que je ne l'ai entendu...

Ceci dit...

voici mon code

...
'copier le fichier original----------------------------------------------------------------
FichierOriginal = Range("b" & lig) & "\" & Range("a" & lig)
FichierCopie = LeChemin & "\" & Range("a" & lig)

Set fso = CreateObject("Scripting.FileSystemObject")

fso.CopyFile FichierOriginal, FichierCopie, True

If Not fso Is Nothing Then Set fso = Nothing
'------------------------------------------------------------------------------------

infos complémentaires =
la référence "Microsoft Scripting Runtime" est activée
lechemin = l'adresse de destination du fichier à copier

définition des variables
>>dans la procédure où il y a le code
Dim fso As Object

>> dans un autre module que celui qui contient le code
Public lig as integer
Public LeChemin, FichierOriginal, FichierCopie As String


Quand je dis que ça ne fonctionne pas = quand le nombre de caractère de FichierOriginal dépasse 240 caractères la copie ne s'effectue pas

Par avance merci pour ton aide.
 
Si Valtrase dit que ça doit fonctionner, c'est que ça doit fonctionner. 😉

Vérifie les valeurs de FichierOriginal et FichierCopie au moment de la copie.


Remarque : si lig est un numéro de ligne, je crois qu'il vaut mieux utiliser un long qu'un integer.


ps : n'hésite pas à utiliser la balise code avec le paramètre vb pour entourer les codes VBA dans tes messages. Ils n'en seront que plus lisibles.
 
Si Valtrase dit que ça doit fonctionner, c'est que ça doit fonctionner. 😉

Vérifie les valeurs de FichierOriginal et FichierCopie au moment de la copie.


Remarque : si lig est un numéro de ligne, je crois qu'il vaut mieux utiliser un long qu'un integer.


ps : n'hésite pas à utiliser la balise code avec le paramètre vb pour entourer les codes VBA dans tes messages. Ils n'en seront que plus lisibles.

correction pour lig >> j'ai bien mis Dim lig as long (qui est beaucoup plus approprié en effet pour les n° de lignes)
 
Bonjour à tous,

@yaka, Quand vous dites :
la référence "Microsoft Scripting Runtime" est activée
Alors vous devez plutôt utiliser la référence comme ceci :
Code:
Sub test101()
    Dim fso As Scripting.FileSystemObject
    Set fso = New Scripting.FileSystemObject
    With fso
        .CopyFile
    End With
End Sub
Cela vous permet d'avoir l'Intellisense
1758720544760.png

Maintenant, sur une ligne comme ceci :
FichierOriginal = Range("b" & lig) & "\" & Range("a" & lig)
C'est le meilleur moyen de se planter sur un chemin complet.
Prenez l'habitude de travailler avec de petites fonctions, en voici une qui ajoute si nécessaire un backslash à la fin d'une chaine :

Code:
'@Description "Ajoute un backSlash é  la fin du chemin si nécessaire."
Public Function AddBackslash(ByVal FolderPath As String) As String
    FolderPath = Trim$(FolderPath)
    If Right$(FolderPath, 1) <> "\" Then FolderPath = FolderPath & "\"
    AddBackslash = FolderPath
End Function
Donc la ligne deviendrai :
Code:
FichierOriginal = AddBackslash(Range("B" & lig)) & Range("A" & lig)
Maintenant dire que cela ne fonctionne pas... 😏 comme dit TooFatboy c'est un peu court...
Passez par des variable intermédiaires et faites des Debug.Print pour voir l'état des variables, une autre solution serait de mettre des points d'arrêts au bons endroits, d'afficher la fenêtre des variables locales (Menu Affichage/Fenêtre variables locales) et de voir un peu ce qu'elles contiennent.
 
Bonjour à tous,

@yaka, Quand vous dites :

Alors vous devez plutôt utiliser la référence comme ceci :
Code:
Sub test101()
    Dim fso As Scripting.FileSystemObject
    Set fso = New Scripting.FileSystemObject
    With fso
        .CopyFile
    End With
End Sub
Cela vous permet d'avoir l'Intellisense
Regarde la pièce jointe 1222804
Maintenant, sur une ligne comme ceci :

C'est le meilleur moyen de se planter sur un chemin complet.
Prenez l'habitude de travailler avec de petites fonctions, en voici une qui ajoute si nécessaire un backslash à la fin d'une chaine :

Code:
'@Description "Ajoute un backSlash é  la fin du chemin si nécessaire."
Public Function AddBackslash(ByVal FolderPath As String) As String
    FolderPath = Trim$(FolderPath)
    If Right$(FolderPath, 1) <> "\" Then FolderPath = FolderPath & "\"
    AddBackslash = FolderPath
End Function
Donc la ligne deviendrai :
Code:
FichierOriginal = AddBackslash(Range("B" & lig)) & Range("A" & lig)
Maintenant dire que cela ne fonctionne pas... 😏 comme dit TooFatboy c'est un peu court...
Passez par des variable intermédiaires et faites des Debug.Print pour voir l'état des variables, une autre solution serait de mettre des points d'arrêts au bons endroits, d'afficher la fenêtre des variables locales (Menu Affichage/Fenêtre variables locales) et de voir un peu ce qu'elles contiennent.

Bonjour
Je reviens sur le sujet sur lequel je bloque toujours...

@Valtrase, concernant le fso j'ai suivi scrupuleusement vos dernières indications... me semble-t-il...


mais quand le code
.CopyFile FichierOriginal, FichierCopie, True

s'exécute la copie ne s'effectue pas (pour les FichierOriginal dont la longueur est >240)... en pas à pas... je vois que ça génère une erreur 76

Une idée ou une piste ?

Par avance merci
 
la copie ne s'effectue pas (pour les FichierOriginal dont la longueur est >240)
Ton pb doit venir d'ailleurs car je viens de copier un fichier d'un dossier et le coller dans ce même dossier avec un autre nom, et ça fonctionne avec 250 caractères pour la source et 258 caractères pour la destination.

VB:
Sub Test()
'
Dim FichierSource As String, FichierCible As String

    FichierSource = "Z:\Mon_PC_perso\Projet extension de ma maison\16 - 18-09-2025 - Modificatifs documents pour permis de construire\Dossier supplémentaire permettant de vérifier si la longueur du chemin pose un problème ou pas" & "\" & "Récépissé dépôt pièces complémentaires.pdf"
    FichierCible = "Z:\Mon_PC_perso\Projet extension de ma maison\16 - 18-09-2025 - Modificatifs documents pour permis de construire\Dossier supplémentaire permettant de vérifier si la longueur du chemin pose un problème ou pas" & "\" & "Récépissé dépôt pièces complémentaires - copie.pdf"

    Set fso = CreateObject("Scripting.FileSystemObject")
    With fso
        .CopyFile FichierSource, FichierCible
    End With

End Sub
 
Bonjour à tous,
@yaka, FileSystemObject utilise de vielles API Windows partant de là, le chemin du répertoire ne doit pas dépassé 248 caractères, et le chemin complet y compris l'extension 260 caractères. Donc pour 240 caractères cela devrait être bon.
Rien ne vous empêche de faire un test sur la longueur et sur la présence du fichier et du répertoire. Vous pouvez pour cela utiliser les méthode de l'objet FileSystemObject.
Voici un petit exemple (Non testé)
VB:
Public Function SaveMyFile(ByVal Source As String, ByVal directory As String, ByVal cible As String) As Long
    'NOTE Need Microsoft Scripting runtime reference
    Dim fso As FileSystemObject
    On Error GoTo Catch
    Set fso = New FileSystemObject
    If Len(Source) >= 258 Then
        MsgBox "Le chemin du fichier source comporte trop de caractères !"
        SaveMyFile = 0
        Exit Function
    End If
    With fso
        If .FileExists(Source) Then
            If .FolderExists(.GetFolder(directory)) Then
                Dim fullName As String
                fullName = .BuildPath(Path:=directory, Name:=cible)
                If Len(fullName) >= 258 Then
                    MsgBox "Le chemin du fichier cible comporte trop de caractères !"
                    SaveMyFile = 0
                    Exit Function
                Else
                    .CopyFile Source:=Source, Destination:=fullName, OverWriteFiles:=True
                End If
            Else
                Select Case MsgBox("Le dossier cible n'existe pas !" & vbCrLf _
                                 & "" & vbCrLf _
                                 & "Voulez-vous le créer ?", vbYesNo Or vbInformation Or vbDefaultButton2, "Gestion de fichiers.")

                    Case vbYes
                        .CreateFolder directory
                    Case vbNo
                        SaveMyFile = 0                      ' // Copy aborted
                        Exit Function
                End Select
            End If

        Else
            MsgBox "Oupss... Nous ne trouvons pas Le chemin du fichier source !"
        End If
    End With


Catch:
    If Err.Number <> 0 Then
        'ToDo "Make something."
        '        MsgBox "Oupss... Nous avons rencontré l'erreur : " & Err.Number - vbObjectError & " Dans " & Err.Source & vbNewLine & Err.Description, vbMsgBoxHelpButton, "Erreur !"
        SaveMyFile = Err.Number                             ' // Return error number
        Err.Clear
        Exit Function
    End If
    SaveMyFile = -1                                         ' // Success !
End Function
Maintenant au vue de l'erreur je pense comme @TooFatBoy que vous avez une ou plusieurs erreurs dans vos chemins, ou que le répertoire de destination n'existe pas.
Dans tous les cas vous devez retenir que quand vous coder une fonction ou méthode, vous devez vous poser les bonnes questions et faire les tests en conséquences (Mieux vaut prévenir que guérir.)
 
Maintenant au vue de l'erreur je pense comme @TooFatBoy que vous avez une ou plusieurs erreurs dans vos chemins, ou que le répertoire de destination n'existe pas.
On lui a demandé plusieurs fois les valeurs de ses variables au moment du plantage.
Pas sûr qu'on puisse y détecter le problème, mais sait-on jamais.



FileSystemObject utilise de vielles API Windows partant de là, le chemin du répertoire ne doit pas dépassé 248 caractères, et le chemin complet y compris l'extension 260 caractères.
Je n'y connais rien, donc je jette une idée en l'air : on peut peut-être aussi faire des "CD" pour atterrir au bon endroit avant de faire un copier, et faire la même chose pour le coller ?
Est-ce que le maximum n'est pas 259 caractères ?
 
Dernière édition:
Bonjour à tous,

Comme le dis si bien Patrick Toulon, FSO est un gros lourdaud 🤭
Pourquoi ne pas utiliser FileCopy intégré à Excel 🤔

Les possibilités ici

Bonne journée
 
On lui a demandé plusieurs fois les valeurs de ses variables au moment du plantage.
Pas sûr qu'on puisse y détecter le problème, mais sait-on jamais.




Je n'y connais rien, donc je jette une idée en l'air : on peut peut-être aussi faire des "CD" pour atterrir au bon endroit avant de faire un copier, et faire la même chose pour le coller ?
Est-ce que le maximum n'est pas 259 caractères ?
Bonjour
Concernant les variables avant le plantage >> cf capture suivante en espérant qu'elle soit lisible
capture_ 01 _2025-10-15 12h16_22.png


et après l'exécution de
capture_ 01 _2025-10-15 12h19_53.png


j'ai une erreur = 76 ... et pas de copie...


En "désespoir de cause"... je rejoins ton idée "d'atterrir" au bon endroit pour pouvoir faire le copier et le coller.
 
- 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

Discussions similaires

Retour