XL 2013 Macro pour recopier des fichiers

océanne

XLDnaute Occasionnel
Bonjour à tous,

je vous sollicite pour le besoin suivant :
j'ai besoin de recopier de très nombreux fichiers (.pdf, .docx., .xls, .jpg etc..) qui sont contenus dans un répertoire et des sous-répertoires vers un seul répertoire.
Je me suis appuyé sur cette macro ci-contre, qui marche très bien :
Dans mon module :
VB:
    Sub CopyFolder(folderpath As String, destfolderpath As String)

    Dim fso As Object

    Dim fld As Object

        Set fso = CreateObject("Scripting.FileSystemObject")

        Set fld = fso.GetFolder(folderpath)

        fld.Copy destfolderpath

    End Sub
Pour mon bouton de commande :
Code:
Private Sub CommandButton1_Click()

Call CopyFolder("C:\Documents\ZZZZZZ Source", "C:\Documents\ZZZZZZ Destination")

End Sub

Mon souci, c'est que le collage se fait de façon intégrale, et je retrouve les sous-répertoires de mon répertoire source, dans mon répertoire de destination. Alors que je voudrais dans le répertoire destination ne trouver que les fichiers.

J'espère être assez claire dans mes explications, je vous joins une illustration en annexe, sachant que dans le logigramme, je ne fais apparaitre qu'un niveau de sous répertoire, alors qu'en fait j'ai dans les sous-répertoires, d'autres sous-répertoires.
Merci pour votre aide.
O.
 

Pièces jointes

  • illustration répertoires.PNG
    illustration répertoires.PNG
    21.2 KB · Affichages: 20
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
sinon adapté de mon listeur recursif FSO

VB:
Sub test()
    Dim racine$, Destinationfolder$
    originalPath = "H:\fond d'ecran\"
    Destinationfolder = "C:\Users\polux\DeskTop\toto"' le nouveau dossier est sur le bureau pour les tests 
    liste = listeAndCopyfich_récursive(originalPath, Destinationfolder)
End Sub
'
'
Private Function listeAndCopyfich_récursive(originalPath, Optional newpath As String) As Variant
    Dim FSO As Object, Lparent As Object, SubFolder As Object, Fichier,fich$
    Set FSO = CreateObject("scripting.filesystemobject")    ' on declare l'object
    Set Lparent = FSO.GetFolder(originalPath)    'on attribue a l'object.getfolder le dossier demandé 'Scripting.Folder
    If GetAttr(Lparent) <> 22 Then
        For Each Fichier In Lparent.Files    'on boucle sur les fichiers qui sont dans ce dossier
            fich = Mid(Fichier, InStrRev(Fichier, "\") + 1) 'recup le nom dans le chemin
            Fichier.Copy newpath & "\" & fich
            Next
        'boucles sur les sous dossiers
        For Each SubFolder In Lparent.SubFolders    'on boucle sur les dossiers qui sont dans ce dossiers
             listeAndCopyfich_récursive SubFolder.Path, newpath    'si sub sub dossiers on rappelle la fonction en interne (récursivité)
        Next SubFolder
    End If
End Function

j'ai la même chose avec dir en récursif si tu veux
 

Staple1600

XLDnaute Barbatruc
Re

Alors à défaut de powershell, un bon vieux batch MS-DOS ;)
Ouvrir le bloc-notes et copier ce qui suit
(en prenant soin de changer le chemin des dossiers)
PHP:
@echo off
cls
set allF="C:\Users\STAPLE1600\Documents\TestA"
set backup="C:\Users\STAPLE1600\Documents\TestBckUp"
for /f "tokens=*" %%f in ('dir /b/s "%allF%"') do copy /Y "%%f" "%backup%"
Ensuite enregistrer sur le bureau avec comme nom copie.bat ou copie.cmd

NB: Il faut que dans les options d’affichage de Windows, les extensions de fichiers soient visibles
(Pour ce faire, décocher : Masquer les extensions de fichiers...)

PS: Je viens de faire le test sur W10
Ça marche bien (et cela rappelle le bon vieux temps de W98SE ;)
 

Staple1600

XLDnaute Barbatruc
Re

océanne
Qu'est-ce qui est tout bon?
Quelle solution as-tu privilégiée?
le fichier batch ou le code VBA?
Et si c'est le code VBA, tu peux le publier, ici peut-être ?
Il pourrait resservir à d'autres confrontés à une problématique identique à la tienne ;)
 

patricktoulon

XLDnaute Barbatruc
Staple1600 j'ai essayé ton bat avant de le lancer par vba directement sur le bureau et ca ne fonctionne pas W7

Code:
@echo off
cls
Set allF = "H:\fond d'ecran"
Set backup = "C:\Users\polux\DeskTop\toto"
for /f "tokens=*" %%f in ('dir /b/s "%allF%"') do copy /Y "%%f" "%backup%"
 

patricktoulon

XLDnaute Barbatruc
re bon je viens de tester sur meme disque avec nom simple et ca ne fonctionne pas
j'ai ajouté une pause pour relire le compte rendu et 0 fichiers copiés

Code:
@echo off
cls
Set allF = "C:\Users\polux\DeskTop\toto1"
Set backup = "C:\Users\polux\DeskTop\toto"
for /f "tokens=*" %%f in ('dir /b/s "%allF%"') do copy /Y "%%f" "%backup%"
pause
c'est dommage j'ai le code pour la lancer par vba sans passer par fichier intermédiaire
 

Discussions similaires

Réponses
15
Affichages
782
Réponses
19
Affichages
2 K

Statistiques des forums

Discussions
311 720
Messages
2 081 913
Membres
101 837
dernier inscrit
Ugo