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 :

Lister les sous-répertoires vides avec les API windows


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut Lister les sous-répertoires vides avec les API windows
    Bonjour à tous

    J'ai utilisé le code de Kiki29 C'est par ici pour lister les fichiers de tous les sous-répertoires à partir d'une racine sélectionnée dans un filedialog.

    Pas de problème, merci à Kiki29. Par contre je voudrai identifier les répertoires vides et là je ne sais pas comment procéder? Existe-t-il un attribut de l'objet répertoire à tester et lequel?

    Merci par avance pour votre aide
    Bonjour chez vous

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Le dossier d:\aaaaaaaa est vide si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto = dir("d\aaaaaaaa\")
    retourne ""
    Te reste à insérer cela comme condition dans le code que tu utilises

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Bonsoir unparia,

    Merci pour ta réponse et si je te suis dans le code suivant:

    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
    Private Sub SearchForFiles(sRoot As String)
    Dim WFD As WIN32_FIND_DATA
    Dim hFile As LongPtr
        hFile = FindFirstFile(sRoot & ALL_FILES, WFD)
        If hFile <> INVALID_HANDLE_VALUE Then
            Do
                '   if a folder, and recurse specified, call method again
                If (WFD.dwFileAttributes And vbDirectory) Then
                    If Asc(WFD.cFileName) <> vbDot Then
                        NbDossiers = NbDossiers + 1
                        If fp.bRecurse Then SearchForFiles sRoot & TrimNull(WFD.cFileName) & vbBackslash
                    End If
                Else
                    '   must be a file ..
                    If MatchSpec(WFD.cFileName, fp.sFileNameExt) Then
                        fp.nCount = fp.nCount + 1
                        shDatas.Cells(fp.nCount + RDepart, 2) = sRoot & TrimNull(WFD.cFileName)
                        ' shDatas.Cells(fp.nCount + RDepart, 3) = Format(CDate(WFD.ftLastWriteTime), "dd/mm/yyyy") ==> en erreur, pourquoi moi commandant cousteau ??????
                    End If
                End If
                fp.nSearched = fp.nSearched + 1
            Loop While FindNextFile(hFile, WFD)
            Application.StatusBar = NbDossiers & " / " & fp.nCount
        End If
        FindClose hFile
    End Sub
    après

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      If Asc(WFD.cFileName) <> vbDot Then
                        NbDossiers = NbDossiers + 1
    tu ajouterais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if  dir( sRoot & TrimNull(WFD.cFileName) ) then ....
    Ne pourrait-on pas tester un attribut de WFD pour éviter la commande dir qui est consommatrice de ressources?

    bonjour chez toi

  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
    pour éviter la commande dir qui est consommatrice de ressources?
    c'est la moins gourmande en tout cas certainement moins que les api les deux méthodes étant les plus rapide beaucoup de gens croit que les apis sont moins lourdes (certaines)
    mais en ce qui concernes les user 32,shell etc....on ne les vois pas dans la consommation Excel mais on peut le voir dans gestions de tache onglet services

    garde le dir surtout pour simplement tester la présence de fichiers dans un dossier
    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 confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, @informer : voir via liste des fichiers avec visualisation de l'arborescence ?
    Images attachées Images attachées  

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Salut PatrickToulon, merci pour ces infos qui répondent partiellement à ma question

    Pour une recherche récursive, qui de DIR, API ou FileSystemObject est le plus performant considérant toujours qu'ils soient bien maîtrisés, je précise pour ne pas me faire allumer par unparia

    Bonjour chez toi de toulon

    Citation Envoyé par kiki29 Voir le message
    Salut Kiki29,

    Dans ton outil, tu n'utilises pas les API pour récupérer la taille des répertoires et des fichiers mais l'obet Set FSO = CreateObject("Scripting.FileSystemObject"). Une raison autre que celle sûrement d'avoir commencé à développé avec cet objet?

    BOnjour c'est toi

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    Citation Envoyé par patricktoulon Voir le message
    c'est la moins gourmande en tout cas certainement moins que les api les deux méthodes étant les plus rapide beaucoup de gens croit que les apis sont moins lourdes (certaines)
    mais en ce qui concernes les user 32,shell etc....on ne les vois pas dans la consommation Excel mais on peut le voir dans gestions de tache onglet services

    garde le dir surtout pour simplement tester la présence de fichiers dans un dossier
    - Je rappelle que la fonction Dir de VB (tant VB6 que VBA) utilise elle-même la librairie Kernel32 de l'API de Windows (et aucune autre librairie).

    - Que la librairie Kernel32 est le noyau-même de Windows et est donc utilisée en permanence, quelle que soit l'application en cours.

    Utiliser la fonction Dir de VBA est sage. Utiliser directement ce dont se sert cette fonction est beaucoup plus rapide.
    Il va maintenant de soi que tout est dans la manière d'utiliser les deux méthodes (tant l'une que l'autre).
    Il serait abusif d'utiliser adroitement la fonction Dir et maladroitement les 4 fonctions nécessaires de la librairie Kernel32 pour déclarer ensuite que Dir est plus performante et moins gourmande.

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Bonjour à tous et merci pour votre aide et vos compléments d'info.

    Sur DIR, je suis très dubitatif car il ne me renvoie jamais de valeur même quand le répertoire est composé de sous-répertoires / fichiers
    J'ai donc dû utiliser

    Folder_Obj1.path
    Folder_Obj1.Files.Count
    Folder_Obj1.SubFolders.Count
    dans la fonction ci-dessous

    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
    Private Sub Find_Folder_List_From_Path(sRacine As String)
     
     
        'Çreate File System Objects to Use this FSO, Go to Tools -> References.
        'Find for “Microsoft Scripting Runtime” & Click the Checkbox.
        Dim FileSysObj_1 As FileSystemObject
        Dim Folder_Obj1 As Folder
     
        'Initialize Variables And Objects
        Set FileSysObj_1 = New FileSystemObject
     
        'Loop to get each Subfolder in the Root Path
        For Each Folder_Obj1 In FileSysObj_1.GetFolder(sRacine).SubFolders
            On Error Resume Next
            with forms"toto") 
                   .cells(1,2) = Folder_Obj1.path
                   .cells(1,3) = Folder_Obj1.Files.Count
                    .cells(1,4) = Folder_Obj1.SubFolders.Count
            End With    
    End Sub

    Question subsidiaire:

    Qui de FileSystemObject ou des API est le plus performant en terme de temps considérant que les API soient bien utilisées (Cf. commentaire de unparia)

    Merci encore pour votre aide
    Bonjour chez vous

  9. #9
    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 unparia
    oui c'est vrai tout dépends de leur utilisation
    j'ai tester notre dir recursif et celle avec les apis qui est plus rapide
    j'ai mi le panneau graphique dans gestion de tache et regarder le résultat
    pour le même travail le module avec les apis montent des pique a 800/900kilos et descend a 18/25kilo
    mais dir lui commence plus fort 70/110kilo en moyenne basse mais 400/500 kilo en moyen haute
    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. [VBA-*]Lister les sous-répertoires et les fichiers de ceux-ci
    Par ouskel'n'or dans le forum Contribuez
    Réponses: 8
    Dernier message: 19/01/2017, 19h05
  2. [Batch] lister un répertoire , en excluant les sous répertoires
    Par vince2005 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 23/05/2015, 21h53
  3. Lister les sous-répertoires d'un répertoire
    Par Jean-Luc80 dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/01/2009, 20h08
  4. Réponses: 1
    Dernier message: 09/10/2007, 06h44
  5. [VBA-*]Lister les sous-répertoires et les fichiers de ceux-ci
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 27/04/2007, 22h41

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