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) ? :
1647274113301.png

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
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
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 :D

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
:)
 

Discussions similaires

Statistiques des forums

Discussions
312 195
Messages
2 086 075
Membres
103 111
dernier inscrit
Eric68350