Recherche de contenu dans un grand nombre de fichiers Excel

J'ai 2500 fichiers Excel. Je dois afficher toutes les lignes qui contiennent une certaine chaîne dans une certaine colonne. Comment puis-je faire ceci? Que faire si la chaîne donnée n'est pas dans une colonne fixe, mais pourrait-elle être dans n'importe quelle colonne?

2 Solutions collect form web for “Recherche de contenu dans un grand nombre de fichiers Excel”

Voici un code skelet-O. Vous pouvez soit construire sur ce ou quelqu'un d'autre ici peut. De grands morceaux doivent encore être écrits. Peut-être que je ferai plus quand je serai à la maison.

Option Explicit Sub findInFolders() Dim folderName As String 'this is where all the files reside, some extra work is neede if there are sub directories 'folderName = <put your folder name here> Dim files() As String: Set files = GetFolderContents Dim i As Integer Dim wb As Workbook, sht As Worksheet For i = LBound(files) To UBound(files) Set wb = Application.Workbooks.Open(files(i)) For Each sht In wb.Sheets GetRowsBasedOnString searchString, sht Next sht wb.Close False Set wb = Nothing Next i End Sub Function GetFolderContents(folderName As String) As String() Dim fso As FileSystemObject: Set fso = New FileSystemObject GetFolderContents = fso.GetFolder(folderName).files End Function Function GetRowsBasedOnString(searchString As String, sht As Worksheet) 'loop through range or use find or whatever. Find the value your looking for Dim found As Boolean, rng As Range If found Then ReportFoundRow rng End Function Function ReportFoundRow(foundRow As Range) 'write your found data to your master workbook End Function 

De vos commentaires, je suppose que vous n'avez jamais écrit une macro VBA. Votre première macro sera une montée de descente, mais après, chacun d'eux sera plus facile jusqu'à ce que vous oubliez de penser qu'ils pourraient être difficiles à écrire.

La macro ci-dessous suppose que tous les 2.500 classeurs sont dans le même dossier. C'est généralement l'approche la plus simple, mais il n'est peut-être pas possible dans votre cas. Si ce n'est pas possible, choisissez un dossier avec beaucoup de classeurs pour essayer cette macro. Vous devrez ajouter une explication de votre situation à votre question afin que je puisse expliquer comment cette macro peut être adaptée pour y répondre.

J'ai essayé de garder les choses simples, même si cela ne semble pas être ainsi. Il y a de meilleures façons de faire la même chose, mais je pense que c'est le bon compromis. J'ai inclus beaucoup de commentaires expliquant ce que fait le code. L'aide de l'éditeur de macro explique la syntaxe. Mais demandez-vous si vous vous débattez.

Créez un nouveau classeur dans le dossier que vous avez sélectionné pour le test. Mon code s'attend à une feuille de travail nommée "Bobert" qui est pratique pour moi. Choisissez un nom qui vous convient et modifiez le code pour qu'il corresponde; Je vous dis comment plus tard.

Sélectionnez Tools puis Macro puis Visual Basic Editor ou cliquez sur Alt + F11 .

En bas à gauche, vous aurez l'explorateur de projet. En haut à droite, vous aurez une zone grise. En bas à droite, vous aurez la fenêtre immédiate. Je pourrais parler de la fenêtre immédiate plus tard.

Sélectionnez Insert puis Module . "Module1" sera ajouté à l'explorateur de projet et la zone grise devient blanche. C'est la zone de code pour Module1.

Vous pouvez laisser le nom du module comme "Module1" ou vous pouvez le modifier. Cliquez sur F4. La fenêtre Propriétés s'affiche. La seule propriété d'un module est son nom. Cliquez sur "Module 1" dans "(Nom) Module1", extraire "Module1" et tapez le nom de votre choix. Fermez la fenêtre Propriétés.

Copiez le code ci-dessous dans la zone de code.

Cette macro s'attaque à la première partie de votre problème: elle trouve tous les livres de travail dans le dossier et toutes les feuilles de travail dans ces classeurs. Il crée une liste de ces feuilles de travail dans la feuille de travail "Bobert". Si les 2 500 classeurs ne peuvent pas être regroupés dans un seul dossier, vous devrez avoir besoin d'une macro comme celle-ci pour créer une liste des classeurs et des feuilles de travail à examiner, mais cette macro est conçue comme un exercice de formation. Créer une ligne d'en-tête:

  A1 = Folder B1 = Workbook C1 = Worksheet 

La seule déclaration que vous devrez changer immédiatement est:

  Set WShtDest = ActiveWorkbook.Worksheets("Bobert") 

Changez "Bobert" pour le nom que vous avez choisi pour la feuille de calcul dans laquelle la liste des feuilles de travail sera créée.

Placez le curseur sur l'instruction:

  RowDestCrnt = .Cells(Rows.Count, "A").End(xlUp).Row + 1 

Et cliquez sur F9. La ligne va marron parce que vous l'avez fait un point d'arrêt que j'explique dans un instant.

Chaque fois que vous cliquez sur F8, une déclaration du code sera respectée. Cela vous permet de parcourir le code. Si vous placez le curseur sur un nom de variable, sa valeur sera affichée. Vous pouvez passer à la feuille de calcul pour vérifier ce qui a changé.

