'Déclaration des variables dans le haut du module
Option Explicit
Dim Obj As Object
Dim Arr()
Sub A_CopieDesFichiers_Répertoires_Et_Sous_Répertoires()
'Copie les Fichiers d'un Répertoire et de ses Sous Répertoires
Dim RépertoireSource As String, Lextension As Variant
Dim Ok As Boolean, RépertoireDestination As String
Dim SousRep As Boolean
' Choix par boîte de dialogue
Dim DossierA As FileDialog
Dim DossierB As FileDialog
    Set DossierA = Application.FileDialog(msoFileDialogFolderPicker)
    Set DossierB = Application.FileDialog(msoFileDialogFolderPicker)
      
     With DossierA
          .AllowMultiSelect = False
          .InitialFileName = "C:\Users\Nom_du_propriétaire_du_compte\Documents\" 'A adapter le chemin
          .Title = "Choix du dossier source"
          If .Show = -1 Then RépertoireSource = .SelectedItems(1) & "\" Else RépertoireSource = 0
     End With
     
     With DossierB
          .AllowMultiSelect = False
          .InitialFileName = "C:\Users\Nom_du_propriétaire_du_compte\Documents\"  'A adapter le chemin
          .Title = "Choix du dossier destination"
          If .Show = -1 Then RépertoireDestination = .SelectedItems(1) & "\" Else RépertoireDestination = 0
     End With
'********** À adapter éventuellement en cas de non utilisation de boîte de dialogue *****************
        'Définir le répertoire Source
'RépertoireSource = "c:\Users\MonNom\Documents\Départ\"
        'Définir le répertoire Source
'RépertoireDestination = "c:\Users\MonNom\Documents\Destination\"
'************************************************
                'À adapter pour la copie :
        'Inclure les fichiers des sous-répertoires : "True"
        'exclure les fichiers des sous-répertoires : "False"
SousRep = True
'************************************************
If Dir(RépertoireSource, vbDirectory) = "" Then
    MsgBox "Le répertoire source : """ & RépertoireSource & _
        """ est introuvable. Opération annulée."
    Exit Sub
End If
If Dir(RépertoireDestination, vbDirectory) = "" Then
    MsgBox "Le Répertoire de destination : """ & RépertoireDestination & _
        """ est introuvable. Opération annulée."
    Exit Sub
End If
Ok = False
Do
    'Selon les besoins, on peut définir les catégories à
    'afficher et les extensions pour chaque type.
    Lextension = Application.InputBox( _
        "1- Classeurs Excel                 |          6 = Tous les fichiers" & vbCrLf & _
        "2- Documents Word" & vbCrLf & _
        "3- Fichiers de musique" & vbCrLf & _
        "4- Fichiers texte" & vbCrLf & _
        "5- Présentations PowerPoint" & vbCrLf & _
        "Insérer LE numéro correspondant.", "Type de fichier à afficher?")
    If Val(Lextension) > 0 And Val(Lextension) < 7 Then
        Ok = True
        Select Case Val(Lextension)
            Case Is = 1 'Fichiers Excel
                Arr = Array(".xls", ".xlt", ".xlsx", _
                    ".xlsm", ".xla", ".xlam", ".xlb")
            Case Is = 2 'Fichiers Word
                Arr = Array(".doc", ".dot", ".docx", _
                        ".docm", ".dotm", ".dotx")
            Case Is = 3 ' Fichiers de musique
                Arr = Array(".mp3", ".wav", ".flac")
            Case Is = 4 'Fichiers Texte
                Arr = Array(".txt", ".csv", ".rtf")
            Case Is = 5 'Fichiers PowerPoint
                Arr = Array(".ppt", ".pps", ".ppsx", ".ppsm")
            Case Is = 6 'Tous les fichiers
                Arr = Array("tous")
        End Select
    Else
        If MsgBox("Votre choix est autre que ceux suggérés." & vbCrLf & _
            vbCrLf & "désirez-vous annuler l'opération?", _
                vbCritical + vbYesNo, "Attention") = vbYes Then
            Exit Sub
        End If
    End If
Loop Until Ok = True
Set Obj = CreateObject("Scripting.FileSystemObject")
Call CopieDeFichiers(RépertoireSource, RépertoireDestination, SousRep)
End Sub
'-----------------------------------------
Sub CopieDeFichiers(RépertoireSource As String, _
                RépertoireDestination As String, _
                Inclure_Sous_Répertoires As Boolean)
Dim RepSource As Object, F As Object
Dim SousRepSource As Object, Ext As String
Set RepSource = Obj.getfolder(RépertoireSource)
For Each F In RepSource.Files
    Ext = "." & Split(F.Name, ".")(UBound(Split(F.Name, ".")))
    If Not IsError(Application.Match(Ext, Arr, 0)) Or Arr(0) = "tous" Then
        Obj.CopyFile RepSource.Path & "\" & F.Name, RépertoireDestination, True
    End If
Next
If Inclure_Sous_Répertoires Then
    For Each SousRepSource In RepSource.SubFolders
        Call CopieDeFichiers(SousRepSource.Path, RépertoireDestination, True)
    Next
End If
End Sub