Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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...

ChTi160

XLDnaute Barbatruc
Bonjour
pour ma part je viens de tester la dernière proposition de Dudu et dès le lancement sur "C"
message : "permission refusée"
idem pour celui de Patrick
jusque la j'ai pu tester les différentes versions sans souci !
jean marie
 

patricktoulon

XLDnaute Barbatruc
re
sur quoi tu l'a testé?
si c'est sur C c'est pas la peine
il y a bien trop de dossier a sauter
l'autre qui fonctionnait était la méthode avec gestion d'erreur mais manquait 30% des fichiers bon
sur disque c mieux vaut cibler un dossier sur C direct c'est ingérable
 

patricktoulon

XLDnaute Barbatruc
re
surtout que nous avons tout une exploitation différente ainsi que les logiciel a jouté
tu a méthode dir bath qui fonctionne bien directe sur c c'est d'autant préférable vu le nombre de fichier

@Dudu2 j'essaie par tout les moyen de shunter les non dir mais pas moyen sur ta version
j'ai fit ça mais il me donne 10 fichier au lieu de 21

normalement le dir déclenche une erreur sur les dossiers sensible donc

VB:
'Parcours des sous-répertoires du répertoire en cours
    For Each oSubDir In oDir.SubFolders
        'Appels recursifs identifiés par le type Object de l'argument OsubDir
        On Error Resume Next
        X = Len(Dir(oSubDir.Path & "\*." & Extension))
        If Err.Number = 0 And X > 0 Then
            Call FichiersRépertoireFSO(oSubDir, NoRecycle, Extension)
            Err.Clear
        End If
    Next oSubDir
 

Dudu2

XLDnaute Barbatruc
pour ma part je viens de tester la dernière proposition de Dudu et dès le lancement sur "C"
message : "permission refusée"
@ChTi160 Je pourrais passer toutes les erreurs mais j'essaie de contrôler celles qui peuvent arriver.
VB:
'Error #70 Authorisation refusée, Error #76 Path not found, Autre erreur à identifier ?
If Not (err.Number = 70 Or err.Number = 76) Then MsgBox "FichiersRépertoireFSO erreur #" & err.Number
Je suis intéressé par le n° d'erreur que tu as eue.
 

patricktoulon

XLDnaute Barbatruc
Ahhh!!! 0.29512 on s’approche de mon résultat a 1 ou 2 centième près
avoue que c'est mieux quand même que 1.5XXX pour 21 fichiers sur 5000

bon tu fait pas le part name mais l’extension c'est déjà ça
sinon avec le part name
bon on perds la coherence de lextension tronquée
exemple le '*. xls* peut très bien confondre H:\mondossier\classeur.xlstation trucmuche.blabla

VB:
'Option Explicit

Sub TestFichiersRépertoireFSO()
    Dim Table As Variant, tim#
    Const Répertoire = "H:" ' "H:\Téléchargements"
    tim = Timer
    Table = FichiersRépertoireFSO(Répertoire, , "*.txt")
    'Table = FichiersRépertoireFSO(Répertoire, , "xls*")
   
    'If not VarType(Table) = vbBoolean Then
    If IsArray(Table) Then
        Table = TransposeExcel(Table)
        MsgBox UBound(Table) & " fichier(s) trouvé(s) dans le répertoire <" & Répertoire & "> en " & Timer - tim & " s/"
        ActiveSheet.Range("A1:A" & Rows.Count).ClearContents
        ActiveSheet.Range("A1").Resize(UBound(Table)).Value = Table
    Else
        MsgBox "Aucun fichier dans le répertoire <" & Répertoire & ">"
    End If
End Sub

