Recherche dans de nombreux classeurs (Microsoft Excel)
Amit a un dossier qui contient des centaines de classeurs Excel. Il doit rechercher dans tous les classeurs un texte spécifique et se demande s’il existe un moyen de rechercher dans tous les classeurs et de déterminer les noms des classeurs contenant le texte souhaité, ainsi que les cellules des classeurs qui contiennent ce texte.
Trouver les classeurs contenant le texte souhaité est relativement simple. Tout ce que vous avez à faire est d’utiliser les capacités de recherche de Windows pour rechercher des fichiers, dans le dossier unique, qui contiennent le texte souhaité. Bien qu’il ne vous indique pas les emplacements des cellules, il affichera la liste des fichiers.
Bien sûr, vous pouvez utiliser une macro pour effectuer votre recherche à votre place. (C’est toujours une bonne idée d’utiliser une macro pour effectuer le travail long et fastidieux qui serait autrement fait manuellement.) Ce qui suit va parcourir tous les classeurs d’un dossier et rechercher ce que vous voulez localiser. Il ouvrira tout fichier se terminant par xls * (l’astérisque de fin signifie qu’il recherchera les fichiers xls, xlsx et xlsm).
Sub SearchFolders() Dim fso As Object Dim fld As Object Dim strSearch As String Dim strPath As String Dim strFile As String Dim wOut As Worksheet Dim wbk As Workbook Dim wks As Worksheet Dim lRow As Long Dim rFound As Range Dim strFirstAddress As String On Error GoTo ErrHandler Application.ScreenUpdating = False 'Change as desired strPath = "c:\MyFolder" strSearch = "Specific text" Set wOut = Worksheets.Add lRow = 1 With wOut .Cells(lRow, 1) = "Workbook" .Cells(lRow, 2) = "Worksheet" .Cells(lRow, 3) = "Cell" .Cells(lRow, 4) = "Text in Cell" Set fso = CreateObject("Scripting.FileSystemObject") Set fld = fso.GetFolder(strPath) strFile = Dir(strPath & "\.xls") Do While strFile <> "" Set wbk = Workbooks.Open _ (Filename:=strPath & "\" & strFile, _ UpdateLinks:=0, _ ReadOnly:=True, _ AddToMRU:=False) For Each wks In wbk.Worksheets Set rFound = wks.UsedRange.Find(strSearch) If Not rFound Is Nothing Then strFirstAddress = rFound.Address End If Do If rFound Is Nothing Then Exit Do Else lRow = lRow + 1 .Cells(lRow, 1) = wbk.Name .Cells(lRow, 2) = wks.Name .Cells(lRow, 3) = rFound.Address .Cells(lRow, 4) = rFound.Value End If Set rFound = wks.Cells.FindNext(After:=rFound) Loop While strFirstAddress <> rFound.Address Next wbk.Close (False) strFile = Dir Loop .Columns("A:D").EntireColumn.AutoFit End With MsgBox "Done" ExitHandler: Set wOut = Nothing Set wks = Nothing Set wbk = Nothing Set fld = Nothing Set fso = Nothing Application.ScreenUpdating = True Exit Sub ErrHandler: MsgBox Err.Description, vbExclamation Resume ExitHandler End Sub
Pour personnaliser la routine selon vos besoins, modifiez la variable strPath pour refléter le chemin d’accès au dossier que vous souhaitez traiter et modifiez strSearch pour refléter le texte que vous recherchez. La macro crée une nouvelle feuille de calcul et place des « hits » dans chaque ligne. La colonne A contient le nom du classeur, la colonne B le nom de la feuille de calcul, la colonne C l’adresse de la cellule et la colonne D le contenu de cette cellule.
De toute évidence, toute macro comme celle-ci prend un peu de temps à s’exécuter. Vous pouvez raccourcir quelque peu le temps en réduisant le nombre de fichiers nécessaires à la recherche. La meilleure façon de procéder consiste à utiliser l’approche Windows Search (décrite au début de cette astuce) pour identifier les classeurs dans lesquels se trouve le texte souhaité. Déplacez ces classeurs vers leur propre dossier, puis effectuez la recherche de macro sur ce dossier.
_Note: _
Si vous souhaitez savoir comment utiliser les macros décrites sur cette page (ou sur toute autre page des sites ExcelTips), j’ai préparé une page spéciale qui comprend des informations utiles.
lien: / excelribbon-ExcelTipsMacros [Cliquez ici pour ouvrir cette page spéciale dans un nouvel onglet de navigateur]
.
ExcelTips est votre source pour une formation Microsoft Excel rentable.
Cette astuce (5598) s’applique à Microsoft Excel 97, 2000, 2002 et 2003.