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

patricktoulon

XLDnaute Barbatruc
re
liste des erreur sur C
moyen de controle
VB:
'On ne traite pas les répertoire ne contenant pas de fichiers avec extension
    If Len(Extension) = 0 Then
        TakeIt = True
    Else
        On Error Resume Next
        If Len(Dir(oDir.Path & "\" & Extension)) > 0 Then TakeIt = True Else TakeIt = False
   If Err.Number > 0 Then Feuil2.Cells(Rows.Count, 1).End(xlUp).Offset(1) = "err: " & Err.Number & "dans la condition len(extention) pour " & oDir.Path: TakeIt = False
    Err.Clear
    End If
 

patricktoulon

XLDnaute Barbatruc
VB:
'On ne traite pas les répertoire ne contenant pas de fichiers avec extension
    If Len(Extension) = 0 Then
        TakeIt = True
    Else
        On Error Resume Next
        If Len(Dir(oDir.Path & "\" & Extension)) > 0 Then TakeIt = True Else TakeIt = False
   If Err.Number > 0 Then TakeIt = False
    Err.Clear
    End If

mais attention c'est la ou le bas blesse dans ce genre de code
c'est que le fichier avec le dir ->extension en erreur oui mais les sous dossiers sont aussi zappé alors que c'est peut être simplement un fichier a la racine du dossier qui est interdit
je le sais par ce que j'avais corrigé cette méprise dans ma fonction dir sur DVP


pour faire plaisir a @Dudu2


 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
juste pour info
avec dir bath 14 secondes pour 235 213 fichiers
et j'ai pas le processeur qui rougi
je dis ça moi je dis rien

on a bien bossé
perso FSO comme on l'a mené c'est bien pour un disque de 10000 fichier au delà c'est pas pro
l'exercice n'est pas moins intéressant personne ne l'avait fait jusqu’à maintenant
bravo et merci a tous
 

Dudu2

XLDnaute Barbatruc
D'où l'utilité d'analyser les erreurs quand elles ne relèvent pas de situations identifiées.

Cette fonction Dir() introduit des erreurs #52 (Nom de fichier ou numéro incorrect) sur des répertoires FSO que je ne peux pas expliquer.
Par exemple j'ai un répertoire H:\TEMP parfaitement légitime et contenant des fichiers tous autorisés qui sort en erreur #52 dès qu'un Dir() est exécuté par le code (avant ? après ?).

Donc je ne vois qu'une solution: NE PAS appeler la fonctions Dir() dans cette fonction FSO.
Je l'ai retirée. Et tanpis pour le temps "perdu" en recherche de fichiers avec extension, l'essentiel étant d'avoir un résultat correct.

J'ai laissé le Dir() en commentaire dans le code. Pour ceux qui veulent vérifier que ça fout le bazar.
Les Post #194 et Post #72 ont été pour la nième fois mis à jour pour refléter cette modification.
 

patricktoulon

XLDnaute Barbatruc
re
j'ai testé
mis un dossier TEMP dans H
supprimer les autorisation system donc grant administrator et propriétaire
ben pas de soucis

beaucoup font cette erreur en devenant propriétaire avec contrôle total pensent qu'il sont les seul hors un dossier est d'office autorisé à l'entité system et donc le contrôle total grant administrator est caduque dans dans le cadre d'une tierce App qui tenterait d'accéder a ce dossier comme dans le cas présent avec FSO
 

Dudu2

XLDnaute Barbatruc
Je ne sais rien des conditions qui génèrent ce problème. Mais pour le reproduire, je suppose que tu peux essayer sur un plus gros répertoire ou disque. Tu devrais tomber tôt ou tard sur cette erreur, et même à plusieurs reprises dans 1 seul exécution. Le MsgBox donnera le nom des répertoires en erreur #52.

Puis tu ré-exécutes la même recherche en masquant l'instruction Dir() et tu constateras qu'il n'y a plus d'erreur #52.
 

patricktoulon

XLDnaute Barbatruc
erreur 52 c'est accès non autorisé ça veux dire que selon les app tiers tu ne pourra pas y accéder
la raison je te l'ai donné
en l’occurrence ici dir ne peux y accéder
bien sur il y a le dir (chemin ,VB critères) qui peux faire le laron(a tester)
après sincèrement je le redis lister C avec FSO c'est ridicule même si nous sommes arrivés a des vitesses plus que correctes (justement grâce à dir)
il y a aussi par exemple le temp de windows qui peux jouer des tours justement parce qu'il est occupé a encaisser ou lu par autre app
bref C a bien trop de contraintes; perso j'utilise le bath 14 secondes pour lister le disque sur la feuille
si je collectionne juste les fichiers recherchés je tombe a 6 secondes(même moyennant le tour de passe avec replace)

après entendons nous bien, le but est de rechercher des fichiers ;dans les boucles si on collectionne les fichier a garder et seulement eux, la durée diminue considérablement(avec quelque méthode que ce soit)

aussi !!! dans windows tu a des raccourcis chemins relatif avec le même nom par exemple mes documents ,mes images ma musique etc.... qui ne sont même pas accessibles par la boite de dialogue et c'est ce dir choppe justement

d'ou mon conseil plus haut d'utiliser les vbconstantes vbdirectory+vbsystem+....' la totale ...
quand tu les choppe et que tu fait un dir dessus ; ben un dir( chemin &"\*.*") sur un raccourci va planter forcement
par contre un
dir(chemin,vbdirectory or vbsystem or vbhidden,or vbnormal etc....) pourrait passer sauf protégé bien sur comme les dossiers cruciaux de windows
exemple


Voilà
 

Dudu2

XLDnaute Barbatruc
Je n'arrive plus à la reproduire là où elle se produisait avant (sur H:\) mais je la reproduis sur "F:\".
Comme je l'ai dit puis effacé, l'erreur #52 n'a rien à voir avec "Accès non autorisé".
La preuve...



De plus, je suis tombé aussi sur une erreur #53, qui n'a rien à voir non plus avec des droits d'accès.
J'ai vérifié et le répertoire existe bel et bien.

Ces erreurs qui se produisent sur l'object Folder oSubDir sur l'instruction de la boucle For Each oSubDir In oDir.subfolders ne se produisent pas si la fonction Dir() n'est pas appelée en amont dans le code.
Si c'était un simple problème de droits d'accès, l'erreur se produirait indépendamment de Dir().

Donc, je confirme que Dir() dans le code génère des altérations dans l'environnement FSO et qu'il faut donc ne pas l'utiliser.
 

Pièces jointes

  • 1612860540707.gif
    219.1 KB · Affichages: 5
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re:
j'ai donc ré essayé le code du #194
alors effectivement il n'y a plus d'erreur sur C
mais avant je trouvais 7477 fichier"...txt" je n'en trouve plus 4450
et le temps a pratiquement tripler de 85 S environ je passe à 233 S

je le redis FSO a éviter sur C
 

Discussions similaires

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