Si vous pensez comprendre un bloc de code, cliquez sur F5 et le code sera exécuté jusqu'au prochain point d'arrêt. J'ai défini un, mais vous pouvez définir autant que vous le souhaitez.

J'espère que cela vous donnera quelque chose à réfléchir. Répondez à mes questions et je peux vous donner le prochain élément de la solution.

 Option Explicit ' Searching for content in a large number of Excel files ' http://superuser.com/q/452980/108084 Sub ListWorksheets() Dim ColDestCrnt As Long Dim FileNameList() As String Dim InxFNL As Long Dim InxW As Long Dim PathCrnt As String Dim RowDestCrnt As Long Dim WBkSource As Workbook Dim WShtDest As Worksheet Application.ScreenUpdating = False ' Create a reference to the worksheet in which data will be stored ' Change "Bobert" to your name for the destination worksheet. Set WShtDest = ActiveWorkbook.Worksheets("Bobert") ' This assumes the source workbooks are in the same folder as the workbook ' holding this macro. You could replace this with a statement like: ' PathCrnt = "C:\MyFiles" PathCrnt = ActiveWorkbook.Path ' GetFileNameList is a subroutine I wrote sometime ago. It returns an ' array of filenames within a specified folder (PathCrnt) that match a ' specified format (*.xls). Call GetFileNameList(PathCrnt, "*.xls", FileNameList) ' Get the next free row in worksheet Bobert. By calling this routine with ' different values for PathCrnt, you could built up a list containing files ' from many folders. With WShtDest RowDestCrnt = .Cells(Rows.Count, "A").End(xlUp).Row + 1 End With For InxFNL = LBound(FileNameList) To UBound(FileNameList) If FileNameList(InxFNL) <> ActiveWorkbook.Name Then ' In the Workbook Open statement, 0 means "do not update any links" and ' True means "open read only" Set WBkSource = Workbooks.Open(PathCrnt & "\" & FileNameList(InxFNL), 0, True) With WBkSource ' Record the name of each worksheet in the workbook For InxW = 1 To .Worksheets.Count WShtDest.Cells(RowDestCrnt, "A").Value = PathCrnt WShtDest.Cells(RowDestCrnt, "B").Value = FileNameList(InxFNL) WShtDest.Cells(RowDestCrnt, "C").Value = .Worksheets(InxW).Name RowDestCrnt = RowDestCrnt + 1 Next .Close SaveChanges:=False ' Close this source workbook End With End If Next End Sub Sub GetFileNameList(ByVal PathCrnt As String, ByVal FileSpec As String, _ ByRef FileNameList() As String) ' This routine sets FileNameList to the names of files within folder ' PathCrnt that match FileSpec. It uses function Dir$() to get the file names. ' I can find no documentation that says Dir$() gets file names in alphabetic ' order but I have not seen a different sequence in recent years. Dim AttCrnt As Long Dim FileNameCrnt As String Dim InxFNLCrnt As Long ' I initialise the array with space for 100 files and then enlarge it if ' necessary. This is normally enough space for my applications but since ' you are expecting 2,500 files I have replaced the original statement. 'ReDim FileNameList(1 To 100) ReDim FileNameList(1 To 2500) InxFNLCrnt = 0 ' Ensure path name ends in a "\" If Right(PathCrnt, 1) <> "\" Then PathCrnt = PathCrnt & "\" End If ' This Dir$ returns the name of the first file in ' folder PathCrnt that matches FileSpec. FileNameCrnt = Dir$(PathCrnt & FileSpec) Do While FileNameCrnt <> "" ' "Files" have attributes, for example: normal, to-be-archived, system, ' hidden, directory and label. It is unlikely that any directory will ' have an extension of XLS but it is not forbidden. More importantly, ' if the files have more than one extension so you have to use "*.*" ' instead of *.xls", Dir$ will return the names of directories. Labels ' can only appear in route directories and I have not bothered to test ' for them AttCrnt = GetAttr(PathCrnt & FileNameCrnt) If (AttCrnt And vbDirectory) <> 0 Then ' This "file" is a directory. Ignore Else ' This "file" is a file InxFNLCrnt = InxFNLCrnt + 1 If InxFNLCrnt > UBound(FileNameList) Then ' There is a lot of system activity behind "Redim Preserve". I reduce ' the number of Redim Preserves by adding new entries in chunks and ' using InxFNLCrnt to identify the next free entry. ReDim Preserve FileNameList(1 To 100 + UBound(FileNameList)) End If FileNameList(InxFNLCrnt) = FileNameCrnt End If ' This Dir$ returns the name of the next file that matches ' the criteria specified in the initial call. FileNameCrnt = Dir$ Loop ' Discard the unused entries ReDim Preserve FileNameList(1 To InxFNLCrnt) End Sub 
  • Grep pour "terme" et exclure "un autre terme"
  • Windows Explorer Bug? Pourquoi Windows Explorer Search Box ne reconnaît-il pas le caractère "R" pour un ensemble de noms de fichiers?
  • Rechercher dans l'option Microsoft Office
  • Soyons le génie de l'ordinateur et du réseau.