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

Microsoft 365 Rechercher dans plusieurs fichiers

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à tous

En voici une bonne pour ce début de semaine lol

Evidemment, je ne sais pas coder pour résoudre mon besoin !
Alors, je sollicite à nouveau nos chers ténors :

Voici le contexte de mon besoin :
NOUS TRAVAILLONS AVEC 3 FICHIERS ouverts généralement en même temps.

Les Professionnels que nous appelons sont difficiles à joindre.
Nous avons souvent des répondeurs et nous laissons un message.

Quand un Pro nous rappelle, NOUS DE DECROCHONS PAS.
Avant de rappeler nous vérifions à partir de quel fichier on a appelé pour savoir où nous en sommes avec le Pro.

Pour le rappeler il faut faire vite avant que le Pro ne soit à nouveau occupé.
Pour cela, il nous faut trouver très rapidement à partir de quel fichier nous avons appelé.

Nos 3 fichiers sont identiques et nous commençons toujours nos recherches par la feuille Appels,
Le besoin
Partant du principe que nos 3 fichiers sont généralement ouverts en même temps (mais ce n'est pas toujours le cas) :
Est-il possible si la recherche ne trouve rien dans la feuille active (Appels) du fichier actif que la recherche :
si pas trouvé que la recherche propose de chercher dans le fichier suivant (ouvert) ? :

Les noms des fichiers sont toujours les mêmes sauf la date qui change.
isiTel_lionel_fichier1 2022 03 14
isiTel_lionel_fichier2 2022 03 14
isiTel_lionel_fichier3 2022 03 14

Auriez-vous le bon code ?

Un grand merci par avance
Je continue à tâtonner .. et je joins un petit fichier test qui contient le code de la recherche.
Amicalement,
lionel
 

Pièces jointes

  • Recherche_classeurs.xlsm
    33.5 KB · Affichages: 23
Dernière édition:
Solution
Bonjour Lionel, le forum,

Je disais que ce fil était sans fin !!!

Pour traiter plusieurs feuilles il suffit d'ajouter une boucle sur les noms des feuilles :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [B1]) Is Nothing Then Exit Sub
Dim cible$, chemin$, fichier, feuille, plage As Range, lig&, i%, col As Range, x$, n&
cible = Right([B1], 9) 'à adapter
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = Dir(chemin & "isiTel*.xlsb") '1er fichier du dossier
feuille = Array("Appels", "Sextant", "Dr House") 'liste des feuilles où l'on recherche
Set plage = [D1:G10000] 'référence de la plage de recherche à adapter
lig = 2
Application.ScreenUpdating = False
Application.EnableEvents = False
While fichier <> ""...

juvaxe

XLDnaute Occasionnel
Bonjour

J'arrive sans doute un peu tard dans cette discussion.

La complexité du problème est due à la répartition des données dans plusieurs classeurs.

Non pas de faire "une usine à gaz" (désolé du jeu de mots !) je pense qu'il était préférable et plus simple d'héberger les données dans un même endroit , par exemple SQL Server, sur un poste de travail défini comme serveur.

Sur les autres postes de travail se servir de Excel/vba (pas de problème) pour accéder à la base de données et faire le travail quotidien.

Installer une base de données et l'utiliser n'est pas plus difficile que faire du VBA. Il y a de nombreux exemples sur le Net et en particulier dans ce forum.

Bien cordialement
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bjr Juvaxe
Merci pour vos suggestions mais dans notre procès la méthode utilisée est celle qui convient à notre façon de travailler et le code de Job75 est génialement efficace
 

job75

XLDnaute Barbatruc
Bonjout Lionel, le fil,

Bon maintenant c'est moi qui vais faire durer le plaisir

Avec cette solution qui recherche toutes les occurrences dans chaque colonne :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [B1]) Is Nothing Then Exit Sub
Dim cible$, chemin$, fichier, feuille$, plage As Range, lig&, col As Range, x$, n&
cible = Right([B1], 9) 'à adapter
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = Dir(chemin & "isiTel*.xlsb") '1er fichier du dossier
feuille = "Appels"
Set plage = [D1:G10000] 'référence de la plage de recherche à adapter
lig = 2
Application.ScreenUpdating = False
Application.EnableEvents = False
While fichier <> ""
    x = chemin & "[" & fichier & "]" & feuille & "'!"
    For Each col In plage.Columns
        n = 0
        Do 'boucle pour rechercher toutes les occurrences
            Cells(lig, 6).FormulaArray = "=MATCH(""*" & cible & """,""""&'" & x & col.Offset(n).Address & ",0)" 'formule matricielle
            If IsError(Cells(lig, 6)) Then Exit Do
            n = n + Cells(lig, 6)
            Cells(lig, 4) = fichier
            Cells(lig, 5) = feuille
            Cells(lig, 7) = "=INDEX('" & x & col.Address & "," & n & ")"
            Cells(lig, 7) = Cells(lig, 7).Value 'supprime la formule
            Cells(lig, 7).NumberFormat = "General" 'format Standard
            Cells(lig, 6) = Split(col.Address, "$")(1) & n 'adresse qui écrase la formule
            lig = lig + 1
        Loop
    Next col
    fichier = Dir 'fichier suivant
