Explorer les répertoires et fichiers par VBA


Pour obtenir des informations sur un répertoire, VBA offre deux fonctionnalités intéressantes :
Dir (déjà présent dans le DOS) permet de lister tous les fichiers d'un répertoire.
FileSearch permet d'obtenir de multiples informations (nom, type, taille, date de dernbière modification...) sur les fichiers du répertoire (fichiers Windows seulement).
La fonction FileLen est également utile pour évaluer la taille d'un fichier.

A partir de ces fonctionnalités, on peut facilement explorer le contenu d'un répertoire pour en déterminer le nombre de fichiers, le poids de chacun des sous-répertoires, l'ordre de modification des fichiers...

Quelques exemples :


Rechercher la taille de chacun des sous-répertoires

L'exemple est un peu théorique dans la mesure où des utilitaires très efficaces et très rapides sont disponibles en freeware sur le Web.
Le principe est simple :
On choisit d'abord le répertoire à explorer, en utilisant Application.GetOpenFilename qui ouvre la boite de dialogue "Fichiers / Ouvrir" et renvoie le nom du répertoire sélectionné.
On recherche ensuite les noms des sous-répertoires par : nom_ssrep = Dir(nom_repertoire, vbDirectory)
etiq:
If nom_ssrep <> "" Then
If (GetAttr(nom_repertoire & "\" & nom_ssrep) And 16) = 16 Then MsgBox(nom_ssrep)
nom_ssrep = Dir
GoTo etiq
End If
nom_ssrep = Dir(nom_repertoire, vbDirectory) va rechercher le nom du premier sous-répertoire du répertoire exploré (nom_repertoire). L'argument vbDirectory indique que l'on inclut dans la recherche les répertoires (mais Dir prend aussi bien les simples fichiers que les répertoires). Dir renvoie le nom s'il existe ou une chaine vide ("") sinon.
If nom_ssrep <> "" vérifie l'existence du sous-répertoire.
S'il existe, on passe à la recherche du suivant en appelant à nouveau Dir.
If (GetAttr(nom_repertoire & "\" & nom_ssrep) And 16) = 16 permet de tester si le fichier choisi est bien un répertoire.
La boucle GoTo etiq permet de balayer tous les sous-répertoires jusqu'au dernier (sortie de la boucle quand Dir renvoie "").

Dans chaque sous-répertoire, on peut aller chercher tous les fichiers et en noter le nombre et la taille.
FileSearch est d'utilisation commode : With Application.FileSearch
.NewSearch
.LookIn = nom_repertoire
.SearchSubFolders = True
.FileName = "*"
.FileType = msoFileTypeAllFiles
.Execute
End With
...permet de lancer la recherche de tous les fichiers contenus dans le répertoire "nom_repertoire" et dans ses sous-répertoires (.SearchSubFolders = True).
Le nombre de fichiers est récupéré par Application.FileSearch.FoundFiles.Count, la taille du 3ème fichier par FileLen(Application.FileSearch.FoundFiles(3)).

La macro "explorer un répertoire" du fichier "rech_fichier.xls" (fichier .zip à télécharger) est basée sur ce principe et présente le résultat sous forme de graphique.


Rechercher les derniers fichiers modifiés

Cette macro permet notamment, par examen du répertoire contenant les fichiers temporaires Internet (TIF), de se faire une bonne idée de l'intensité du surf sur Internet pendant les deux derniers jours.
Elle utilise FileSearch, qui présente l'inconvénient d'être très lent.

La recherche des fichiers du répertoire "nom_repertoire" qui ont été modifiés aujourd'hui ou hier se fait aisément avec FileSearch : Set fs = Application.FileSearch
With fs .LookIn = nom_repertoire
.SearchSubFolders = True
.LastModified = msoLastModifiedYesterday
.Execute
End With
Application.FileSearch.LastModified = msoLastModifiedYesterday permet de sélectionner les fichiers modifiés hier.
Pour obtenir les fichiers modifiés aujourd'hui, utiliser Application.FileSearch.LastModified = msoLastModifiedToday.
Il est facile de dresser la liste des fichiers modifiés avec la date de modification.
Il suffit alors de tracer un graphique avec une barre d'histogramme à chaque modification de fichier pour avoir une représentation de l'activité sur Internet.


Télécharger le fichier (fichier .zip)
 


Faire sur une page Excel l'arborescence complète de tous les sous-répertoires et fichiers d'un répertoire, avec liens hypertexte sur les fichiers

Dans le fichier Excel proposé au téchargement, il suffit de cliquer sur un bouton pour que le programme vous propose de choisir un répertoire, puis en trace l'arborescence sur une page Excel (Cliquez ici pour télécharger le fichier Excel zippé).
Le programme est basé sur deux fonctions qui permettent de lister tous les sous-répertoires d'un dossier ou bien tous les fichiers, et qui renvoient le résultat sous forme de tableau :

Pour les sous-répertoires :
Function ss_rep(nom_repertoire)
'renvoie un tableau contenant tous les sous-répertoires de nom_répertoire
nom_rep = nom_repertoire
If Right(nom_rep, 1) <> "\" Then nom_rep = nom_rep & "\"
num = 0
nom_ssrep = Dir(nom_rep, vbDirectory)
ReDim ss_repe(0)
encor:
If nom_ssrep <> "" Then
If nom_ssrep <> "." And nom_ssrep <> ".." And _
     (GetAttr(nom_rep & nom_ssrep) And 16) = 16 Then
ReDim Preserve ss_repe(num)
ss_repe(num) = nom_rep & nom_ssrep
num = num + 1
End If
nom_ssrep = Dir
GoTo encor
End If
ss_rep = ss_repe
End Function


Pour les fichiers :
Function fich(nom_repertoire)
'renvoie un tableau contenant tous les fichiers de nom_répertoire
nom_rep = nom_repertoire
If Right(nom_rep, 1) <> "\" Then nom_rep = nom_rep & "\"
num = 0
nom_fich = Dir(nom_rep & "*.*")
ReDim fichi(0)
etiq:
If nom_fich <> "" Then
ReDim Preserve fichi(num)
fichi(num) = nom_fich
num = num + 1
nom_fich = Dir
GoTo etiq
End If
fich = fichi 'numéroté à partir de 0
End Function


Sur la base de ces deux fonctions, il est facile de construire une macro qui explore un répertoire. Cliquez ici pour télécharger le fichier Excel zippé.