Lister des fichiers

Bonjour a tous,

J'aimerais via une macro rassembler plusieurs fichiers dans un seul dossier.

J'ai un dossier comprenant 92 sous dossiers qui chacuns a 9 dossiers

J'aimerais réunir tous le contenu des dossiers ayant le même noms, dans un dossier qui sera dans un autre endroit

Un petit schéma sera plus simple

exemple

Merci de votre aide

Bonjour Damsa,

Voici un essai que je n'ai malheureusement pas pu tester. Ici, je comprends qu'il y a 92 dossiers comptant chacun 9 sous-dossiers identiques. On parcourt alors tous les fichiers de chaque sous-dossier et on les copie dans le sous-dossier de destination parmi les 9 qui, cette fois-ci, se trouvent tous sous un même dossier parent.

Il faudra mettre le chemin du dossier parent de départ (contenant les 92 dossiers) et le chemin du dossier parent d'arrivée (qui contiendra les 9 dossiers). Si besoin, les dossiers de destination seront créés.

Il y avait probablement plus simple mais j'ai le sentiment qu'en cas d'incompréhension, il sera plus simple de partir de cette base...

Sub CopierFichiers()

Dim strExpath$, strNewpath$, strFolder$, strCurrentFile$, strDestinationFolder$, strNewfile$
Dim arrFolders, arrSubfolders, arrDirectories
Dim i&, k&

strExpath = "C\...\Rename\" '<<< ADAPTER
strNewpath = "C:\...\NewName\" '<<< ADAPTER

arrFolders = ListeDossiers(strExpath)

For i = LBound(arrFolders) To UBound(arrFolders)
    strFolder = arrFolders(i)
    arrSubfolders = ListeDossiers(strFolder)
    arrFolders(i) = arrSubfolders
Next i

arrDirectories = Application.Transpose(Application.Transpose(arrFolders))

For i = LBound(arrDirectories) To UBound(arrDirectories)
    For k = LBound(arrDirectories, 2) To UBound(arrDirectories, 2)
        strCurrentFile = Dir(arrDirectories(i, k) & "*.*")
        While strCurrentFile <> ""
            strDestinationFolder = Replace(arrDirectories(i, k), strExpath, strNewpath)
            If CreerChemin(strDestinationFolder) Then strNewfile = strDestinationFolder & strCurrentFile
            FileCopy strCurrentFile, strNewfile
            strCurrentFile = Dir
        Wend
    Next k
Next i

End Sub

Function ListeDossiers(strRepertoire$)

Dim strDossier$, n&, temp()

strDossier = Dir(strRepertoire, vbDirectory)
While strDossier <> ""
    If Not strDossier Like "*.*" Then
        ReDim Preserve temp(n)
        temp(n) = strRepertoire & strDossier & "\"
        n = n + 1
    End If
    strDossier = Dir
Wend
ListeDossiers = temp

End Function

Function CreerChemin(strChemin$) As Boolean

Dim temp, strRepertoire$, i&