Wend
Range("D" & lig & ":G" & Rows.Count).ClearContents 'RAZ
Application.EnableEvents = True
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim chemin$, lig&, wb As Workbook
chemin = ThisWorkbook.Path & "\" 'à adapter
lig = Target.Row
On Error Resume Next
Set wb = Workbooks(CStr(Cells(lig, 4)))
If wb Is Nothing Then Set wb = Workbooks.Open(chemin & Cells(lig, 4))
Application.EnableEvents = False
With wb.Sheets(CStr(Cells(lig, 5))).Range(Cells(lig, 6))
    Application.Goto .Cells(1, 2 - .Column), True 'cadrage
    .RowHeight = 55
End With
Application.EnableEvents = True
If wb Is Nothing And Cells(lig, 4) <> "" And lig > 1 Then Cancel = True: MsgBox "Fichier '" & Cells(lig, 4) & "' introuvable !", 48
End Sub
Bien sûr toujours sans ouvrir les fichiers fermés.

Tu n'en as peut-être pas besoin mais c'est au cas où...

A+
 

Pièces jointes

  • Recherche poussée(1).xlsm
    21 KB · Affichages: 14
  • isiTel_lionel_ExpRealty 2022 03 22.xlsb
    9.4 KB · Affichages: 10
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
"C'est forcément moins rapide s'il y a plusieurs occurrences dans chaque colonne."
LOL c'est pas visible à l'oeil ... ça me semblait plus rapide.
J'ai bien vu qu'il prenait toutes les occurrences et c'est super ça

"Pour le double-clic utilises-tu bien la macro du post #125 ?"
Oui, j'ai pris le fichier tel quel et chez moi ça ne fonctionne que sur quelques cellules et pas toujours.
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonsoir Gérard,
En modifiant le code comme ceci :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim chemin$, lig&, wb As Workbook
chemin = ThisWorkbook.Path & "\" 'à adapter
lig = Target.Row
On Error Resume Next
Set wb = Workbooks(CStr(Cells(lig, 4)))
'If wb Is Nothing Then EN NEUTRALISANT CETTE LIGNE
    Set wb = Workbooks.Open(chemin & Cells(lig, 4))
    'Application.EnableEvents = False
    With wb.Sheets(CStr(Cells(lig, 5))).Range(Cells(lig, 6))
        Application.Goto .Cells(1, 2 - .Column), True 'cadrage
        .RowHeight = 55
    End With
    Application.EnableEvents = True
'End If ET LE END IF
If wb Is Nothing And Cells(lig, 4) <> "" And lig > 1 Then Cancel = True: MsgBox "Fichier '" & Cells(lig, 4) & "' introuvable !", 48
End Sub
C'est fonctionnel en neutralisant : If wb Is Nothing Then
 

job75

XLDnaute Barbatruc
Bonjour Lionel, le forum,

Bon un détail, au post #125 je viens de déplacer :
VB:
x = chemin & "[" & fichier & "]" & feuille & "'!"
avant la boucle For Each col, c'est plus propre.

A+
 

Discussions similaires

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