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
Ce serait intéressant e pouvoir interfacer ton système avec ExecuteExcel4Macro().
Ce "JJJJJJ" c'est quoi ?
à ça c'est le plus compliqué a comprendre c'est en fonction du retour attendu
l’entête de mon module te parlera peut être plus
VB:
'**************************************************************************************************************************
'        Manipulation des Api avec   ((ExecuteExcel4Macro))
'                          patricktoulon
'               fonctionne en 32 comme en 64 bits

' syntaxe de codage:
' CALL (nom_dll, nom_fonction, chaîne_type, func_arguments1, ..., func_argumentsN)

'1° nom_dll - le nom de la DLL, qui contient la fonction souhaitée. Ce nom doit contenir le chemin d'accès complet
' si la DLL ne se trouve pas dans votre dossier Windows, Système ou dans le dossier spécifié dans la variable d'environnement PATH.

'2° nom_fonction - nom de la fonction.

'3° type_string - chaîne de texte qui identifie le type de données de la valeur de retour et les types de données de tous les paramètres. Le premier caractère type_string définit la valeur de retour.

'4°  func_arguments1, ..., func_argumentsN - paramètres de fonction. Leurs types doivent respecter type_string. Il peut être transmis jusqu'à 27 paramètres.

'Types de données pour type_string: argument(chaîne_type)

'B - nombre à virgule flottante de 8 octets (IEEE), transféré par valeur, type C double.

'C - Chaîne terminée par zéro (null) (longueur max. = 255 caractères), transférée par référence, type C char *

'F - Chaîne terminée par zéro (null) (longueur max. = 255 caractères), transférée par référence (modifier sur place) , Type C char *

'J - entier signé de 4 octets de large, transféré par valeur, type C long int

'P - structure de données OPER d'Excel, transféré par référence, type C OPER *

'R - structure de données XLOPER d'Excel, transféré par référence, type C XLOPER *
'******************************************************************************************************************************
je traite pas mal d'api de la user32 avec et bien d'autre encore
après le nombre de caractères répétés correspond au nombre d'argument +1
en gros c'est un peu comme les arguments pour les lignes de commande
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Merci pour ta doc et ton explication.
J'ai trouvé:
- cette page en français mais elle ne dit rien sur chaîne_type.
- cette page en japonais (à traduire) qui donne des détails sur chaine-type et dit:
La valeur de code de "JJCCJ" utilisée dans la fonction Call correspond à la valeur de retour de la fonction MessageBoxA et au type de données de chaque argument. Voir « Comment utiliser les fonctions APPEL et ENREGISTRER » pour plus de détails (j'ai remplacé ce lien par un lien sur une page française).
 

patricktoulon

XLDnaute Barbatruc
ok je vais regarder
oui je connais la page de pijaku
tu veux des exemples d'utilisation je t'envoie les liens de fichiers que je déposerais sur cjoint

en mp car c'est une ressource en rédaction et je veux pas tout dévoilé ;)
cela dit c'est pas le sujet dans ce post
je l'ai fait juste pour que l'on ai une fonction générique passe partout
je l'ai encore affublé d'un atout (2d argument optional)
a savoir
  • 0 pour rien que fichier
  • 1 pour rien que dossier
  • 2 pour tout fichier tout dossier
& j'ai ajouté dans "/O" l'ordre alphabetique
ça peut servir ;)
VB:
Option Explicit
Sub testDIRcmd()
    Dim Racine$, tim#, T
    'Racine = "H:\*.txt"
    Racine = "H:\"
    [A1].CurrentRegion.Clear
    tim = Timer
    T = ListFichierCmdDos(Racine)
    MsgBox Timer - tim & " seconde(s) pour " & UBound(T) & " fichier ou dossiers(s)"
    [A1].Resize(UBound(T), 1).Value = T
End Sub


