Microsoft 365 Effectué une recherche dans plusieurs fichiers

largo41270

XLDnaute Nouveau
Bonjour a tous

J’ai besoin de votre aide

Je dois effectue une recherche dans plusieurs fichiers excel (environ 20 fichiers) comportant 15 colonnes.

Imaginons que dans tous les fichiers source que la colonne M soit les n° de palettes et en R les n° de pièce

Je voudrais pouvoir effectuer la recherche soit par une partie du n° de palette ou du n° de la pièce et Afficher la ligne complète du fichier dans le cadre résultat et si je clic sur le résultat ca ouvre le fichier

En bas de la feuille j’ai mis des modèles de N° de pièce on constate qu’il y a des parties identique

Pour éviter que ça ram de trop dans le fichier j’ai fait une liste des dossiers ou je dois chercher

Et cellule G4 j’indique dans quel dossier chercher

Je reste a votre disposition et vous remercie d’avance
 

Pièces jointes

  • Classeur2.xlsm
    15 KB · Affichages: 7

largo41270

XLDnaute Nouveau
bonjour wtf merci de ta réponse.

il y a minimun 20 fichiers par dossiers et environ 30 dossiers

j'ai trouvé un fichier qui pourrait faire le travail , je n'arrive pas a le modifier , je suis trop nul

le fichier liste tous les dossiers dans la colonne a ( pas besoins)
et affiche le résultat dans une box avec le chemin du dossier, moi je voudrais que la ligne complète s'affiche sur ma feuille et en cliquant sur cette ligne ca ouvre le fichier.