If Right(strChemin, 1) = "\" Then strChemin = Left(strChemin, Len(strChemin) - 1)
temp = Split(strChemin, "\")
strRepertoire = temp(0)
If UBound(temp) > 0 Then
    For i = 1 To UBound(temp)
        strRepertoire = strRepertoire & "\" & temp(i)
        If Dir(strRepertoire, vbDirectory) = "" Then MkDir strRepertoire
    Next i
    CreerChemin = true
End If

End Function

Cdlt,

Merci de la réponse, j'ai testé, mais j'ai une erreur à l'exécution.

Apparemment c'est au niveau de la ligne

arrDirectories = Application.Transpose(Application.Transpose(arrFolders))

je ne vois pas bien, l'erreur

Dans votre dossier "Rename", vous avez bien 92 dossiers qui contiennent tous 9 dossiers ?

Edit : J'ai fait quelques essais. J'ai rencontré des bugs après mais la ligne en question n'est pas bloquante chez moi. Voici un nouveau code en attendant :

Sub test()

Dim strExpath$, strNewpath$, strFolder$, strCurrentFile$, strDestinationFolder$, strReplace$, strConserve$
Dim arrFolders, arrSubfolders, arrOrigine, arrDestination()
Dim i&, k&

strExpath = ThisWorkbook.Path & "\Rename\"
strNewpath = ThisWorkbook.Path & "\Newname\"

'TABLEAU CONTENANT LES SOUS-DOSSIERS DE RENAME
arrFolders = ListeDossiers(strExpath)

'REMPLACEMENT REPERTOIRE DE CHAQUE SOUS-DOSSIER PAR ARRAY CONTENANT REPERTOIRES DE SES PROPRES SOUS-DOSSIERS
For i = LBound(arrFolders) To UBound(arrFolders)
    strFolder = arrFolders(i)
    arrSubfolders = ListeDossiers(strFolder)
    arrFolders(i) = arrSubfolders
Next i

'TABLEAU DES REP DE SOUS-DOSSIERS REMIS SOUS FORME d'ARRAY 2D (TRANSPO DE L'ARRAY D'ARRAYS)
arrOrigine = Application.Transpose(Application.Transpose(arrFolders))
ReDim arrDestination(1 To UBound(arrOrigine), 1 To UBound(arrOrigine, 2))

'ETABLISSEMENT DU TABLEAU DES REP DE DESTINATION PAR CORRESPONDANCE (ET LE CAS ECHANT CREATION DES REPS)
For i = LBound(arrOrigine) To UBound(arrOrigine)
    For k = LBound(arrOrigine, 2) To UBound(arrOrigine, 2)
        strReplace = Left(arrOrigine(i, k), Len(arrOrigine(i, k)) - 1)
        strConserve = Split(strReplace, "\")(UBound(Split(strReplace, "\"))) & "\"
        strDestinationFolder = Replace(arrOrigine(i, k), arrOrigine(i, k), strNewpath & strConserve)
        If CreerChemin(strDestinationFolder) = strDestinationFolder Then arrDestination(i, k) = strDestinationFolder
    Next k
Next i

'PARCOURT CHAQUE FICHIER DE CHAQUE REP ORIGINE ET COPIE DANS REP DESTINATION
For i = LBound(arrOrigine) To UBound(arrOrigine)
    For k = LBound(arrOrigine, 2) To UBound(arrOrigine, 2)
        strCurrentFile = Dir(arrOrigine(i, k) & "*.*")
        While strCurrentFile <> ""
            FileCopy arrOrigine(i, k) & strCurrentFile, arrDestination(i, k) & strCurrentFile
            strCurrentFile = Dir
        Wend
    Next k
Next i

End Sub

Function ListeDossiers(strRepertoire$)

Dim strDossier$, n&, temp()

strDossier = Dir(strRepertoire, vbDirectory)
While strDossier <> ""
    If Not strDossier Like "*.*" Then
        ReDim Preserve temp(n)
        temp(n) = strRepertoire & strDossier & "\"
        n = n + 1
    End If
    strDossier = Dir
Wend
ListeDossiers = temp

End Function

Function CreerChemin(strChemin$) As String

Dim temp, strRepertoire$, i&

If Right(strChemin, 1) = "\" Then strRepertoire = Left(strChemin, Len(strChemin) - 1) Else strRepertoire = strChemin
temp = Split(strRepertoire, "\")
strRepertoire = temp(0)

If UBound(temp) > 1 Then
    For i = 1 To UBound(temp)
        strRepertoire = strRepertoire & "\" & temp(i)
        If Dir(strRepertoire, vbDirectory) = "" Then MkDir strRepertoire
    Next i
    CreerChemin = strRepertoire & "\"
End If

End Function
Rechercher des sujets similaires à "lister fichiers"