XL 2010 Copier un fichiers txt qui ont le même nom de plusieurs sous-dossiers vers un dossier

hamzaelhathout

XLDnaute Nouveau
Bonjour,

J'ai un dossier qui contiens plusieurs sous-dossier pour chaque journée qui ont pour nom "aaaa-mm-jj".
Dans ces sous-dossier, il y a un rapport au format txt qui a toujours le même nom "XXXXX.txt"

Je voudrais créer une macro qui aille chercher ce fichier txt dans chaque sous dossier et me le copie avec comme nom, celui du sous dossier dans lequel il se trouve (donc aaaa-mm-jj.txt) vers un dossier "destination".

J'ai cherché dans le forum mais je n'ai pas trouvé exactement ça.

Merci d'avance.
 
Solution
Super merci.

J'ai adapté pour le nom du fichier exact.

VB:
Option Explicit

Sub Test()
    Call FichiersSousRépertoires("C:\Users\Youssef\Documents\fansub\testmacro\")
End Sub

'---------------------------------------------
'Fichiers des sous-répertoires d'un répertoire
'---------------------------------------------
Sub FichiersSousRépertoires(NomRépertoire As String)
    Dim oFSO As Object
    Dim oDir As Object
    Dim oSubDir As Object
    Dim oFile As Object

    'File System Object
    Set oFSO = CreateObject("Scripting.FileSystemObject")

    'Directory Object
    Set oDir = oFSO.GetFolder(NomRépertoire)

    'Parcours des sous-répertoires du répertoire
    For Each oSubDir In oDir.SubFolders
        'Parcours des fichiers du...

patricktoulon

XLDnaute Barbatruc
et alors!?
tu sait pas récupérer le nom du dossier ?
je te liste les fichier avec leur chemin complet ça devrait être facile
je te mache le travail
VB:
'patricktoulon
'basée sur ma fonction récursive avec dir de 2016
'tout les fichiers "XXXX.txt" seront trouvé et listés
Option Explicit
Sub testXy()
    'Cells.Clear
    Dim liste As Variant, i&, OldDossier, newdossier
    liste = listefichier("C:\Users\polux\DeskTop\dossier maitre\", partname:="XXXX", extention:=".txt")
    newdossier = "C:\Users\polux\DeskTop\nouveau dossier maitre\"

    'maintenant  tu fait ce que tu veux avec la liste des fichiers trouvés
    ' exemple
    'MsgBox Join(liste, vbCrLf)
    For i = LBound(liste) To UBound(liste)
        OldDossier = Split(liste(i), "\")(UBound(Split(liste(i), "\")) - 1)
      
        MsgBox "le fichier s'appelle " & liste(i) & vbCrLf & "il devrait s'appeler maintenant" & vbCrLf & newdossier & OldDossier & ".txt"
        'te reste plus qu'a faire un filecopy ici dans la boucle
        '...

    Next

End Sub

Function listefichier(Dossier As String, Optional recall As Boolean = False, Optional tbl As Variant, Optional partname As String = "*", Optional extention As String = "*") As Variant
    Dim ItemVu As String, directory As Variant, SubFolderCollection As Collection, i As Long, A As Long, E As Long, subdossier
    Set SubFolderCollection = New Collection
    If recall = False Then ReDim tbl(0)    ' si recall  on redim un tableau  de zero item (pour la creation du tableau)
    On Error Resume Next    'gestion des fichiers dossiers system et interdit ou generant une erreur(PerLog,recycle,etc..)
    ItemVu = Dir(Dossier, vbDirectory)
    If Error.Number = 0 Then    ' si pas d'erreur on examine le contenu
        'examen  du dossier courrant
        Do Until ItemVu = vbNullString
            If Left(ItemVu, 1) <> "." Then
                If (GetAttr(Dossier & ItemVu) And vbDirectory) = vbDirectory Then
                    SubFolderCollection.Add ItemVu
                Else
                    If Left(ItemVu, Len(partname)) = partname And Right(ItemVu, 4) = extention Then A = UBound(tbl) + 1: ReDim Preserve tbl(1 To A): tbl(A) = Dossier & ItemVu

                End If
            End If
            ItemVu = Dir()
        Loop
    Else
        Err.Clear
    End If
    'examen des sub dossier
    For Each subdossier In SubFolderCollection
        'A = UBound(tbl) + 1: ReDim Preserve tbl(1 To A): tbl(A) = Dossier & subdossier' si on veut lister les dossiers aussi
        listefichier Dossier & subdossier & "\", True, tbl, partname, extention
    Next subdossier
    listefichier = tbl
End Function
 

patricktoulon

XLDnaute Barbatruc
tu en veux la preuve ?
ben tiens liste un disque complet avec dir et fait la même chose avec FSO
chez moi un disque spécial musique et il y a un sacré paquet d'album et quelques films et dvd rippé
moins d'une seconde

VB:
Sub testX()
    Cells.Clear
    Dim liste As Variant
    liste = DirList("H:\")
    Cells(1, 1).Resize(UBound(liste), 1).Value = Application.Transpose(liste)
End Sub

Function DirList(Dossier As String, Optional recall As Boolean = False, Optional tbl As Variant) As Variant
    Dim ItemVu As String, directory As Variant, SubFolderCollection As Collection, I As Long, A As Long, E As Long
    Set SubFolderCollection = New Collection
    If recall = False Then ReDim tbl(0)    ' si recall  on redim un tableau  de zero item (pour la creation du tableau)
    On Error Resume Next    'gestion des fichiers dossiers system et interdit ou generant une erreur(PerLog,recycle,etc..)
    ItemVu = Dir(Dossier, vbDirectory)
    If Error.Number = 0 Then    ' si pas d'erreur on examine le contenu
        'examen  du dossier courrant
        Do Until ItemVu = vbNullString
            If Left(ItemVu, 1) <> "." Then
                If (GetAttr(Dossier & ItemVu) And vbDirectory) = vbDirectory Then
                    SubFolderCollection.Add ItemVu
                Else
                    A = UBound(tbl) + 1: ReDim Preserve tbl(1 To A): tbl(A) = Dossier & ItemVu
                End If
            End If
            ItemVu = Dir()
        Loop
    Else
        Err.Clear
    End If
    'examen des sub dossier
    For Each subdossier In SubFolderCollection
        A = UBound(tbl) + 1: ReDim Preserve tbl(1 To A): tbl(A) = Dossier & subdossier
        DirList Dossier & subdossier & "\", True, tbl
    Next subdossier
    DirList = tbl
End Function
 

Dudu2

XLDnaute Barbatruc
Ok c'est bien possible, mais je n'arrive pas à faire fonctionner ton code. Voir fichier joint.
Celui que j'ai en FSO scanne l'arborescence complète du répertoire pour y capter les noms de fichiers
Faut que ton code fasse pareil pour comparer.
Je suis quand même curieux de voir la différence.
 

Pièces jointes

  • ListesFichiersRépertoire.xlsm
    23.1 KB · Affichages: 9

patricktoulon

XLDnaute Barbatruc
je sais pas ton fichier plante quand j'essaie de lister mon disque H complet
c'est un peu normal tu n'a pas de garde fou pour les folders system tels que les dossiers invisibles ".." , les recycles, etc..... je me tape des messages d'erreur "permission refusée "

fait moi en un qui liste tout un disque et on pourra comparer
mais perso si il y a une chose que je suis sur c'est bien ça
il y a eu gros travail de recherche sur Dvp l'ors d'une discussion qui a durré un paquet de temps
ou moult tests ont été effectués avec de nombreux participants avec des config diverses et variées
je peux t'affirmer sans hésitation que dir et MINIMUM !!! 10 fois plus rapide

tiens vois la un exemple simple
on va lister qu'un seul dossier avec ses sub dossiers
chez moi rien que les musiques 15000 fichiers dans sous dossiers et sou sous dossier ,etc....(entre 2 et 5 étages)
_ 7/8 secondes pour FSO
_ instantané pour dir( allez je vais être large 1 seconde)le temps de relâcher la souris

pas la peine de mettre un compteur c'est gros comme le nez au milieu de la figure
 

Pièces jointes

  • test list récursive fichier exemple pour Dudu2.xlsm
    20 KB · Affichages: 5

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,
En mesurant sur un répertoire de 2000+ fichier le rapport de temps d'exécution est de 1 à 5 au bénéfice de ta fonction.
A noter que j'ai un fichier qui s'appelle "Les 7 ACCORDS jazz manouche à connaître (majeur, mineur, .webm" et tu ne le détectes pas, sans doute à cause de cette ',' juste avant le '.' d'extension. Même chose si je remplace la ',' par un '.'.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Tu retournes aussi double '\' sur lettre disque.
1612428599926.png
 

patricktoulon

XLDnaute Barbatruc
oui les recycles normalement je les élimine

c'est inutile de les conserver
si tu veux corriger ça, enlève vbhidden ou vbsystem des critères
tu peux gérer ça comme tu veux a partir de cette ligne avec dir
chose que tu ne peut pas faire avec fso il faut faire un test getattr sur chaque fichier pour trier
;)
après le double"\\" je sais pas d'ou ça viens moi je ne l'ai pas
pour info
VB:
criteres = vbDirectory Or vbSystem Or vbHidden Or vbArchive Or ReadOnly Or vbNormal
avec ta macro je trouve 3486 fichiers avec la mienne j'en trouve 4590
attention ici dans cet exemple je liste un disque complet chose que ta fonction avec fso ne peut pas faire sans tomber en erreur"permission refusée"
demo8.gif
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 345
Messages
2 087 457
Membres
103 546
dernier inscrit
mohamed tano