Un complément FileSearch pour Excel 2007
Date de publication : 24/06/2007
Par
SilkyRoad (silkyroad.developpez.com)
Ce tutoriel propose un complément Excel 2007 pour remplacer et personnaliser l'objet FileSearch.
I. Introduction
II. Description
III. Les procédures du complément
IV. Conclusion
V. Liens
VI. Téléchargement
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).
| Vba |
Sub Test()
Dim i As Long
Dim Recherche As ClFileSearch.ClasseFileSearch
Set Recherche = ClFileSearch.Nouvelle_Recherche
With Recherche
.FolderPath = "C:\Documents and Settings\mimi\NomDossier"
.SubFolders = False
.SortBy = sort_Name
.Execute
For i = 1 To .FoundFilesCount
Debug.Print .Files(i).strFileName
Debug.Print .Files(i).strPathName
Debug.Print .Files(i).lngSize & " octets"
Debug.Print .Files(i).DateCreated
Debug.Print .Files(i).DateLastModified
Debug.Print .Files(i).strFileType
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:
| Vba |
Public Type InfosResultFichiers
strNom As String
strChemin As String
lngTaille As Long
DateCreated As Date
DateLastModified As Date
TypeFichier As String
End Type
|
| Vba |
Public Function Nouvelle_Recherche() As ClasseFileSearch
Set Nouvelle_Recherche = New ClasseFileSearch
End Function
|
Dans un module de classe nommé ClasseFileSearch:
| Vba |
Option Explicit
Option Compare Text
Option Base 1
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
Public Property Let FolderPath(strFolderPath As String)
DirectoryPath = strFolderPath
End Property
Public Property Let SubFolders(boolSubFolders As Boolean)
boolSousRep = boolSubFolders
End Property
Public Property Get Files(Idx As Long) As InfosResultFichiers
Files = TabFiles(Idx)
End Property
Public Property Let Extension(strExtension As String)
strExtens = strExtension
End Property
Public Property Get FoundFilesCount() As Long
FoundFilesCount = lngFoundFilesCount
End Property
Public Property Let SortBy(lngSortBy As Sort_By)
optionSortBy = lngSortBy
End Property
Public Function Execute() As Long
ListeFichiers DirectoryPath
If lngFoundFilesCount > 1 And optionSortBy <> Sort_By.Sort_None Then _
FonctionTri optionSortBy
Execute = lngFoundFilesCount
End Function
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
If Dir(strFolderName, vbDirectory Or vbHidden Or vbSystem) = "" Then Exit Sub
Set Fso = CreateObject("Scripting.FileSystemObject")
Set NomDossier = Fso.GetFolder(strFolderName)
For Each objFichier In NomDossier.Files
If objFichier.Name Like strExtens Or strExtens = "" Then
lngFoundFilesCount = lngFoundFilesCount + 1
ReDim Preserve TabFiles(lngFoundFilesCount)
TabFiles(lngFoundFilesCount).strFileName = objFichier.Name
TabFiles(lngFoundFilesCount).strChemin = objFichier.ParentFolder
TabFiles(lngFoundFilesCount).lngTaille = objFichier.Size
TabFiles(lngFoundFilesCount).DateCreated = objFichier.DateCreated
TabFiles(lngFoundFilesCount).DateLastModified = objFichier.DateLastModified
TabFiles(lngFoundFilesCount).TypeFichier = objFichier.Type
End If
Next objFichier
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
Private Sub FonctionTri(optionSortBy As Sort_By)
Dim i As Long, j As Long, k As Long
Dim ValTemp As Variant
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).strChemin: TabFiles(j).strChemin = _
TabFiles(i).strChemin: TabFiles(i).strChemin = ValTemp
ValTemp = TabFiles(j).lngTaille: TabFiles(j).lngTaille = _
TabFiles(i).lngTaille: TabFiles(i).lngTaille = 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).TypeFichier: TabFiles(j).TypeFichier = _
TabFiles(i).TypeFichier: TabFiles(i).TypeFichier = 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).strChemin <= TabFiles(j).strChemin Then j = k
If TabFiles(k).strChemin <= TabFiles(j).strChemin 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).strChemin: TabFiles(j).strChemin = _
TabFiles(i).strChemin: TabFiles(i).strChemin = ValTemp
ValTemp = TabFiles(j).lngTaille: TabFiles(j).lngTaille = _
TabFiles(i).lngTaille: TabFiles(i).lngTaille = 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).TypeFichier: TabFiles(j).TypeFichier = _
TabFiles(i).TypeFichier: TabFiles(i).TypeFichier = 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).lngTaille <= TabFiles(j).lngTaille Then j = k
If TabFiles(k).lngTaille <= TabFiles(j).lngTaille 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).strChemin: TabFiles(j).strChemin = _
TabFiles(i).strChemin: TabFiles(i).strChemin = ValTemp
ValTemp = TabFiles(j).lngTaille: TabFiles(j).lngTaille = _
TabFiles(i).lngTaille: TabFiles(i).lngTaille = 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).TypeFichier: TabFiles(j).TypeFichier = _
TabFiles(i).TypeFichier: TabFiles(i).TypeFichier = 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).strChemin: TabFiles(j).strChemin = _
TabFiles(i).strChemin: TabFiles(i).strChemin = ValTemp
ValTemp = TabFiles(j).lngTaille: TabFiles(j).lngTaille = _
TabFiles(i).lngTaille: TabFiles(i).lngTaille = 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).TypeFichier: TabFiles(j).TypeFichier = _
TabFiles(i).TypeFichier: TabFiles(i).TypeFichier = 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).strChemin: TabFiles(j).strChemin = _
TabFiles(i).strChemin: TabFiles(i).strPathName = ValTemp
ValTemp = TabFiles(j).lngTaille: TabFiles(j).lngTaille = _
TabFiles(i).lngTaille: TabFiles(i).lngTaille = 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).TypeFichier: TabFiles(j).TypeFichier = _
TabFiles(i).TypeFichier: TabFiles(i).TypeFichier = 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).TypeFichier <= TabFiles(j).TypeFichier Then j = k
If TabFiles(k).TypeFichier <= TabFiles(j).TypeFichier 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).lngTaille: 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).TypeFichier: 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
VI. Téléchargement


Les sources présentées sur cette page sont libres de droits,
et vous pouvez les utiliser à votre convenance.
Par contre, la page de présentation constitue une
oeuvre intellectuelle protégée par les droits d'auteurs.
Copyright ©
2007
Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et
de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans
de prison et jusqu'à 300 000 E de dommages et intérêts.
Cette page est déposée à la
SACD.