I. Introduction▲
L'objet FileSearch n'étant plus supporté dans Office2007,
cet article propose une solution de substitution pour Excel.
Le classeur xla, téléchargeable en bas de cette page, contient un module de classe
ClasseFileSearch pour gérer la recherche de fichiers sur votre PC.
Lorsque le complément sera installé, vous pourrez rédiger facilement des macros
qui rechercheront des fichiers à l'intérieur de répertoires déterminés.
Nota.
Même si l'utilisation n'a pas grand intérêt dans cette configuration, sachez que la
procédure fonctionne aussi dans Excel2002.
II. Description▲
La procédure recherche des fichiers en fonction des critères spécifiés:
* Le répertoire contenant les fichiers à rechercher
* Option pour rechercher aussi dans les sous dossiers
* Option pour rechercher un type de fichier spécifique
* Option de tri
et renvoie le résultat dans un tableau contenant:
* Le nom des fichiers
* Le chemin
* La taille des fichiers (en octets)
* La date de création
* La date de dernière modification
* Le type de fichier
Installez la macro complémentaire dans le dossier qui leur ai réservé.
Les fichiers .xla Excel2007 sont généralement stockés dans le répertoire:
C:\Documents and Settings\NomUtilisateur\Application Data\Microsoft\AddIns
Ensuite, pour que le complément soit opérationnel à chaque ouverture de l'application:
Cliquez le bouton "Office".
Cliquez sur le bouton "Options Excel".
Sélectionnez le menu "Compléments".
Choisissez "Compléments Excel" dans le menu déroulant "Gérer" (en bas de la fenêtre).
Cliquez sur le bouton "Atteindre:".
La fenêtre qui s'affiche est identique aux versions antérieures d'Excel.
Cochez le complément "Classefilesearch".
Nota:
Cliquez sur le bouton Parcourir si le complément n'apparaît pas dans la liste ou s'il est stocké
dans un autre emplacement que celui prévu par l'application.
Cliquez sur le bouton "OK" pour valider.
Désormais, lorsque vous souhaitez utiliser cette fonction de recherche, il suffit d'activer
la référence ClFileSearch:
Dans l'éditeur de macro,
Menu Outils
Références
Cochez la ligne "ClFileSearch".
Cliquez sur le bouton OK pour valider.
Remarque:
Si la référence ClFileSearch n'apparait pas dans la liste, fermez totalement
l'application Excel puis ré-ouvrez la.
Et pour terminer, vous pouvez utiliser la syntaxe suivante dans vos projets:
Collez l'exemple ci-dessous dans un module standard et adaptez simplement le nom du répertoire
contenant les fichiers à rechercher.
Le résultat est écrit dans la fenêtre d'exécution de l'éditeur VBA (Ctrl+G).
Sub
Test
(
)
'Nécessite d'activer la référence ClFileSearch
'(Dans l'éditeur de macros: Menu Outils/Références)
Dim
i As
Long
Dim
Recherche As
ClFileSearch.ClasseFileSearch
Set
Recherche =
ClFileSearch.Nouvelle_Recherche
With
Recherche
'Définit le répertoire de recherche
.FolderPath
=
"C:\Documents and Settings\mimi\NomDossier"
'Définit la recherche dans les sous dossiers (True / False)
.SubFolders
=
False
'Option de tri:
'(Sort_None, sort_Name, sort_Path, sort_Size, sort_DateCreated, sort_LastModified, sort_Type)
'Pas de tri si le paramètre n'est pas spécifié.
.SortBy
=
sort_Name
'Option pour rechercher un type de fichier
'(Renvoie tous les fichiers si non spécifié)
'.Extension = "*.doc"
'Execute la recherche
.Execute
'Boucle sur le tableau pour afficher le résultat de la recherche
'(.FoundFilesCount renvoie le nombre de fichiers trouvés)
For
i =
1
To
.FoundFilesCount
Debug.Print
.Files
(
i).strFileName
'nom du fichier
Debug.Print
.Files
(
i).strPathName
'chemin
Debug.Print
.Files
(
i).lngSize
&
" octets"
'taille
Debug.Print
.Files
(
i).DateCreated
'date création fichier
Debug.Print
.Files
(
i).DateLastModified
'date dernière modification
Debug.Print
.Files
(
i).strFileType
'type de fichier
Debug.Print
"---"
Next
End
With
Set
Recherche =
Nothing
End
Sub
Les options de tri et de recherche par extension sont facultatives.
Si vous ne spécifiez pas l'option de tri, la recherche sera un peu plus rapide.
Utilisez un des paramètres suivant pour définir sur quelle colonne du tableau de résultat
(TabFiles) doit être appliqué le tri:
sort_Name: Tri sur le nom des fichiers
sort_Path: Tri sur le nom des répertoires
sort_Size: Tri sur la taille des fichiers
sort_DateCreated: Tri sur la date de création des fichiers
sort_LastModified: Tri sur la date de dernière modification
des fichiers
sort_Type: Tri sur les types de fichiers
Lorsque vous appliquez un tri, For i = 1 To .FoundFilesCount
affiche le résultat par ordre croissant.
Utilisez For i = .FoundFilesCount To 1 Step -1 pour afficher
le résultat par ordre décroissant.
III. Les procédures du complément▲
Dans un module Standard:
Option
Explicit
Public
Type
InfosResultFichiers
strFileName As
String
strPathName As
String
lngSize As
Long
DateCreated As
Date
DateLastModified As
Date
strFileType As
String
End
Type
'------------------------------------------
Public
Function
Nouvelle_Recherche
(
) As
ClasseFileSearch
Set
Nouvelle_Recherche =
New
ClasseFileSearch
End
Function
Dans un module de classe nommé ClasseFileSearch:
Option
Explicit
Option
Compare Text
Option
Base 1
'-------------------------------------------------
'Module de classe ClasseFileSearch pour Excel 2007
'SilkyRoad
'http://silkyroad.developpez.com/
'
'
'Mise à jour le 01.07.2007
'-------------------------------------------------
'La procédure recherche des fichiers en fonction des critères
'spécifiés et renvoie dans un tableau :
'Le nom des fichiers
'Le chemin
'La taille des fichers (en octets)
'La date de création
'La date de dernière modification
'Le type de fichier)
'-------------------------------------------------
'Enumération pour les options de tri
Public
Enum Sort_By
Sort_None
sort_Name
sort_Path
sort_Size
sort_DateCreated
sort_LastModified
sort_Type
End
Enum
Dim
TabFiles
(
) As
InfosResultFichiers
Dim
DirectoryPath As
String
Dim
lngFoundFilesCount As
Long
Dim
boolSousRep As
Boolean
Dim
strExtens As
String
Dim
optionSortBy As
Long
'Propriété pour le répertoire de recherche
Public
Property
Let
FolderPath
(
strFolderPath As
String
)
DirectoryPath =
strFolderPath
End
Property
'Propriété pour rechercher dans les sous dossiers
Public
Property
Let
SubFolders
(
boolSubFolders As
Boolean
)
boolSousRep =
boolSubFolders
End
Property
'Propriété pour lister les fichiers correspondants à la requête
Public
Property
Get
Files
(
Idx As
Long
) As
InfosResultFichiers
Files =
TabFiles
(
Idx)
End
Property
'Propriété pour l'extension des fichiers à rechercher
Public
Property
Let
Extension
(
strExtension As
String
)
strExtens =
strExtension
End
Property
'Propriété pour compte le nombre de fichiers
Public
Property
Get
FoundFilesCount
(
) As
Long
FoundFilesCount =
lngFoundFilesCount
End
Property
'Propriété pour l'option de tri
Public
Property
Let
SortBy
(
lngSortBy As
Sort_By)
optionSortBy =
lngSortBy
End
Property
'Fonction d'exécution
Public
Function
Execute
(
) As
Long
'Lance la recherche
ListeFichiers DirectoryPath
'Vérifie que des fichiers ont été trouvés et qu'une option de tri a
'été spécifié avant de lancer la procédure de tri.
If
lngFoundFilesCount >
1
And
optionSortBy <>
Sort_By.Sort_None
Then
_
FonctionTri optionSortBy
Execute
=
lngFoundFilesCount
End
Function
'Procédure pour lister les fichiers
Private
Sub
ListeFichiers
(
strFolderName As
String
)
Dim
Fso As
Object
Dim
NomDossier As
Object, SousDossier As
Object
Dim
objFichier As
Object
On
Error
GoTo
Fin
'Vérifie si le dossier spécifié existe
If
Dir
(
strFolderName, vbDirectory Or
vbHidden Or
vbSystem) =
""
Then
Exit
Sub
Set
Fso =
CreateObject
(
"Scripting.FileSystemObject"
)
Set
NomDossier =
Fso.GetFolder
(
strFolderName)
'Boucle sur les fichiers du répertoire
For
Each
objFichier In
NomDossier.Files
'Vérifie l'extension du fichier
If
objFichier.Name
Like strExtens Or
strExtens =
""
Then
'Redimensionne le tableau pour ajouter un nouvel élément
lngFoundFilesCount =
lngFoundFilesCount +
1
ReDim
Preserve
TabFiles
(
lngFoundFilesCount)
'Nom fichier
TabFiles
(
lngFoundFilesCount).strFileName
=
objFichier.Name
'Répertoire
TabFiles
(
lngFoundFilesCount).strPathName
=
objFichier.ParentFolder
'Taille du fichier (en octets)
TabFiles
(
lngFoundFilesCount).lngSize
=
objFichier.Size
'Date de création
TabFiles
(
lngFoundFilesCount).DateCreated
=
objFichier.DateCreated
'Date de création ou dernière modification
TabFiles
(
lngFoundFilesCount).DateLastModified
=
objFichier.DateLastModified
'Type de fichier
TabFiles
(
lngFoundFilesCount).strFileType
=
objFichier.Type
End
If
Next
objFichier
'Boucle récursive:
'(Si l'option de recherche dans les sous répertoires a été spécifiée)
If
boolSousRep Then
For
Each
SousDossier In
NomDossier.SubFolders
ListeFichiers SousDossier.Path
Next
SousDossier
End
If
Exit
Sub
:
Fin
:
MsgBox
"Erreur '"
&
Err
.Number
&
"'"
&
vbCrLf
&
vbCrLf
&
_
Err
.Description
, vbInformation
End
Sub
'Procédure de tri (reste à améliorer).
Private
Sub
FonctionTri
(
optionSortBy As
Sort_By)
Dim
i As
Long
, j As
Long
, k As
Long
Dim
ValTemp As
Variant
'Vérifie quel champ du tableau doit être trié
Select
Case
optionSortBy
Case
Sort_By.sort_Name
For
i =
LBound
(
TabFiles) To
UBound
(
TabFiles)
j =
i
For
k =
j +
1
To
UBound
(
TabFiles)
If
TabFiles
(
k).strFileName
<=
TabFiles
(
j).strFileName
Then
j =
k
If
TabFiles
(
k).strFileName
<=
TabFiles
(
j).strFileName
Then
j =
k
Next
k
If
i <>
j Then
ValTemp =
TabFiles
(
j).strFileName
: TabFiles
(
j).strFileName
=
_
TabFiles
(
i).strFileName
: TabFiles
(
i).strFileName
=
ValTemp
ValTemp =
TabFiles
(
j).strPathName
: TabFiles
(
j).strPathName
=
_
TabFiles
(
i).strPathName
: TabFiles
(
i).strPathName
=
ValTemp
ValTemp =
TabFiles
(
j).lngSize
: TabFiles
(
j).lngSize
=
_
TabFiles
(
i).lngSize
: TabFiles
(
i).lngSize
=
ValTemp
ValTemp =
TabFiles
(
j).DateCreated
: TabFiles
(
j).DateCreated
=
_
TabFiles
(
i).DateCreated
: TabFiles
(
i).DateCreated
=
ValTemp
ValTemp =
TabFiles
(
j).DateLastModified
: TabFiles
(
j).DateLastModified
=
_
TabFiles
(
i).DateLastModified
: TabFiles
(
i).DateLastModified
=
ValTemp
ValTemp =
TabFiles
(
j).strFileType
: TabFiles
(
j).strFileType
=
_
TabFiles
(
i).strFileType
: TabFiles
(
i).strFileType
=
ValTemp
End
If
Next
i
Case
Sort_By.sort_Path
For
i =
LBound
(
TabFiles) To
UBound
(
TabFiles)
j =
i
For
k =
j +
1
To
UBound
(
TabFiles)
If
TabFiles
(
k).strPathName
<=
TabFiles
(
j).strPathName
Then
j =
k
If
TabFiles
(
k).strPathName
<=
TabFiles
(
j).strPathName
Then
j =
k
Next
k
If
i <>
j Then
ValTemp =
TabFiles
(
j).strFileName
: TabFiles
(
j).strFileName
=
_
TabFiles
(
i).strFileName
: TabFiles
(
i).strFileName
=
ValTemp
ValTemp =
TabFiles
(
j).strPathName
: TabFiles
(
j).strPathName
=
_
TabFiles
(
i).strPathName
: TabFiles
(
i).strPathName
=
ValTemp
ValTemp =
TabFiles
(
j).lngSize
: TabFiles
(
j).lngSize
=
_
TabFiles
(
i).lngSize
: TabFiles
(
i).lngSize
=
ValTemp
ValTemp =
TabFiles
(
j).DateCreated
: TabFiles
(
j).DateCreated
=
_
TabFiles
(
i).DateCreated
: TabFiles
(
i).DateCreated
=
ValTemp
ValTemp =
TabFiles
(
j).DateLastModified
: TabFiles
(
j).DateLastModified
=
_
TabFiles
(
i).DateLastModified
: TabFiles
(
i).DateLastModified
=
ValTemp
ValTemp =
TabFiles
(
j).strFileType
: TabFiles
(
j).strFileType
=
_
TabFiles
(
i).strFileType
: TabFiles
(
i).strFileType
=
ValTemp
End
If
Next
i
Case
Sort_By.sort_Size
For
i =
LBound
(
TabFiles) To
UBound
(
TabFiles)
j =
i
For
k =
j +
1
To
UBound
(
TabFiles)
If
TabFiles
(
k).lngSize
<=
TabFiles
(
j).lngSize
Then
j =
k
If
TabFiles
(
k).lngSize
<=
TabFiles
(
j).lngSize
Then
j =
k
Next
k
If
i <>
j Then
ValTemp =
TabFiles
(
j).strFileName
: TabFiles
(
j).strFileName
=
_
TabFiles
(
i).strFileName
: TabFiles
(
i).strFileName
=
ValTemp
ValTemp =
TabFiles
(
j).strPathName
: TabFiles
(
j).strPathName
=
_
TabFiles
(
i).strPathName
: TabFiles
(
i).strPathName
=
ValTemp
ValTemp =
TabFiles
(
j).lngSize
: TabFiles
(
j).lngSize
=
_
TabFiles
(
i).lngSize
: TabFiles
(
i).lngSize
=
ValTemp
ValTemp =
TabFiles
(
j).DateCreated
: TabFiles
(
j).DateCreated
=
_
TabFiles
(
i).DateCreated
: TabFiles
(
i).DateCreated
=
ValTemp
ValTemp =
TabFiles
(
j).DateLastModified
: TabFiles
(
j).DateLastModified
=
_
TabFiles
(
i).DateLastModified
: TabFiles
(
i).DateLastModified
=
ValTemp
ValTemp =
TabFiles
(
j).strFileType
: TabFiles
(
j).strFileType
=
_
TabFiles
(
i).strFileType
: TabFiles
(
i).strFileType
=
ValTemp
End
If
Next
i
Case
Sort_By.sort_DateCreated
For
i =
LBound
(
TabFiles) To
UBound
(
TabFiles)
j =
i
For
k =
j +
1
To
UBound
(
TabFiles)
If
TabFiles
(
k).DateCreated
<=
TabFiles
(
j).DateCreated
Then
j =
k
If
TabFiles
(
k).DateCreated
<=
TabFiles
(
j).DateCreated
Then
j =
k
Next
k
If
i <>
j Then
ValTemp =
TabFiles
(
j).strFileName
: TabFiles
(
j).strFileName
=
_
TabFiles
(
i).strFileName
: TabFiles
(
i).strFileName
=
ValTemp
ValTemp =
TabFiles
(
j).strPathName
: TabFiles
(
j).strPathName
=
_
TabFiles
(
i).strPathName
: TabFiles
(
i).strPathName
=
ValTemp
ValTemp =
TabFiles
(
j).lngSize
: TabFiles
(
j).lngSize
=
_
TabFiles
(
i).lngSize
: TabFiles
(
i).lngSize
=
ValTemp
ValTemp =
TabFiles
(
j).DateCreated
: TabFiles
(
j).DateCreated
=
_
TabFiles
(
i).DateCreated
: TabFiles
(
i).DateCreated
=
ValTemp
ValTemp =
TabFiles
(
j).DateLastModified
: TabFiles
(
j).DateLastModified
=
_
TabFiles
(
i).DateLastModified
: TabFiles
(
i).DateLastModified
=
ValTemp
ValTemp =
TabFiles
(
j).strFileType
: TabFiles
(
j).strFileType
=
_
TabFiles
(
i).strFileType
: TabFiles
(
i).strFileType
=
ValTemp
End
If
Next
i
Case
Sort_By.sort_LastModified
For
i =
LBound
(
TabFiles) To
UBound
(
TabFiles)
j =
i
For
k =
j +
1
To
UBound
(
TabFiles)
If
TabFiles
(
k).DateLastModified
<=
TabFiles
(
j).DateLastModified
Then
j =
k
If
TabFiles
(
k).DateLastModified
<=
TabFiles
(
j).DateLastModified
Then
j =
k
Next
k
If
i <>
j Then
ValTemp =
TabFiles
(
j).strFileName
: TabFiles
(
j).strFileName
=
_
TabFiles
(
i).strFileName
: TabFiles
(
i).strFileName
=
ValTemp
ValTemp =
TabFiles
(
j).strPathName
: TabFiles
(
j).strPathName
=
_
TabFiles
(
i).strPathName
: TabFiles
(
i).strPathName
=
ValTemp
ValTemp =
TabFiles
(
j).lngSize
: TabFiles
(
j).lngSize
=
_
TabFiles
(
i).lngSize
: TabFiles
(
i).lngSize
=
ValTemp
ValTemp =
TabFiles
(
j).DateCreated
: TabFiles
(
j).DateCreated
=
_
TabFiles
(
i).DateCreated
: TabFiles
(
i).DateCreated
=
ValTemp
ValTemp =
TabFiles
(
j).DateLastModified
: TabFiles
(
j).DateLastModified
=
_
TabFiles
(
i).DateLastModified
: TabFiles
(
i).DateLastModified
=
ValTemp
ValTemp =
TabFiles
(
j).strFileType
: TabFiles
(
j).strFileType
=
_
TabFiles
(
i).strFileType
: TabFiles
(
i).strFileType
=
ValTemp
End
If
Next
i
Case
Sort_By.sort_Type
For
i =
LBound
(
TabFiles) To
UBound
(
TabFiles)
j =
i
For
k =
j +
1
To
UBound
(
TabFiles)
If
TabFiles
(
k).strFileType
<=
TabFiles
(
j).strFileType
Then
j =
k
If
TabFiles
(
k).strFileType
<=
TabFiles
(
j).strFileType
Then
j =
k
Next
k
If
i <>
j Then
ValTemp =
TabFiles
(
j).strFileName
: TabFiles
(
j).strFileName
=
_
TabFiles
(
i).strFileName
: TabFiles
(
i).strFileName
=
ValTemp
ValTemp =
TabFiles
(
j).strPathName
: TabFiles
(
j).strPathName
=
_
TabFiles
(
i).strPathName
: TabFiles
(
i).strPathName
=
ValTemp
ValTemp =
TabFiles
(
j).lngSize
: TabFiles
(
j).lngSize
=
_
TabFiles
(
i).lngSize
: TabFiles
(
i).lngSize
=
ValTemp
ValTemp =
TabFiles
(
j).DateCreated
: TabFiles
(
j).DateCreated
=
_
TabFiles
(
i).DateCreated
: TabFiles
(
i).DateCreated
=
ValTemp
ValTemp =
TabFiles
(
j).DateLastModified
: TabFiles
(
j).DateLastModified
=
_
TabFiles
(
i).DateLastModified
: TabFiles
(
i).DateLastModified
=
ValTemp
ValTemp =
TabFiles
(
j).strFileType
: TabFiles
(
j).strFileType
=
_
TabFiles
(
i).strFileType
: TabFiles
(
i).strFileType
=
ValTemp
End
If
Next
i
End
Select
End
Sub
Pour que le module de classe puisse être
utilisé dans un classeur autre que celui dans lequel il est déclaré,
j'ai utilisé le mode opératoire préconisé par Tushar Mehta:
Consultez l'article sur le site Microsoft.
La fonction de recherche des fichiers nécessite la présence sur votre poste de la DLL scrrun.dll
(Microsoft Scripting Runtime).
IV. Conclusion▲
La source présentée sur cette page est un simple exemple, facilement adaptable aux
spécificités de vos projets personnels.
Vous pourrez par exemple:
Personnaliser les données à insérer dans le tableau de résultat.
Améliorer la fonction de tri.
Utiliser d'autres méthodes pour lister les fichiers et récupérer des informations
sur les fichiers.
Vos remarques, critiques et propositions d'amélioration sont les bienvenues.
V. Liens▲
Alternative zum Filesearch
How to use a class (object) from outside of the VBA project in which it is declared.
La manipulation des fichiers en VBA, par Christophe WARIN.