Function ListFichierCmdDos(Racine$, Optional dossier& = 2)
    Dim laChaine$, x&, fichier$, bat$, Commande$, tim#, tbl, tblV, i&, arr1, arr2, a&, doss
    doss = Switch(dossier = 0, "/A:-D", dossier = 1, "/A:D", dossier = 2, "")
    arr1 = Array("a`", "a^", "a¨", "e`", "e^", "e¨", "i`", "i^", "i¨", "o`", "o^", "o¨", "u`", "u^", "u¨")      'array caracteres séparés
    arr2 = Array("à", "â", "ä", "è", "ê", "ë", "ì", "î", "ï", "ò", "ô", "ö", "ù", "û", "ü")      'array caracteres regroupés
    bat = "C:\Users\polux\Desktop\baton.cmd"
    fichier = Environ("userprofile") & "\Desktop\list.txt"
    Commande = "chcp 28591 > nul " & vbCrLf & "dir " & Racine & " /S /B /O " & doss & " >" & fichier
    'creation du bath
    x = FreeFile: Open bat For Output As #x: Print #x, Commande: Close #x
    ShellAndwaitingEndProcess bat    'appel fonction shell améliorée
    'lecture du fichier
    x = FreeFile: Open fichier For Binary Access Read As #x: laChaine = String(LOF(x), " "): Get #x, , laChaine: Close #x
    For a = 0 To UBound(arr1)    'on fait le replace dans la chaine globale si defaut present(plus rapide que le replace dans les ligne du tableau)
        If laChaine Like "*" & arr1(a) & "*" Then laChaine = Replace(laChaine, arr1(a), arr2(a))
    Next
    tbl = Split(laChaine, vbCrLf)    'coupe(array 1 dim)
    'convert array 1 dim to 2 dim(transpose)
    ReDim tblV(UBound(tbl), 1 To 1): For i = 0 To UBound(tbl): tblV(i, 1) = tbl(i): Next
    ListFichierCmdDos = tblV
    Kill bat
    Kill fichier
End Function


Function ShellAndwaitingEndProcess(ByVal CheminComplet As String) As Long
    Dim ProcessHandle As Long
    Dim ProcessId As Long
    'ProcessId = Shell(CheminComplet, vbNormalFocus)
    ProcessId = Shell(CheminComplet, vbHide)
    'ON PASSE AUX APIS PAYée AU BLACK SANS DECLARATION
    ProcessHandle = ExecuteExcel4Macro("CALL(""Kernel32"",""OpenProcess"",""JJJJ"",""" & 2031616 & """,""" & 0 & """,""" & ProcessId & """)")
    ShellAndwaitingEndProcess = ExecuteExcel4Macro("CALL(""Kernel32"",""WaitForSingleObject"",""JJJJJ"",""" & ProcessHandle & """,""" & &HF0000 & """)")
End Function
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
je viens encore de gagner 0.1
en utilisant instr au lieu de like
VB:
   'If laChaine Like "*" & arr1(a) & "*" Then laChaine = Replace(laChaine, arr1(a), arr2(a))
    If InStr(1, laChaine, arr1(a)) Then laChaine = Replace(laChaine, arr1(a), arr2(a))
j'ai testé un bon nombre de fois pour confirmer le gain de temps

en même temps c'est normal like est lourd (c'est bien connu)caril teste toute les occurrences (en interne) avant de lâcher tandis que instr s’arrête a la première position trouvé
tout ces petits détail font que l'on accélère ;)
 

Dudu2

XLDnaute Barbatruc
Il faut utiliser le CODE PAGE 1252

Fichier .bat:
Code:
chcp 1252 > H:\TEMP\CmdDos.txt
chcp >> H:\TEMP\CmdDos.txt
dir H:\TEMP\ /S /B /A:-D >> H:\TEMP\CmdDos.txt

Fichier résultat:
Code:
Page de codes activeÿ: 1252
Page de codes activeÿ: 1252
H:\TEMP\CmdDos.bat
H:\TEMP\CmdDos.txt
H:\TEMP\œ,€,ã,à,â,ä,è,ê,ë,ì,î,ï,õ,ò,ô,ö,ù,û,ü.txt
 

patricktoulon

XLDnaute Barbatruc
heu c'est quoi c'est juste un test
parce que moi j'ai rien a part ce résultat
1612624882704.png
 

Dudu2

XLDnaute Barbatruc
le CHCP 1252 c'est pour récupérer correctement les caractères €, œ etc... qui ne le sont pas avec le CHCP 28591.
Ça ne dispense pas de la boucle de remplacement qui est pour récupérer une curiosité Windows sur des noms de fichiers que d'ailleurs je ne comprends pas.
 

patricktoulon

XLDnaute Barbatruc
re
ben oui 1252 récupère non seulement les caractères trucmuches mais aussi les caractères accentués
sauf pour les deux fichiers
c'est ça que je trouve bizarre
j'ai essayé
  • sans le chiffre
  • sans les parenthèses
  • sans les virgules

me reste plus qu'a tester la longueur il n'y a plus que cette possibilité
 

Dudu2

XLDnaute Barbatruc
Ces 2 fichiers sont des anomalies. Je ne sais pas comment Windows s'en sort avec ça.
Je me demande d'ailleurs s'il est bon de récupérer ces fichiers aux accents séparés.
Si Dir() VBA et Dir DOS les rendent avec les accents séparés, on devrait les laisser comme ça.
En plus, même récupéré, le GetAttr() plante quand même !
 

Discussions similaires

Statistiques des forums

Discussions
314 653
Messages
2 111 579
Membres
111 207
dernier inscrit
max008