Compter des fichiers dans des dossiers
Bonjour,
j'ai une arborescence de dossier nominatif, dans lesquels je veux aller compter le nombre de fichier. 1 fichier correspond à un audit. je veux connaître le nombre d'audit par dossier et placer ce nombre dans une cellule Excel pour faire un graphe des nombres d'audits réalisés par personne. j'espère être assez clair. merci de votre aide
Phil
Bonjour,
Voici une proposition de fonction personnalisée :
function NBFILES(sRepertoire$, optional Extension$ = "*", optional MotCle$ = "") as long
application.volatile
fichier = dir(sRepertoire & "*" & MotCle & "*." & Extension)
while fichier <> ""
NBFILES = NBFILES + 1
fichier = dir
wend
end functionElle est à utiliser ainsi sur feuille :
=NBFILES(chemin)si on n'apporte pas de précision.
Pour cibler les fichiers avec une extension (pdf par exemple) :
=NBFILES(chemin; "pdf")Pour cibler ceux avec une extension et un mot-clé :
=NBFILES(chemin; "pdf"; "Audit")Avec juste un mot-clé :
=NBFILES(chemin;;"Audit")Il faut que chemin soit un répertoire existant :
exemple : "C:\User\DossierRacine\"
chemin doit terminer par un antislash !
Cdlt,
bonjour,
une autre proposition sous forme de macro. Ne fonctionne pas sur Mac.
Sub aargh()
Dim a As Object
Set a = lfr("d:\downloads\", "*.pdf") '<- répertoire de départ et filtre à adapter
Range("A1").Resize(a.Count, 1) = Application.Transpose(a.keys) 'nom des répertoires
Range("B1").Resize(a.Count, 1) = Application.Transpose(a.items) 'nombre de fichiers
End Sub
Function lfr(rep, Optional filtre = "", Optional ByRef dict, Optional n = 0) As Object
'function récursive qui renvoie un dictionnaire avec les noms des répertoires et leur nombre de fichiers
If IsObject(dict) = False Then Set dict = CreateObject("scripting.dictionary") 'crée le dictionnaire s'il n'existe pas
Set fso = CreateObject("scripting.filesystemobject") ' création d'un objet filesystem
Set rep = fso.getfolder(rep) ' se positionner sur le répertoire donné en paramètre
For Each repf In rep.subFolders ' parcourir chacun de ses sous-répertoires
dict.Add repf, 0 'créer une entrée dans le dictionnaire pour chaque sous-répertoire
lfr repf, filtre, dict, n + 1 ' explorer le sous-répertoire
Next repf
If filtre = "" Then 'si pas de filtres
dict(rep) = rep.Files.Count 'mettre le nombre de fichiers trouvés dans le répertoire au dictionnaire
Else
ctr = 0
For Each fichier In rep.Files
If fichier.Name Like filtre Then ctr = ctr + 1 'fichier correspond au filtre
Next
dict(rep) = ctr
End If
If n = 0 Then Set lfr = dict ' exploration terminée on renvoie le dictionnaire
End FunctionRebonjour à tous,
Voici une petite "surenchère"
Function NBALLFILES(dossier$, Optional filtre$ = "*") as long
application.volatile
Set fso = CreateObject("Scripting.filesystemobject")
Set fd = fso.getfolder(dossier)
For Each fil In fd.Files
If UCase(fil.Name) Like "*" & UCase(filtre) & "*" And fil.Attributes <= 33 Then NBALLFILES = NBALLFILES + 1
Next fil
For Each sfd In fd.subfolders
NBALLFILES = NBALLFILES + NBALLFILES(sfd.Path, filtre)
Next sfd
End FunctionCette fonction ignore la casse...
L'utilisation est similaire à la précédente, mais avec un paramètre en moins.
Cdlt,
Bonjour à tous,
Je vous remercie beaucoup de ces propositions, j'essaie ceci dès que possible (je chôme) et je vous tiens au courant. merci
Philippe
Bonsoir 3GB, j'ai essayé d'utiliser cette formule mais j'ai une réponse #NOM?
je ne connaissais pas cette fonction qui n'est pas proposée quand on tape un NB dans la barre.
Qu'est ce que j'ai mal fait?
merci
formule saisie:
=NBFILES('C':\Users\Phil\Documents\dossier1\dossier2\dossier3\dos1\; "pdf")
la réponse est :
| #NOM? |
j'essaie les macros demain et fin de semaine.
Bonsoir,
C'est qu'elle n'est pas reconnue. Il faut coller le code dans un module normal du fichier :
Onglet Développeur : Visual Basic/ (menu contextuel : Insertion/Module)/(fenetre projets : double clic sur le nouveau module) et coller le code dedans (en enlevant, le cas échéant, les éventuels caractères parasites liés à la copie "?", ";" et "Print" notamment).
Si l'onglet Développeur n'est pas activé : Onglet Fichier/Options/Personnaliser le ruban/Cochez développeur.
Pour la macro, il faut faire pareil.
Et pour les conserver ensuite, il faut enregistrer le fichier au format .xlsm (prenant en charge les macros).
Sinon, pour la formule, il faut :
=NBFILES("C:\Users\Phil\Documents\dossier1\dossier2\dossier3\dos1\"; "pdf")ou inscrire le chemin dans une cellule (sans les guillemets cette fois), disons en A1, et saisir dans une autre cellule :
=NBFILES(A1; "pdf")Cdlt,
=NBFILES("C:\Users\Phil\Documents\dossier1\dossier2\dossier3\dos1\"; "pdf")
ceci coller dans une cellule, je vois toujours #NOM ceci inscrit.
je suis désolé mais je ne comprends pas ce que je dois faire pour que cette formule simple me renvoie le nombre de .pdf
sinon
Pour la macro je vais essayer de me faire aider, je trouve ça super bien mais je suis trop débutant et je ne dois pas voir certaines choses simples qui
doivent être admises avant de se lancer dans les macros.
merci beaucoup de l'aide
Je viens d'éditer mes codes pour rendre les fonctions volatiles.
Pour qu'elle marche (tout comme la macro), il faut suivre les instructions de mon précédent commentaire :
Si l'onglet Développeur n'est pas activé (c'est à dire pas visible sur le ruban des onglets "Accueil/Insertion/....) : Allez dans l'onglet Fichier (tout à gauche, celui pour imprimer)/Options/Personnaliser le ruban/Cochez développeur.
Rendez-vous sur l'onglet Développeur (il est maintenant visible) : Visual Basic/ (menu contextuel : Insertion/Module)/(fenetre projets : double clic sur module1) et coller le code dedans (en enlevant, le cas échéant, les éventuels caractères parasites liés à la copie "?", ";" et "Print" notamment).
Et pour conserver ensuite les macros, il faut enregistrer le fichier au format .xlsm (prenant en charge les macros).
Bonsoir et merci
ça fonctionne bien, c'est Nickel!
je n'y serais pas arrivé sans votre aide.
très cordialement
Phil