en Piece jointe fichier et dossiers j'ai mis le code d'origine (des que je modifies un truc ca bug pufffffff

merci d'avance
 

Pièces jointes

  • test recherche.zip
    35.5 KB · Affichages: 5

largo41270

XLDnaute Nouveau
bonjour a tous,

je ne connais rien en vba j'ai téléchargé plein de code concernent la recherche dans plusieurs fichiers impossible de les adaptés

je cherche un code simple

1 classeur principal avec un bouton pour lancer la recherche le mot situé en "B4" dans la colonne "F"sur tous les fichiers d'un dossier (chemin indiqué en "f4") et qu'il affiche a partir de la ligne 15 du fichier principal toutes les lignes des fichiers ou il a trouvé un resultat en colonne "F"

merci d'avance a tous
 

Staple1600

XLDnaute Barbatruc
Bonjour @largo41270, @WTF, le fil

Je plussoie à l'idée de @WTF
Donc avec PowerQuery
(en faisant Obtenir des données/A partir d'un fichier/A partir d'un dossier)
Ci-dessous les étapes récupérées dans PowerQuery (avec l'éditeur avancé)
PowerQuery:
let
// ici il faut changer le chemin du dossier avec celui qui est sur ton PC
    Source = Folder.Files("C:\Users\STAPLE\Downloads\test recherche"),
    #"Lignes filtrées" = Table.SelectRows(Source, each ([Extension] = ".xls")),
    #"Fichiers masqués filtrés1" = Table.SelectRows(#"Lignes filtrées", each [Attributes]?[Hidden]? <> true),
    #"Appeler une fonction personnalisée1" = Table.AddColumn(#"Fichiers masqués filtrés1", "Transformer le fichier", each #"Transformer le fichier"([Content])),
    #"Colonnes renommées1" = Table.RenameColumns(#"Appeler une fonction personnalisée1", {"Name", "Source.Name"}),
    #"Autres colonnes supprimées1" = Table.SelectColumns(#"Colonnes renommées1", {"Source.Name", "Transformer le fichier"}),
    #"Colonne de tables développée1" = Table.ExpandTableColumn(#"Autres colonnes supprimées1", "Transformer le fichier", Table.ColumnNames(#"Transformer le fichier"(#"Exemple de fichier"))),
    #"Type modifié" = Table.TransformColumnTypes(#"Colonne de tables développée1",{{"Source.Name", type text}, {"date de commande", type date}, {"date de livraison", type date}, {"numero de palette ", type text}, {"ref article", type text}, {"n° de serie ", type text}, {"Column6", type text}}),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Type modifié",{"Column6"})
in
    #"Colonnes supprimées"
Voila ce que j'obtiens (image1: les données brutes, image2: données filtrées)
importPQ.PNG
Ensuite j'ai ajouté une petite macro pour filtrer
(équivaut au filtre automatique -> Contient)
(*) Ici il y a deux filtres (un avec le bouton et l'autre manuel sur les dates de commande où je filtre que sur l'année 2022

PQ_Filter.PNG
Ci-dessous la macro associée au bouton
VB:
Private Sub CommandButton1_Click()
ActiveSheet.ListObjects("test_recherche").Range.AutoFilter _
Field:=4, Criteria1:="=*" & [F2] & "*", Operator:=xlAnd
End Sub
PS: On peut aussi faire les opérations de filtrage directement dans PowerQuery
 

job75

XLDnaute Barbatruc
Bonjour largo41270, JM,

Téléchargez le fichier .xlsm et dossiers zippés joints dans le même dossier (le bureau).

Exécutez cette macro affectée au bouton :
VB:
Sub Recherche()
Dim t, cible$, chemin$, fso As Object, ncol%, lig&, sf As Object, f As Object, nf%, wb As Workbook, plage As Range, i&, j%
t = Timer
cible = "*" & [B1].Text & "*"
chemin = ThisWorkbook.Path & "\"
Set fso = CreateObject("Scripting.FileSystemObject")
ncol = 5 'nombre de colonnes à étudier
Application.ScreenUpdating = False
With Sheets("Feuil1").[A3].CurrentRegion 'nom de la feuille à adapter
    .Offset(1).Delete xlUp 'RAZ
    lig = 2
    For Each sf In fso.Getfolder(chemin).Subfolders
    For Each f In sf.Files
        nf = nf + 1
        Set wb = Workbooks.Open(chemin & sf.Name & "\" & f.Name) 'ouverture du fichier
        Set plage = wb.Sheets(1).Range("B3").CurrentRegion.Resize(, ncol) 'adapter éventuellement
        For i = 2 To plage.Rows.Count
            For j = 1 To ncol
                If plage(i, j).Text Like cible Then
                    .Cells(lig, 1) = sf.Name
                    .Cells(lig, 2) = f.Name
                    .Cells(lig, 3).Resize(, ncol) = plage.Rows(i).Value
                    lig = lig + 1
                    Exit For
                End If
        Next j, i
        wb.Close False 'fermeture du fichier
    Next f, sf
    .Offset(, 1).EntireColumn.AutoFit 'ajustement largeurs
    With .Parent.UsedRange: End With 'actualise la barre de défilement verticale
End With
Application.ScreenUpdating = True
MsgBox nf & " fichuers étudiés et " & lig - 2 & " ligne" & IIf(lig > 3, "s", "") & " copiée" & IIf(lig > 3, "s", "") & " en " & Format(Timer - t, "0.00 \sec")
End Sub
On notera que pour la recherche j'utilise la propriété .Text des cellules, cela prend plus de temps.

A+
 

Pièces jointes

  • test recherche.zip
    41.1 KB · Affichages: 3

Cousinhub

XLDnaute Barbatruc
Il est clair que l'ouverture/fermeture de 600 fichiers prendra beaucoup de temps.

J'ai une question : PowerQuery peut-il rechercher dans la propriété .Text des cellules ?
Bonjour,
Hello Job (pas vu ta question)
Qu'entends-tu par "propriété"?
Si c'est une partie du texte, effectivement, Text.Contains permet une recherche de correspondance (avec sensibilité ou non à la casse)
Comme je n'avais pas suivi ce fil, je vais regarder de quoi il en retourne, la solution proposée par JM pourrait le faire, mais je pense (selon le nombre de lignes composant chaque fichier) qu'il faut tout traiter en interne, ne pas charger dans un onglet, par exemple, et restituer uniquement les correspondances (mais 600 fichiers, quoiqu'il arrive, ça va prendre du temps...)
Bonne journée
 

Cousinhub

XLDnaute Barbatruc
Bonjour Cousinhub,

Ma macro recherche le texte cible dans plage(i, j).Text

La propriété .Text renvoie le texte affiché dans la cellule, PQ peut-il la récupérer ?

Merci.
Re-,
Oui, on peut filtrer sur une partie du contenu, par l'instruction citée supra, et donc récupérer toutes (ou la seule, selon) les lignes comportant cette partie de texte dans une colonne quelconque.
Si j'ai bien compris ta question????
 

Cousinhub

XLDnaute Barbatruc
Re-,
Oui, il suffit de modifier le type en Texte, puis filtrer par "Commence par"
Exemple :
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    Type_Date = Table.TransformColumnTypes(Source,{{"Date", type date}}),
    Type_Text = Table.TransformColumnTypes(Type_Date,{{"Date", type text}}),
    Filtre = Table.SelectRows(Type_Text, each Text.StartsWith([Date], "11/02"))
in
    Filtre
Et le tableau :
1714382405956.png

Ici, j'ai filtré sur le 11/02
 

Cousinhub

XLDnaute Barbatruc
Re-,
En reprenant l'idée de Stapple
Dans cet exemple, je n'ai pas du tout "optimisé" le code, mais utilisé "pratiquement" uniquement les fonctionnalités du travail "à la souris"
En A2, le chemin du dossier (attention, d'après tes fichiers exemple, ils sont tous au format ".xls")
En A5, le sous-dossier de recherche - s'il n'est pas précisé, la recherche se fait sur tous les sous-dossiers
Pour mettre à jour, un clic sur le bouton "Actualiser tout" du ruban "Données"
Ici, la recherche ne se fait que sur les numéros de série, mais c'est juste pour un essai dans ton environnement
Si ça peut déjà convenir en l'état
 

Pièces jointes

  • recherche.xlsm
    24.7 KB · Affichages: 1

largo41270

XLDnaute Nouveau
Bonjour a tous et merci de votre aide.
excusé moi d'avoir tardé a répondre
merci Job75 pour ton travail
effectivement il y a beaucoup de fichiers , comme je c'est a l'avance dans quel dossier ce trouve le fichier
j'ai donc besoin d'informer dans une cellule le chemin du fichier pour limiter l'ouverture de tout les dossiers
et une fois la recherche effectué un lien hyper.. sur le nom du fichier pour l'ouvrir

merci cousinhub pour ton fichier
il fonctionne bien effectivement il faudrait ouvrir tout le type de fichier XLS*
lundi je joindre un fichier type du boulot

merci encore a vous tous
 

Discussions similaires

Réponses
6
Affichages
336

Statistiques des forums

Discussions
312 320
Messages
2 087 218
Membres
103 497
dernier inscrit
JP9231