IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

recherche récursive avec scripting.filesystemobject


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut recherche récursive avec scripting.filesystemobject
    Bonsoir a tous
    après une demande ressente d'un membre du forum , j'ai ressorti une vieillotte fonction de recherche récursive avec la librairie Scripting.filesystemobject
    alors voila

    j'ai virer les fonctions"dir" et employé le FSO pour les dossier et!! fichiers
    j'ai ajouté aussi la possibilité de rechercher plusieurs extensions différentes ou carrément (tout fichier avec l'argument "all") des exemple sont démontrés dans la sub de test

    sub de test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    '=======================================================================================================
    '              OBJECT  : FONCTION DE RECHERCHE RECURSIVE AVEC L'OBJECT SCRIPTING.FILESYSTEMOBJECT      =
    '                              createur  patricktoulon pour developpez.com                             =
    '                                       date de création  27/06/2010                                   =
    'Modification le  10/12/2016                                                                           =
    'Modif 1:FSO sert aussi pour boucler sur les fichier                                                   =
    'Modif 2:on peut maintenant rechercher plusieur extentions differentes                                 =
    '  ou carrément tout les fichiers avec l'argument "all"                                                =
    '                                                                                                      =
    '=======================================================================================================
    Option Explicit
    Sub test()
        Dim tabl
        'exemple d'utilisation on va transposer la liste sur le sheets
        'on recherche les fichier pdf et jpg
        tabl = recherche_récursive("C:\Users\polux\Desktop\testrecursiverecheche", ".pdf,.jpg")    'chemin entre guillemets a adapter
        'on recherche les fichiers text
        'tabl = recherche_récursive("C:\Users\polux\Desktop\testrecursiverecheche", ".txt")    'chemin entre guillemets a adapter
        'on recherche tout les fichiers toutes extention confondues
        'tabl = recherche_récursive("C:\Users\polux\Desktop\testrecursiverecheche", "all")    'chemin entre guillemets a adapter
        ' exemple 1:depot dans le sheets en colonne A
        Sheets(1).Cells(1, 1).Resize(UBound(tabl), 1) = Application.Transpose(tabl)
        'exemple 2 remplisage dans une listbox
        'Userform1.listbox1.List = recherche_récursive("C:\Users\polux\Desktop\testrecursiverecheche", "all")' tout fichier
    End Sub
    fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Function recherche_récursive(dparent, ext, Optional L As String) As Variant
        Dim FSO As Object, oFolder As Object, folderItem As Object, sous_dossier As Object, Ficher, arrayext As Variant, i As Long
        Set FSO = CreateObject("scripting.filesystemobject")    ' on declare l'object
        If ext = "all" Then ext = ".,." 'on prend toute extention pour "all"
        arrayext = Split(ext, ",.") ' on split par le ",."
        ' regard sur les fichiers
        Set folderItem = FSO.GetFolder(dparent)    'on attribue a l'object.getfolder le dossier demandé'Scripting.Folder
        For Each Ficher In folderItem.Files    'on boucle sur les fichiers qui sont dans ce dossiers
            For i = 0 To UBound(arrayext)
                If Ficher Like "*" & arrayext(i) Then L = L & Ficher & vbCrLf
            Next
        Next
        'regard sur les dossiers
        Set oFolder = FSO.GetFolder(dparent)    'on attribue a l'object.getfolder le dossier demandé
        For Each sous_dossier In oFolder.SubFolders    'on boucle sur les dossiers qui sont dans ce dossiers
            recherche_récursive sous_dossier.Path, ext, L    ' on rappelle la fonction avec pour argument le chemin du sous dossier ainsi que l'extension et L qui est déjà peut être remplie
        Next sous_dossier
        recherche_récursive = Split(L, vbCrLf)    'on coupe la liste par les saut de lignes on a maintenant un array la fonction devient cet array
    End Function
    elle commençait a vieillir un peu un petit coup de lifting ca mange pas de pain
    voila qu'en pensez vous
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Salut Patrick !

    Citation Envoyé par patricktoulon Voir le message
    j'ai virer les fonctions"dir" et employé le FSO pour les dossier et!! fichiers
    Comme déjà démontré sur ce site, FSO est tellement plus lent que Dir.
    Exemple d'un scan FSO ayant besoin de deux minutes et quinze secondes alors que sous Dir cela prend moins de 20s !
    (A relativiser car Dir a l'air d'être un peu plus favorisé par le cache mais s'avère quasi toujours bien plus rapide.)
    La raison pour laquelle je préfère me cantonner au standard VBA …

    Cependant la bibliothèque FSO externe au VBA est bien plus facile à prendre en main pour les débutants,
    enfin ceux qui ne lisent pas l'aide VBA interne et ne testent pas par eux-mêmes
    tandis que les autres, les bons, s'en sortiront bien avec juste la fonction VBA Dir …

    FSO a aussi un avantage pour les cas spéciaux : noms de fichiers avec caractères non Windows créés sur un autre OS,
    dossiers / fichiers cachés ou système, réseau, … là Dir peut ne pas les voir même en paramétrant bien ses options …

    Pour résumé dans les cas standards (en gros 90% des besoins), j'utilise Dir sinon pour les spéciaux cela peut être FSO.

    Sans oublier les API Windows s'avérant les plus efficaces comme déjà démontré par kiki29 (Salut Philippe !).

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour MarcL
    oui je suis d'accords c'est qu'elle est viellote cette fonction
    il est certain que aujourd'hui j'utilise dir en récursivité
    mais ca reste encore très complexe a monter pour un débutant sur tout que dir n'est pas récursif et exige une tamponade ( fermeture du dir sur itemfolder)
    j 'ai remis au gout du jour car pour moi elle est tellement simple a comprendre et a utiliser que même un débutant ne peut pas y perde son latin
    je vais l'essayer sur un disque complet bien chargé avec l'argument "all" voir si c'est si gênant

    EDIT:
    bon je viens de faire l'essai
    il faut exclure les dossiers system comme "RECYCLE.BIN,SYSTEM INFORMATION"etc... qui génère une erreur du au autorisation
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re si tu tiens a "DIR"
    voila la meme avec dir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Option Explicit
    Sub test2()
        Dim mesfichiers, chemin As String, ExT As String
        chemin = "H:\"    ' racine pour la recherche
        ExT = ".mp3,.txt"    ' exemple avec plusieurs extentions recherchés
        'ExT = "all"    ' extention de fichiers recherchés
        mesfichiers = cherche(chemin, ExT)    '  ||mesfichier|| deviendra un tableau de nom de fichiers selon les condition précédemment énumérée
        'exemple d'utilisation: depose la liste des fichier trouvés dans le sheets
        If UBound(mesfichiers) > 0 Then Cells(1, 1).Resize(UBound(mesfichiers), 1) = Application.Transpose(mesfichiers)
    End Sub
    Function cherche(dossier, ExT, Optional texte As String)
        Dim chemin As String, itemsvu As String, nbitemsVu As Long, i As Long, ArrayExT
        chemin = dossier & "\"
        itemsvu = Dir(chemin, vbDirectory)
        If ExT = "all" Then ExT = ".,"
        ArrayExT = Split(ExT, ",")
        Do
            nbitemsVu = nbitemsVu + 1
            If itemsvu <> "." And itemsvu <> ".." Then
                On Error Resume Next
                If (GetAttr(chemin & itemsvu) And vbDirectory) = vbDirectory Then
                    Call cherche(chemin & itemsvu, ExT, texte)
                    Err.Clear
                    'après avoir examiné le sous-dossier, il faut repositionner Dir sur l'entrée suivante
                    'car la fonction dir n'est pas récursive et a donc perdue la dernière position
                    'on réinitialise donc Dir et repositionne le flag à la bonne place avec nbitemsVu
                    itemsvu = Dir(chemin, vbDirectory)
                    For i = 1 To nbitemsVu - 1: itemsvu = Dir: Next i
                Else
                    For i = 0 To UBound(ArrayExT)
                        If itemsvu Like "*" & ArrayExT(i) Then texte = texte & chemin & "\" & itemsvu & vbCrLf
                    Next
                End If
            End If
            itemsvu = Dir
        Loop While itemsvu <> ""
        cherche = Split(texte, vbCrLf)
    End Function
    voila
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Ayant déjà publié des codes avec Dir sur ce forum (et j'en ai encore sous le coude) …

    Donc non je n'y tiens pas : j'ai juste apporté une précision quant à l'efficacité de FSO dans ce domaine.

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    oulah!!! avec dir j'ai un peu plus de 7000 fichier dans le disque H

    avec scripting.filesystemobject j'en plus de 12000

    y a un blême la
    je me disais aussi que dir était bien trop rapide et le nombre est bien 12563 fichier j'ai vérifié
    je ne vois pas ce qui cloche dans la fonction dir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. [XL-2003] Gestion fichier avec Scripting.FileSystemObject
    Par dev_php51 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/03/2011, 08h54
  2. accent avec l'ActiveXObject("Scripting.FileSystemObject")
    Par zalzasta dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/11/2010, 10h50
  3. Recherche récursive avec TIdFTP
    Par Leucistic dans le forum Débuter
    Réponses: 6
    Dernier message: 21/04/2008, 17h00
  4. Réponses: 4
    Dernier message: 02/04/2008, 23h10
  5. Réponses: 8
    Dernier message: 19/09/2006, 10h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo