Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Recherche dans fichier excel dans un répertoire

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Loulou27

XLDnaute Nouveau
Bonjour,

Je voulais rechercher des choses dans des fichiers excel dans 1 répertoire mais je me rends compte que avec la fonction "Recherche" de l'explorateur, je n'ai apparemment pas ce qu'il faut comme résultat (manque des fichiers ou pas les bons)

Je pense le faire en ouvrant les fichiers excel 1 à 1 mais va prendre un temps fou je pense car j'ai plus de 6500 fichiers / mois

Avez-vous une solution simple (peut-être paramètrages windows .... autre que en passant par excel) ?

Il faut que je cherche une référence telle que ce format XX XX XX puis dans tous ces fichiers, une seconde référence en XX XX XX XX XX


De plus, les fichiers sont en xlsx donc faut -il les renommer en xls o =u cela ne sert à rien ?


N.B :
j'ai essayé avec cette fonction
FINDSTR /M /C:"*XX XX XX*" *.*

mais cela ne marche pas du tout


Merci pour votre aide
 
Dernière édition:


Re,

Le besoin évolue et/ou n'est à la cible ou s'améliore au fur et à mesure des échanges avec mes collègues


A la base, il fallait que cherche une donnée 1 dans les fichiers puis dans ces fichier, si il existe la donnée 2

==> ta proposition aurait fonctionné à ce moment



mais en faisant les tests dans ce sens, la donnée 2 peut-être présente mais ayant une valeur (dans une cellule sur la même ligne) différente; ce qui complexifiait le mode recherche simple que tu as employé




Ensuite, un collègue a un besoin de recherche d'une donnée A dans un onglet et dans ce même fichier, il faut extraire une donnée B si elle existe …

Cela ne devient plus de la simple recherche de fichiers contenant 1 information mais de l'extraction de données spécifiques de chaque fichier; c'est pour cela que je suis obligé de scruter chaque fichier 1 à 1; cela fonctionne mais des fois cela bloque (PB mémoire)


Ce PB mémoire à l'air un peu plus profond, j'ai mis 6000 fichiers dans 1 répertoire et c'est ok
J'ai mis les 6000 suivants dans 1 autre répertoire et là NOK à 2070

Peut-être un truc dans certains fichiers qui font ce bug !!!
 
Déjà TU peut recherche les deux valeurs dans le même fichier and pour le et or pour le ou.

Si c'est 2 valeur et/ou selon si tu cherche le 2 ou une ou l'autre te donnerons le nom et le chemin complet du fichier. Cette partie est un écrémage pour n'avoir qu'à investigué sur moins de fichiers que les 6500.

Quand tu as la liste des fichiers tu peux soit avec une autre méthode adodb vérifier le contenu à l'onglet et la ligne près ou ovir ton fichier comme tu le fais certainement.

Notes que si actuellement tu as des problème de mémoire c'est sans doute que tu ne libère pas ta mémoire
Code:
 while dir<>""
     set variables =objet
     Set variables= nothing : doevent ' je librairie la mémoire et je rentre la windows.

Tu as toujours la possibilité d'une libération automatique
Code:
 with workbooks.open( fichier)
          If .sheet("toto").range("A1")="titi" then
          En if
         .close
End with
Doevent
 
Dernière édition:
C'est curieux car sur Win 11 Excel 2019 je n'ai pas ce problème.

J'ai créé 9000 fichiers .xlsx identiques aux 3 du post #19, la macro s'exécute sans difficulté en 190 secondes (puis 230 secondes).
Voici un exemple de fichier source dans lequel je dois chercher les infos


Et mon code

Option Explicit
Const Feuil1$ = "DOVE"
Const Feuil2$ = "Communication"
Const col1% = 1 'colonne A
Const col2% = 6 'colonne F
Const crit1$ = "Véhicule :"
Const crit2$ = "Vin :"
Const crit3$ = "Battery Identification Number :"
Const crit4$ = "<- 62 F0 29*"
Dim fichier$, lig&, trouve&

Sub Recherche()
Dim t, chemin$, form$, compte
On Error Resume Next
t = Timer
chemin = "REPERTOIRE_FICHIERS" & "\"
fichier = Dir(chemin & "*.xlsx") '1er fichier du dossier
lig = 3
Application.ScreenUpdating = True
Rows(lig & ":" & Rows.Count).ClearContents 'RAZ
While fichier <> ""
compte = compte + 1
Application.StatusBar = compte & " " & fichier

form = "'" & chemin & "[" & fichier & "]" & Feuil1 & "'!"
Formule form, col1, crit1, lig
Formule form, col1, crit2, lig
Formule form, col1, crit3, lig

form = "'" & chemin & "[" & fichier & "]" & Feuil2 & "'!"
Formule form, col1, crit4, lig

If trouve = 1 Then lig = lig + 1

fichier = Dir 'fichier suivant
trouve = 0
Wend
MsgBox Timer - t
End Sub

Sub Formule(form$, col%, crit$, lig&)
Dim f$, v
On Error Resume Next
f = "MATCH(""" & crit & """," & form & "C" & col & ",0)"
v = ExecuteExcel4Macro(f)
If IsNumeric(v) Then
trouve = 1
Cells(lig, 1) = fichier 'retourne le nom du fichier
If crit = crit1 Then Cells(lig, 2) = ExecuteExcel4Macro(form & "R" & v & "C" & col + 1) 'retourne la valeur du Véhicule
If crit = crit2 Then Cells(lig, 3) = ExecuteExcel4Macro(form & "R" & v & "C" & col + 1) 'retourne la valeur du Vin
If crit = crit3 Then Cells(lig, 4) = ExecuteExcel4Macro(form & "R" & v & "C" & col + 1) 'retourne la valeur du BIN

If crit = crit4 Then Cells(lig, 5) = ExecuteExcel4Macro(form & "R" & v & "C" & col) 'retourne la valeur de la trame 62 F0 29
End If
End Sub





Je viens de refaire un essai, ça a terminé les 6600 fichiers mais ensuite, j’ai voulu copié le résultat pour ne pas refaire et hop, le pb de mémoire



Ce matin, j'ai lancé et excel était à environ 280Mo, cela augmente petit à petit jusqu'au message, je valide pour continuer et d'un coup, excel repasse vers les 80Mo mais ensuite se ferme

Il y a bien un truc par rapport au nombre de fichier qui fait que excel prend trop de ressource ?
 

Pièces jointes

Dernière édition:
Bonjour,

Je viens de refaire un test et la mémoire prise par excel est bien fonction du nombre de fichier dans mon répertoire de recherche

Donc je pense que contrairement à ce que disais

Job65
Avec la solution que j'ai donnée les fichiers .xlsx ne sont jamais ouverts.


Je ne suis pas sûr mais comment les fermer puisque je ne passe pas par la fonction "open"
 
L'expression ExecuteExcel4Macro évalue des formules de liaison, elle n'ouvre pas les fichiers.

Je note que la variable col2 ne semble pas utilisée dans votre code.

Il est bien différent de celui que j'ai donné, je ne le teste pas.
 
L'expression ExecuteExcel4Macro évalue des formules de liaison, elle n'ouvre pas les fichiers.

Je note que la variable col2 ne semble pas utilisée dans votre code.

Il est bien différent de celui que j'ai donné, je ne le teste pas.

OK, effectivement, je pensais en avoir besoin du col2 mais non, mais bon, ce n'est pas ça qui bloque

Le fait est que plus je scrute de fichier, plus le risque de plantage est grand

Je peux peut-être faire une boucle en plus avec le nombre de fichiers scrutés puis un arrêt mais comment vider cette mémoire ?
=> enregistrer le fichier excel via la macro ?



Oui, cela est différent car il répond au besoin (les extractions sont ok sur peu de fichiers)
 
Bonjour,
Bien que ton code n'ouvre pas a proprement parler les 6500 xlsx, ExecuteExcel4Macro laisse des traces dans le cache d'excel.

Premier problème ton application ne laisse pas de répit a Excel pour ses traitements personnel tel que le doevent permettrait.

Je croyais t'en avoir informé, désolée si je ne l'ai pas fait.

VB:
    ' ---- Nettoyage de cache plus fort toutes les 500 itérations ----
        If (compte Mod 500) = 0 Then
            Application.CalculateFullRebuild
            DoEvents
        End If

    Wend
 
Dernière édition:
Deux remarques sur votre code :

1) n'utilisez pas On Error Resume Next, il ne doit pas y avoir d'erreur

2) Vous ne tenez pas compte de ce que j'ai dit au post #15.

Donc utilisez ce code :
VB:
Option Explicit
Const Feuil1$ = "DOVE"
Const Feuil2$ = "Communication"
Const col1% = 1 'colonne A
Const col2% = 6 'colonne F
Const crit1$ = "Véhicule :"
Const crit2$ = "Vin :"
Const crit3$ = "Battery Identification Number :"
Const crit4$ = "<- 62 F0 29*"
Dim fichier$, lig&, trouve&

Sub Recherche()
Dim t, chemin$, form$, compte
'On Error Resume Next
t = Timer
chemin = ThisWorkbook.Path & "\REPERTOIRE_FICHIERS" & "\"
fichier = Dir(chemin & "*.xlsx") '1er fichier du dossier
lig = 3
Application.ScreenUpdating = True
Rows(lig & ":" & Rows.Count).ClearContents 'RAZ
While fichier <> ""
    compte = compte + 1
    'Application.StatusBar = compte & " " & fichier 'prend beaucoup de temps

    form = "'" & chemin & "[" & fichier & "]" & Feuil1 & "'!"
    Formule form, col1, crit1, lig
    Formule form, col1, crit2, lig
    Formule form, col1, crit3, lig

    form = "'" & chemin & "[" & fichier & "]" & Feuil2 & "'!"
    Formule form, col1, crit4, lig

    If trouve = 1 Then lig = lig + 1

    fichier = Dir 'fichier suivant
    trouve = 0
Wend
MsgBox Timer - t
End Sub

Sub Formule(form$, col%, crit$, lig&)
Dim f$, v
'On Error Resume Next
f = "MATCH(""" & crit & """," & form & "R1C" & col & ":R10000C" & col & ",0)"
v = ExecuteExcel4Macro(f)
If IsNumeric(v) Then
    trouve = 1
    Cells(lig, 1) = fichier 'retourne le nom du fichier
    If crit = crit1 Then Cells(lig, 2) = ExecuteExcel4Macro(form & "R" & v & "C" & col + 1) 'retourne la valeur du Véhicule
    If crit = crit2 Then Cells(lig, 3) = ExecuteExcel4Macro(form & "R" & v & "C" & col + 1) 'retourne la valeur du Vin
    If crit = crit3 Then Cells(lig, 4) = ExecuteExcel4Macro(form & "R" & v & "C" & col + 1) 'retourne la valeur du BIN

    If crit = crit4 Then Cells(lig, 5) = ExecuteExcel4Macro(form & "R" & v & "C" & col) 'retourne la valeur de la trame 62 F0 29
End If
End Sub
 
Deux remarques sur votre code :

1) n'utilisez pas On Error Resume Next, il ne doit pas y avoir d'erreur

2) Vous ne tenez pas compte de ce que j'ai dit au post #15.

Pour le 1) => je ne sais pas pourquoi mais certains fichiers ne s'ouvrent pas via la macro donc une erreur survient c'est pour contourner ça que j'ai mis ce On error dans la 1° partie
Dans la 2° partie, je ne sais plus trop comme ça

Pour le 2) => je n'avais pas vu la différence ;-)

Je vais modifier et voir ce que ça donne

Merci à tous et désolé que certains ont mal pris mes écris mais je cherchais juste une solution fiable car je ne suis pas un expert
 
ça donne ça


Option Explicit
Const Feuil1$ = "DOVE"
Const Feuil2$ = "Communication"
Const col1% = 1 'colonne A
Const col2% = 6 'colonne F
Const crit1$ = "Véhicule :"
Const crit2$ = "Vin :"
Const crit3$ = "Battery Identification Number :"
Const crit4$ = "<- 62 F0 29*"
Dim fichier$, lig&, trouve&

Sub Recherche()
Dim t, chemin$, form$, compte

t = Timer
chemin = "D:\DOVEs\Année_2025\Test" & "\"
fichier = Dir(chemin & "*.xlsx") '1er fichier du dossier
lig = 3
Application.ScreenUpdating = True
Rows(lig & ":" & Rows.Count).ClearContents 'RAZ

While fichier <> ""
compte = compte + 1
Application.StatusBar = compte & " " & fichier

form = "'" & chemin & "[" & fichier & "]" & Feuil1 & "'!"
Formule form, col1, crit1, lig
Formule form, col1, crit2, lig
Formule form, col1, crit3, lig

form = "'" & chemin & "[" & fichier & "]" & Feuil2 & "'!"
Formule form, col1, crit4, lig

If trouve = 1 Then lig = lig + 1

fichier = Dir 'fichier suivant
trouve = 0

' ---- Nettoyage de cache plus fort toutes les 500 itérations ----
If (compte Mod 500) = 0 Then
Application.CalculateFullRebuild
DoEvents
End If

Wend

MsgBox Timer - t
End Sub

Sub Formule(form$, col%, crit$, lig&)
Dim f$, v

f = "MATCH(""" & crit & """," & form & "R1C" & col & ":R5000C" & col & ",0)"
v = ExecuteExcel4Macro(f)

If IsNumeric(v) Then
trouve = 1
Cells(lig, 1) = fichier
If crit = crit1 Then Cells(lig, 2) = ExecuteExcel4Macro(form & "R" & v & "C" & col + 1)
If crit = crit2 Then Cells(lig, 3) = ExecuteExcel4Macro(form & "R" & v & "C" & col + 1)
If crit = crit3 Then Cells(lig, 4) = ExecuteExcel4Macro(form & "R" & v & "C" & col + 1)

If crit = crit4 Then Cells(lig, 5) = ExecuteExcel4Macro(form & "R" & v & "C" & col)
End If

End Sub
 
Dernière édition:
Bonjour,
Tu as une amélioration ?

Bonjour,

Non, toujours pareil



Dans la vitesse de recherche, on dirait que oui un peu mais pas dans le fait que ça plante

J'ai lancé une recherche sur 21000 fichiers hier soir et ce matin, excel plus ouvert MDR

On voit que excel redonne la main au système car je remarque une pose dans le chiffre de la quantité de mémoire prise mais ça ne bouge et ça repart à la hausse une le DoEvents passé sûrement



Je relance ce matin et une fois le message d'erreur



L'indexeur de recherche a bien chutté lui



Je crois que je vais faire autrement et partir sur ton principe => rechercher dans les fichiers, mon dernier critère (crit4$ = "<- 62 F0 29*") comme ça, j'aurai une liste de fichier moins grande et dans ceux-là, rechercher les autres critères pour faire le tableau
==> A tester mais comment procéder ?
1/ Faire une liste dans excel des fichiers contenants le critère souhaité et à partir de cette liste, faire la recherche pour compléter le tableau excel

2/ Mettre dans un répertoire temporaire les fichiers (en les copiant) qui ont le critère souhaité et ensuite faire la recherche => à la fin de la recherche, on supprime ce répertoire pour ne pas blinder le disque
3/ ?

Merci
 
Dernière édition:
Bonjour,
Code:
Option Explicit
Const Feuil1$ = "DOVE"
Const Feuil2$ = "Communication"
Const col1% = 1 'colonne A
Const col2% = 6 'colonne F
Const crit1$ = "Véhicule :"
Const crit2$ = "Vin :"
Const crit3$ = "Battery Identification Number :"
Const crit4$ = "<- 62 F0 29*"
Dim fichier$, lig&, trouve&

Sub Recherche()
    Dim t, chemin$, form$, compte&
    Dim wb As Workbook, ws As Workbook
 
    t = Timer
    chemin = "D:\DOVEs\Année_2025\Test" & "\"
    fichier = Dir(chemin & "*.xlsx")
    lig = 3
    compte = 0
 
    Set ws = ThisWorkbook
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    Application.DisplayAlerts = False
 
    Rows(lig & ":" & Rows.Count).ClearContents
 
    While fichier <> ""
        compte = compte + 1
        Application.StatusBar = compte & " " & fichier
    
        ' *** CHANGEMENT CLÉ : Ouvrir et fermer le fichier ***
        On Error Resume Next
        Set wb = Workbooks.Open(chemin & fichier, UpdateLinks:=False, ReadOnly:=True, Notify:=False)
    
        If Not wb Is Nothing Then
            trouve = 0
        
            ' Lecture directe au lieu de ExecuteExcel4Macro
            LectureDirecte wb, Feuil1, col1, crit1, lig
            LectureDirecte wb, Feuil1, col1, crit2, lig
            LectureDirecte wb, Feuil1, col1, crit3, lig
            LectureDirecte wb, Feuil2, col1, crit4, lig
        
            If trouve = 1 Then lig = lig + 1
        
            ' FERMER IMMÉDIATEMENT
            wb.Close SaveChanges:=False
            Set wb = Nothing
        End If
        On Error GoTo 0
    
        fichier = Dir
        trouve = 0
    
        ' Nettoyage mémoire plus fréquent
        If (compte Mod 100) = 0 Then
            Application.StatusBar = compte & " fichiers - Nettoyage mémoire..."
            ws.Save ' Sauvegarde intermédiaire
            DoEvents
        End If
    
        ' Nettoyage agressif tous les 500 fichiers
        If (compte Mod 500) = 0 Then
            CollectGarbage
        End If
    Wend
 
    ' Restauration
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.DisplayAlerts = True
    Application.StatusBar = False
 
    MsgBox "Terminé : " & compte & " fichiers en " & Format(Timer - t, "0.00") & " secondes"
End Sub

Sub LectureDirecte(wb As Workbook, nomFeuil$, col%, crit$, lig&)
    Dim ws As Worksheet
    Dim plage As Range, cell As Range
    Dim ligTrouvee As Long
 
    On Error Resume Next
    Set ws = wb.Worksheets(nomFeuil)
    On Error GoTo 0
 
    If ws Is Nothing Then Exit Sub
 
    ' Recherche dans la colonne spécifiée
    Set plage = ws.Range(ws.Cells(1, col), ws.Cells(5000, col))
    Set cell = plage.Find(What:=crit, LookIn:=xlValues, LookAt:=xlWhole)
 
    If Not cell Is Nothing Then
        trouve = 1
        ligTrouvee = cell.Row
    
        Cells(lig, 1) = fichier
    
        Select Case crit
            Case crit1, crit2, crit3
                Cells(lig, IIf(crit = crit1, 2, IIf(crit = crit2, 3, 4))) = ws.Cells(ligTrouvee, col + 1).Value
            Case crit4
                Cells(lig, 5) = ws.Cells(ligTrouvee, col).Value
        End Select
    End If
 
    Set ws = Nothing
    Set plage = Nothing
    Set cell = Nothing
End Sub

Sub CollectGarbage()
    ' Forcer la libération mémoire
    Dim i As Long
    For i = 1 To 3
        DoEvents
        Application.Calculate
    Next i
End Sub

Adodb
Code:
Option Explicit

Sub RechercheADODB()
    Dim t As Double, chemin$, fichier$, compte&
    Dim conn As Object, rs As Object
    Dim wsResult As Worksheet
    Dim lig As Long
    Dim connString$, sql$
    Dim v1, v2, v3, v4
 
    t = Timer
    chemin = "D:\DOVEs\Année_2025\Test\"
 
    Set wsResult = ThisWorkbook.ActiveSheet
    lig = 3
 
    ' RAZ
    wsResult.Rows(lig & ":" & wsResult.Rows.Count).ClearContents
 
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
 
    fichier = Dir(chemin & "*.xlsx")
 
    While fichier <> ""
        compte = compte + 1
        Application.StatusBar = compte & " " & fichier
     
        On Error Resume Next
     
        ' Connexion ADODB
        Set conn = CreateObject("ADODB.Connection")
     
 
            connString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                        "Data Source=" & chemin & fichier & ";" & _
                        "Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1;ReadOnly=True"";"
      
     
        conn.Open connString
     
        If Err.Number = 0 Then
            v1 = Empty: v2 = Empty: v3 = Empty: v4 = Empty
         
            ' Recherche dans feuille DOVE
            v1 = ChercherValeur(conn, "DOVE", "Véhicule :", 1, 2)
            v2 = ChercherValeur(conn, "DOVE", "Vin :", 1, 2)
            v3 = ChercherValeur(conn, "DOVE", "Battery Identification Number :", 1, 2)
         
            ' Recherche dans feuille Communication
            v4 = ChercherValeur(conn, "Communication", "<- 62 F0 29*", 1, 1)
         
            ' Écrire si au moins une valeur trouvée
            If Not IsEmpty(v1) Or Not IsEmpty(v2) Or Not IsEmpty(v3) Or Not IsEmpty(v4) Then
                wsResult.Cells(lig, 1) = fichier
                If Not IsEmpty(v1) Then wsResult.Cells(lig, 2) = v1
                If Not IsEmpty(v2) Then wsResult.Cells(lig, 3) = v2
                If Not IsEmpty(v3) Then wsResult.Cells(lig, 4) = v3
                If Not IsEmpty(v4) Then wsResult.Cells(lig, 5) = v4
                lig = lig + 1
            End If
         
            conn.Close
        End If
     
        On Error GoTo 0
        Set conn = Nothing
        Set rs = Nothing
     
        fichier = Dir
     
        ' Sauvegarde intermédiaire
        If (compte Mod 500) = 0 Then
            Application.StatusBar = compte & " fichiers - Sauvegarde..."
            wsResult.Parent.Save
            DoEvents
        End If
    Wend
 
    ' Restauration
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.StatusBar = False
 
    MsgBox "Terminé : " & compte & " fichiers en " & Format(Timer - t, "0.00") & " secondes", vbInformation
End Sub

Function ChercherValeur(conn As Object, nomFeuille$, critere$, colCherche As Integer, colResultat As Integer) As Variant
    Dim rs As Object
    Dim sql$, i As Integer
    Dim valeur As Variant
 
    On Error Resume Next
 
    valeur = Empty
 
    ' Construction SQL - ADODB utilise F1, F2, F3... pour les colonnes
    sql = "SELECT * FROM [" & nomFeuille & "$A1:Z5000] " & _
          "WHERE F" & colCherche & " = '" & Replace(critere, "'", "''") & "'"
 
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open sql, conn, 3, 1 ' adOpenStatic, adLockReadOnly
 
    If Not rs.EOF Then
        ' Récupérer la valeur de la colonne résultat
        valeur = rs.Fields("F" & colResultat).Value
    End If
 
    rs.Close
    Set rs = Nothing
 
    On Error GoTo 0
 
    ChercherValeur = valeur
End Function
Adodb et indexation windows
Code:
Option Explicit

Sub RechercheAvecIndexWindows()
    Dim t As Double, chemin$, compte&
    Dim wsResult As Worksheet
    Dim lig As Long
    Dim collFichiers As Collection
    Dim fichier As Variant
    Dim conn As Object
    Dim connString$
    Dim v1, v2, v3, v4
    
    t = Timer
    chemin = "D:\DOVEs\Année_2025\Test\"
    
    Set wsResult = ThisWorkbook.ActiveSheet
    lig = 3
    
    ' RAZ
    wsResult.Rows(lig & ":" & wsResult.Rows.Count).ClearContents
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    Application.StatusBar = "Recherche via Windows Search Index..."
    
    ' *** PRÉSÉLECTION VIA WINDOWS SEARCH ***
    Set collFichiers = RechercherFichiersIndexes(chemin, Array("Véhicule", "Vin", "Battery", "62 F0 29"))
    
    If collFichiers.Count = 0 Then
        MsgBox "Aucun fichier trouvé via Windows Search Index." & vbCrLf & _
               "Vérifiez que l'indexation est activée pour ce dossier.", vbExclamation
        GoTo Cleanup
    End If
    
    Application.StatusBar = collFichiers.Count & " fichiers présélectionnés - Traitement ADODB..."
    
    ' *** TRAITEMENT ADODB DES FICHIERS PRÉSÉLECTIONNÉS ***
    For Each fichier In collFichiers
        compte = compte + 1
        Application.StatusBar = compte & "/" & collFichiers.Count & " - " & Dir(fichier)
        
        On Error Resume Next
        
        Set conn = CreateObject("ADODB.Connection")
        
        connString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                    "Data Source=" & fichier & ";" & _
                    "Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1;ReadOnly=True"";"
        
        conn.Open connString
        
        If Err.Number = 0 Then
            v1 = Empty: v2 = Empty: v3 = Empty: v4 = Empty
            
            ' Recherche dans feuille DOVE
            v1 = ChercherValeur(conn, "DOVE", "Véhicule :", 1, 2)
            v2 = ChercherValeur(conn, "DOVE", "Vin :", 1, 2)
            v3 = ChercherValeur(conn, "DOVE", "Battery Identification Number :", 1, 2)
            
            ' Recherche dans feuille Communication
            v4 = ChercherValeur(conn, "Communication", "<- 62 F0 29*", 1, 1)
            
            ' Écrire si au moins une valeur trouvée
            If Not IsEmpty(v1) Or Not IsEmpty(v2) Or Not IsEmpty(v3) Or Not IsEmpty(v4) Then
                wsResult.Cells(lig, 1) = Dir(fichier)
                If Not IsEmpty(v1) Then wsResult.Cells(lig, 2) = v1
                If Not IsEmpty(v2) Then wsResult.Cells(lig, 3) = v2
                If Not IsEmpty(v3) Then wsResult.Cells(lig, 4) = v3
                If Not IsEmpty(v4) Then wsResult.Cells(lig, 5) = v4
                lig = lig + 1
            End If
            
            conn.Close
        End If
        
        On Error GoTo 0
        Set conn = Nothing
        
        ' Sauvegarde intermédiaire
        If (compte Mod 500) = 0 Then
            wsResult.Parent.Save
            DoEvents
        End If
    Next fichier
    
Cleanup:
    ' Restauration
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.StatusBar = False
    
    MsgBox "Terminé : " & compte & " fichiers traités en " & Format(Timer - t, "0.00") & " secondes", vbInformation
End Sub

Function RechercherFichiersIndexes(chemin$, motsCles As Variant) As Collection
    Dim conn As Object
    Dim rs As Object
    Dim sql$
    Dim collResultat As New Collection
    Dim whereClauses As String
    Dim i As Integer
    Dim cheminNormalise$
    
    ' Normaliser le chemin pour Windows Search
    cheminNormalise = Replace(chemin, "\", "/")
    If Right(cheminNormalise, 1) = "/" Then
        cheminNormalise = Left(cheminNormalise, Len(cheminNormalise) - 1)
    End If
    
    ' Construction de la clause WHERE avec plusieurs mots-clés (OR)
    whereClauses = ""
    For i = LBound(motsCles) To UBound(motsCles)
        If whereClauses <> "" Then whereClauses = whereClauses & " OR "
        whereClauses = whereClauses & "CONTAINS(*, '""" & motsCles(i) & """')"
    Next i
    
    ' Requête SQL pour Windows Search
    sql = "SELECT System.ItemPathDisplay " & _
          "FROM SystemIndex " & _
          "WHERE SCOPE='file:///" & cheminNormalise & "' " & _
          "AND System.FileExtension = '.xlsx' " & _
          "AND (" & whereClauses & ")"
    
    On Error Resume Next
    
    ' Connexion à Windows Search
    Set conn = CreateObject("ADODB.Connection")
    conn.ConnectionString = "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
    conn.Open
    
    If Err.Number <> 0 Then
        MsgBox "Erreur connexion Windows Search : " & Err.Description & vbCrLf & _
               "Vérifiez que l'indexation Windows est activée.", vbCritical
        On Error GoTo 0
        Set RechercherFichiersIndexes = collResultat
        Exit Function
    End If
    
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open sql, conn, 3, 1 ' adOpenStatic, adLockReadOnly
    
    If Err.Number <> 0 Then
        MsgBox "Erreur requête Windows Search : " & Err.Description, vbCritical
        On Error GoTo 0
        conn.Close
        Set RechercherFichiersIndexes = collResultat
        Exit Function
    End If
    
    On Error GoTo 0
    
    ' Récupération des chemins
    While Not rs.EOF
        collResultat.Add rs.Fields("System.ItemPathDisplay").Value
        rs.MoveNext
    Wend
    
    rs.Close
    conn.Close
    
    Set rs = Nothing
    Set conn = Nothing
    Set RechercherFichiersIndexes = collResultat
End Function

Function ChercherValeur(conn As Object, nomFeuille$, critere$, colCherche As Integer, colResultat As Integer) As Variant
    Dim rs As Object
    Dim sql$
    Dim valeur As Variant
    
    On Error Resume Next
    
    valeur = Empty
    
    ' Construction SQL
    If critere Like "*\**" Then ' Si contient wildcard
        sql = "SELECT * FROM [" & nomFeuille & "$A1:Z5000] " & _
              "WHERE F" & colCherche & " LIKE '" & Replace(critere, "*", "%") & "'"
    Else
        sql = "SELECT * FROM [" & nomFeuille & "$A1:Z5000] " & _
              "WHERE F" & colCherche & " = '" & Replace(critere, "'", "''") & "'"
    End If
    
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open sql, conn, 3, 1
    
    If Not rs.EOF Then
        valeur = rs.Fields("F" & colResultat).Value
    End If
    
    rs.Close
    Set rs = Nothing
    
    On Error GoTo 0
    
    ChercherValeur = valeur
End Function

' *** FONCTION UTILITAIRE : Vérifier l'indexation d'un dossier ***
Sub VerifierIndexation()
    Dim chemin$
    chemin = "D:\DOVEs\Année_2025\Test\"
    
    Dim conn As Object, rs As Object, sql$
    Dim compte As Long
    
    sql = "SELECT System.ItemPathDisplay FROM SystemIndex " & _
          "WHERE SCOPE='file:///" & Replace(chemin, "\", "/") & "' " & _
          "AND System.FileExtension = '.xlsx'"
    
    On Error Resume Next
    Set conn = CreateObject("ADODB.Connection")
    conn.ConnectionString = "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
    conn.Open
    
    If Err.Number = 0 Then
        Set rs = conn.Execute(sql)
        While Not rs.EOF
            compte = compte + 1
            rs.MoveNext
        Wend
        MsgBox compte & " fichiers Excel indexés dans : " & chemin, vbInformation
        rs.Close
        conn.Close
    Else
        MsgBox "Windows Search non disponible : " & Err.Description, vbCritical
    End If
End Sub
 
Dernière édition:
Bonjour le forum,

@dysorthographie l'expression Set wb = Workbooks.Open(chemin & fichier, UpdateLinks:=False, ReadOnly:=True, Notify:=False)
ouvre physiquement le fichier.

Chez moi l'ouverture et la fermeture du fichier du post #34 prennent 0,6 seconde.

Donc l'ouverture et la fermeture de 6500 fichiers prendront 3900 secondes, c'est rédhibitoire.

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…