'---------------------------------------------------------------
'Liste des fichiers de l'arborescence complète d'un répertoire
'par la "méthode FileSystemObject"
'
'- NomRépertoire: chaine du nom du répertoire concerné
'                 (avec ou sans '\' final)
'- NoRecycle: True (valeur par défaut) pour ne pas avoir les
'             fichiers de la poubelle dans la liste résultat
'             si NomRépertoire est une lettre de lecteur (drive)
'- Extension: "Pattern" / modèle de l'extension des fichiers à
'             sélectionner ("txt", "xls*" ou "" pour tous)
'- Return: table à 1 dimension des noms complets des fichiers
'          ou False si aucun fichier dans le répertoire
'---------------------------------------------------------------
Function FichiersRépertoireFSO(ByVal NomRépertoire As Variant, _
                               Optional NoRecycle As Boolean = True, _
                               Optional Extension As String = "") As Variant
    'Tableau résultat static pour être indépendant des appels récursifs
    Static TabNomsFichiers() As String
    Static NbFichiers As Long
   
    'Variable du FileSystemObject commune à toutes les instances de la fonction
    Static oFSO As Object
   
    'Variable spécifiques à une instance de la fonction
    Dim oDir As Object
    Dim oSubDir As Object
    Dim oFile As Object
    Dim InitialCall As Boolean
    Dim TakeIt As Boolean
   
    'Appel recursif de cette fonction (par elle-même ci-dessous)
    If TypeOf NomRépertoire Is Object  Then
        InitialCall = False
       
        'Valorise l'objet Folder
        Set oDir = NomRépertoire
   
    'Appel initial
    Else
         InitialCall = True
       
        'Table résultat
        Erase TabNomsFichiers
          NbFichiers = 0
       
        'File System Object
        Set oFSO = CreateObject("Scripting.FileSystemObject")
       
        'Complémente éventuellement le nom du répertoire avec '\'
        If Right(NomRépertoire, 1) <> "\" Then NomRépertoire = NomRépertoire & "\"
       
        'Valorise l'objet Folder
        Set oDir = oFSO.GetFolder(NomRépertoire)
    End If
   
    'On ne traite pas ces répertoires
    If oDir.Name = "System Volume Information" _
    Or (NoRecycle And oDir.Name = "$RECYCLE.BIN") Then Exit Function
   
    'On ne traite pas les répertoire ne contenant pas de fichiers avec extension
    If Len(Extension) = 0 Then
        TakeIt = True
    Else
        If Len(Dir(oDir.Path & "\" & Extension)) > 0 Then TakeIt = True Else TakeIt = False
    End If
   
    If TakeIt Then
        'Parcours des fichiers du répertoire en cours
        On Error Resume Next
       
        For Each oFile In oDir.Files
            If Err.Number = 0 Then
                'Test si correspndance de l'extension
                If Len(Extension) = 0 Then
                    TakeIt = True
                Else
                    If oFile.Name Like Extension Then TakeIt = True Else TakeIt = False
                End If
               
                'Stocke le nom complet du fichier en table
                If TakeIt Then
                    NbFichiers = NbFichiers + 1
                    ReDim Preserve TabNomsFichiers(1 To NbFichiers)
                    TabNomsFichiers(NbFichiers) = oFile.Path
                End If
            Else
                'Error #70 Authorisation refusée, Error #76 Path not found, Autre erreur à identifier ?
                If Not (Err.Number = 70 Or Err.Number = 76) Then MsgBox "FichiersRépertoireFSO erreur #" & Err.Number
                Err.Clear
            End If
        Next oFile
        On Error GoTo 0
    End If
   
    'Parcours des sous-répertoires du répertoire en cours
    For Each oSubDir In oDir.subfolders
        'Appels recursifs identifiés par le type Object de l'argument OsubDir
         Call FichiersRépertoireFSO(oSubDir, NoRecycle, Extension)
    Next oSubDir
   
    'Return value
    If InitialCall Then
        FichiersRépertoireFSO = False
        If NbFichiers > 0 Then FichiersRépertoireFSO = TabNomsFichiers
    End If
End Function

'--------------------------------------------------------------------
'Fonction de Tranpose selon la logique de WorksheetFunction.Transpose
'sauf que WorksheetFunction.Transpose se limite à 65536 éléments
'alors que cette fonction lève cette limite.
'--------------------------------------------------------------------
Function TransposeExcel(T As Variant) As Variant
    Dim tt() As Variant
    Dim NbDimensions As Integer
    Dim i As Long
    Dim j As Long
   
    If Not IsArray(T) Then
        MsgBox "Function TransposeExcel: error argument is not an array !"
        Exit Function
    End If
   
    '1 ou 2 dimensions pour t ?
    On Error Resume Next
    i = UBound(T, 2)
    If Err.Number Then NbDimensions = 1 Else NbDimensions = 2
    On Error GoTo 0

    '------------------------------------------------------
    'Tableau origine 1 dimension
    '=> Tableau destination 2 dimensions dont la 2ème est 1
    '------------------------------------------------------
    If NbDimensions = 1 Then
        ReDim tt(LBound(T) To UBound(T), 1 To 1)
       
        For i = LBound(T) To UBound(T)
            tt(i, 1) = T(i)
        Next i
    End If
   
    '----------------------------
    'Tableau origine 2 dimensions
    '----------------------------
    If NbDimensions = 2 Then
        '-----------------------------------------------
        'Tableau origine 2 dimensions dont la 2ème est 1
        '=> Tableau destination 1 dimension
        '-----------------------------------------------
        If UBound(T, 2) = 1 Then
            ReDim tt(LBound(T, 1) To UBound(T, 1))
           
            For i = LBound(T, 1) To UBound(T, 1)
                tt(i) = T(i, 1)
            Next i
           
        '-------------------------------------------------
        'Tableau origine 2 dimensions dont la 2ème est > 1
        '=> Tableau destination 2 dimensions inversées
        '-------------------------------------------------
        Else
            ReDim tt(LBound(T, 2) To UBound(T, 2), LBound(T, 1) To UBound(T, 1))
           
            For i = LBound(T, 2) To UBound(T, 2)
                For j = LBound(T, 1) To UBound(T, 1)
                    tt(i, j) = T(j, i)
                Next j
            Next i
        End If
    End If
   
    TransposeExcel = tt
End Function
 

Dudu2

XLDnaute Barbatruc
Ça ce n'est pas mon code qui est en Post #194.
exemple le '*. xls* peut très bien confondre H:\mondossier\classeur.xlstation trucmuche.blabla
Peut-être au niveau du DIR mais pas au niveau de la sélection de fichier
Mon code:
VB:
If Mid(oFile.Name, InStrRev(oFile.Name, ".") + 1) Like Extension Then TakeIt = True Else TakeIt = False
Ta modif qui ne va pas dans mon code:
Code:
If oFile.Name Like Extension Then TakeIt = True Else TakeIt = False
Car je passe la pattern juste de l'extension alors que tu passes la pattern du nom complet du fichier.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
D'ailleurs ce Post #194. je viens de le modifier pour ignorer l'erreur qu'a eue @ChTi160 sur C:. J'ai fait une erreur en testant trop tard "System Volume Information" par exemple.
Et le fichier mis à jour sur le Post #72.
Mais si on lance cette liste sur C: il faudra être très patient !
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
a bon ça fonctionne chez moi pour extension dure et part name entre deux (*)
'*blablabla*.txt"
seuls les fichier contenant blablabla et portant l’extension seront considérés
je les ai modifié ces deux lignes
ta version et même devenu plus rapide on passe en dessous des 0.2


et non sur C entier mieux vaut passer en bath ça fonctionne très bien
 

Pièces jointes

  • demo8.gif
    301.4 KB · Affichages: 12

ChTi160

XLDnaute Barbatruc
Re
Alors dans mon cas , j'ai scanné le Dossier Mes Documents et j'avais le même Problème !
j'ai donc cherché et je me suis rendu compte que j'avais dans ce Dossier Mes Documents
Trois fichiers Cachés Bizarres je les ai donc affichés , ils avaient une icone Bizarre elle Aussi
Dossiers Vide , Ma Musique ,Mes Images ,Mes Vidéos (peut être des résidus de DropBox ou Drive) Enfin !
je les ai supprimés et tout est rentré dans l'ordre .
Merci pour le partage de vos travaux
DIT : pour Dudu pas de N° d'erreur juste "Permission Refusée"
jean marie
 

patricktoulon

XLDnaute Barbatruc
sur C ca plante pratique sur toutes les lignes
comme tu gère en aval ben c'est en haut que ça plante et comme il n'y a pas de gestion d'erreur difficile de capter il faudrait mettre des on error goto quelquepart partout pour recenser toutes les erreurs
ça va être ingérable avec ta façon d'imbriquer
déjà tout les c:\user\toto\mes documents\ma musique
ainsi que video
et tout i cointi

non pour C il faut oublier FSO
pour cette raison et le fait que ça peut être long très..... long
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…