Recherche occurence dans plusieurs fichiers excell

trumanberic

XLDnaute Nouveau
Bonjour à toutes et tous :)


Alors, je suis totalement newbie pour commencer , donc désolé d'avance si cette question vous semble idiote....
Je viens d'être promu à mon boulot et je n'avais, dans le poste que j'occupais auparavant, absolument pas la nécessité d'utiliser Excell comme je dois l'utiliser aujourd'hui.
Je souhaiterais savoir s'il est possible, à travers un batch, script ou autre, la possibilité de chercher dans plusieurs fichiers Excell une occurence particulière. Dans un seul fichier, pas de pbe, je lance CTRL + F mais je perds bcp de temps chaque jour à devoir chercher des séries de nombres (de 14 chiffres) dans plusieurs fichiers excell, à devoir ouvrir les un après les autres (et fermer !) tous ces fichiers lorsque je cherche une occurence.

Existe il une option moins chronophage pour m'aider ?
 

Roblochon

XLDnaute Occasionnel
Bonjour et bienvenue sur le forum,

C'est peut-être que la question n'est pas assez précise. Quelles données dans Quels fichiers pour quel traitement?
On ne peut rien faire si on n'en sait pas plus.
Vous pourriez peut-être faire deux classeurs exemples (anonymisés) et nous en dire un peu plus.
N'oubliez pas d'indiquer votre version excel de travail.

A vous relire
 

trumanberic

XLDnaute Nouveau
Bonjour,

Merci pour votre retour, je comprends, permettez moi de reformuler.

Disons que j'ai des employés qui "scannent" des documents et qui tiennent des inventaires sur Excel des documents qu'ils scannent et traitent. Imaginons que je doivent savoir quel employé "X" ou "Y" ait traité le document N° "37531005538351"

Existe t il un moyen d'automatiser une recherche de cet occurence dans les classeurs Excell sans avoir a tous les ouvrir et fermé un a par un ?
Lorsque je cherche qui a traité tel ou tel document cette manip' est assez chronophage sur trente ou quarante fichiers a ouvrir plus Ctrl +F puis fermeture du fichier etc ....
(Sur les exemples en pièces jointe il n'y qu'un seul onglet mais les fichiers que nous traitons en contiennent plusieurs)
Je ne peux vous dire quelle Version de Excell en revanche dslé, nous en avons plusieurs dans l'établissement.
 

Fichiers joints

Roblochon

XLDnaute Occasionnel
Bonjour,

J'ai bien compris. Seulement vous ne nous dites toujours pas quelle information renvoyer et où lorsqu'une occurrence a été trouvée.
Egalement, est-ce que les occurences à trouver sont toujours en colonne B des feuilles des classeurs X ou Y?
Sur quoi nous basons-nous pour renvoyer le nom de celui qui a traité le dossier? Le nom du classeur, une cellule dans le classeur, laquelle?
Faut-il renvoyer également l'endroit où l'occurrence à été trouvée et sous quelle forme? ex: [X.xlsx]Janvier!B13
Faut-il s'arrêter à la première occurrence trouvée, dans la feuille? dans le classeur?
S'il l'occurence est trouvée plusieurs fois dans la même feuille et/ou le même classeur, que fait-on de ces informations?

Bref on peut trouver ce que vous voulez mais on en fait quoi ? Faites nous un exemple de résultats recherchés. Si il y a plusieurs cas de figure, illustrez les.

A vous relire
 

job75

XLDnaute Barbatruc
Bonjour trumanberic, Roblochon,

Voyez le fichier joint et cette macro :
VB:
Sub Recherche()
Dim chemin$, fichier$, d As Object, w As Worksheet, tablo, e, a, b(), i&, j%
chemin = ThisWorkbook.Path & "\"
fichier = Dir(chemin & "*.xls*") '1er fichier du dossier
Set d = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si un fichier est déjà ouvert
While fichier <> ""
    If fichier <> ThisWorkbook.Name Then
        With Workbooks.Open(chemin & fichier)
            For Each w In .Worksheets
                tablo = w.UsedRange
                If Not IsArray(tablo) Then tablo = w.UsedRange.Resize(2)
                For Each e In tablo
                    If e Like "##############" Then d(e & Chr(1) & .Name) = ""
            Next e, w
            .Close
        End With
    End If
    fichier = Dir 'fichier suivant
Wend
'---restitution et mise en forme---
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 'si la feuille est filtrée
Range("A2:B" & Rows.Count).ClearContents 'RAZ
If d.Count = 0 Then Exit Sub
a = d.keys
ReDim b(UBound(a), 1) 'base 0
For i = 0 To UBound(a)
    j = InStr(a(i), Chr(1))
    b(i, 0) = Left(a(i), j - 1)
    b(i, 1) = Mid(a(i), j + 1)
Next
[A:A].NumberFormat = String(14, "0")
[A2].Resize(i, 2) = b
[A2].Resize(i, 2).Sort [A2], xlAscending, [B2], , xlAscending, Header:=xlNo 'tri sur 2 colonnes
Columns("A:B").AutoFit 'ajustement largeur
With ActiveSheet.UsedRange: End With 'actualise la barre de défilement verticale
End Sub
Bien sûr l'ouverture et la fermeture de 30 ou 40 fichiers prendra du temps.

A+
 

Fichiers joints

Roblochon

XLDnaute Occasionnel
Bonsoir,

Mettre les 3 fichiers dans le même dossier. Ouvrir le fichier 'Recherche.xlsm' et cliquer sur le bouton 'Rechercher'

Bonne soirée
 

Fichiers joints

trumanberic

XLDnaute Nouveau
Bonjour, merci pour votre attention et votre retour.

vous ne nous dites toujours pas quelle information renvoyer et où lorsqu'une occurrence a été trouvée.
Rien, l'analyse peut s'arrêter. Pas de nécessiter à créer un rapport ou un autre fichier. J'ai juste besoin de savoir qui a scanné tel ou tel document.

Egalement, est-ce que les occurences à trouver sont toujours en colonne B des feuilles des classeurs X ou Y?
Oui

Sur quoi nous basons-nous pour renvoyer le nom de celui qui a traité le dossier? Le nom du classeur, une cellule dans le classeur, laquelle?
Faut-il renvoyer également l'endroit où l'occurrence à été trouvée et sous quelle forme? ex: [X.xlsx]Janvier!B13
Le nom du classeur suffit, il porte le nom de la personne "Mr X", "Mde Y".
EDIT: a la limite si c'est possible, connaitre la date de la création du "job" , savoir quelle jour à a été traité le document en question. Cette se trouve, et se trouvera toujours, dans la colonne A dans le format "DATE: JJ/MM/AAAA" et les infos en colonne E " Commentaires"


Faut-il s'arrêter à la première occurrence trouvée, dans la feuille? dans le classeur?
S'il l'occurence est trouvée plusieurs fois dans la même feuille et/ou le même classeur, que fait-on de ces informations?
Oui l'analyse peut/doit s'arrêter au premier résultat trouvé, l'occurence ne peut se trouver dans deux fichiers, ni être traitée deux fois par la même personne, aucune raison donc de la trouver deux fois, ni dans un seul fichier ni dans deux.
 
Dernière édition:

job75

XLDnaute Barbatruc
Puisque les occurrences sont toujours en colonne B ma macro sera plus rapide avec :
VB:
                tablo = w.UsedRange.Columns(2) 'colonne B
                If Not IsArray(tablo) Then tablo = w.UsedRange.Columns(2).Resize(2)
Vous semblez ne pas avoir testé ma solution, pourtant elle ramène toutes les occurrences dans le 1er fichier.

Pour une occurrence particulière il suffit ensuite de la rechercher en colonne A (touches Ctrl+F).
 

Fichiers joints

trumanberic

XLDnaute Nouveau
EDIT: J'ai essaye votre fichier "recherche" c'est bien l'idée, je comprends qu'au vu des infos pas assez précises que je vous ai donné vous ayez fait de votre mieux, et je vous en remercie ! OK, je comprends que votre macro permet d'extraire tous les chiffres et que je dois lancer Ctrl + F dans la colonne A ! (d'ou l'abondance de résultat), je m'imaginais une macro capable de lancer le Ctrl F indépendamment de l'utilisateur, de façon totalement autonome.

Je me permet de poster ici l'idée du résultat d'une recherche optimum, s'il existe un moyen d'y arriver, pour une lisibilité plus facile .

Je vous remercie une nouvelle fois.
 

Fichiers joints

job75

XLDnaute Barbatruc
La macro adaptée à votre dernier fichier :
VB:
Sub Recherche()
Dim chemin$, fichier$, d As Object, w As Worksheet, tablo, nom$, e, x$, i&
chemin = ThisWorkbook.Path & "\"
fichier = Dir(chemin & "*.xls*") '1er fichier du dossier
Set d = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si un fichier est déjà ouvert
While fichier <> ""
    If fichier <> ThisWorkbook.Name Then
        With Workbooks.Open(chemin & fichier)
            For Each w In .Worksheets
                tablo = w.UsedRange.Columns(2)
                nom = "#" & .Name & "#"
                If Not IsArray(tablo) Then tablo = w.UsedRange.Columns(2).Resize(2)
                For Each e In tablo
                    x = CStr(e)
                    If x Like "##############" Then _
                        If InStr("#" & d(x) & "#", nom) = 0 Then _
                            d(x) = IIf(d(x) = "", "", d(x) & "#") & .Name
            Next e, w
            .Close
        End With
    End If
    fichier = Dir 'fichier suivant
Wend
'---restitution---
tablo = ActiveSheet.UsedRange.Resize(, 2)
For i = 2 To UBound(tablo)
    tablo(i, 2) = d(CStr(tablo(i, 1)))
Next
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 'si la feuille est filtrée
[B1].Resize(UBound(tablo)) = Application.Index(tablo, , 2)
Columns("B").AutoFit 'ajustement largeur
End Sub
Nota : si un même numéro se trouve dans plusieurs fichiers les noms de ces fichiers sont concaténés en colonne B.
 

Fichiers joints

trumanberic

XLDnaute Nouveau
Re bonjour,

MERCI,
merci infiniment pour votre retour et votre solution :)

Je ne veux absolument pas avoir l'air d'insister mais serait il possible également de renseigner la date de la création du "job" (Cette date se trouve, et se trouvera toujours, dans la colonne A dans le format "DATE: JJ/MM/AAAA" ) ainsi les infos en colonne E " Commentaires" (si et quand il y en a) ?

Exemple sur "X" le document 37531021708236 traité le 4/12/2018, et le commentaire " EN COURS"
 

Fichiers joints

  • 15.8 KB Affichages: 2

job75

XLDnaute Barbatruc
Je ne veux absolument pas avoir l'air d'insister
Trop tard, vous en avez tout à fait l'air.

Et dans le fichier X.xlsx du post #12 les commentaires sont en colonne D, pas en colonne E, que faut-il faire alors ?

Et en colonne A les dates ne sont pas des dates...

Le mieux est de revoir ce fichier pour qu'il tienne la route.
 

Roblochon

XLDnaute Occasionnel
Bonjour,

J'ai complété la demande dans ce dernier essai. Parfois les Dates sont des dates et parfois des textes "Date: 11/12/2018". La macro les retourne telle qu'elle les trouve à charge pour vous de faire le traitement adéquate (formule).

Le classeur joint fonctionne sur les classeurs y.xlsx et x.xlsx de son répertoire.

Bonne fin d'après-midi

Edit: Oups, j'avais laissé traîner un Stop de test dans la macro
 

Fichiers joints

trumanberic

XLDnaute Nouveau
Trop tard, vous en avez tout à fait l'air.
Ben je vais assumer, heureusement que je suis poli et souriant ^^

Ce serait en colonne E, les date sont dans la colonne A, elles sont inscrites après les caractères "DATE", la ligne exacte variant d'une journée à l'autre je ne peux donner plus de précisions hélàs.

Je vous remercie
 

Fichiers joints

  • 16.2 KB Affichages: 1

trumanberic

XLDnaute Nouveau
Bonjour,

J'ai complété la demande dans ce dernier essai. Parfois les Dates sont des dates et parfois des textes "Date: 11/12/2018". La macro les retourne telle qu'elle les trouve à charge pour vous de faire le traitement adéquate (formule).

Le classeur joint fonctionne sur les classeurs y.xlsx et x.xlsx de son répertoire.

Bonne fin d'après-midi

Edit: Oups, j'avais laissé traîner un Stop de test dans la macro

Merci Mr. Roblochon, je crois que c'est exactement ce dont j'avais besoin, c'est parfait :))

Merci beaucoup !
 

job75

XLDnaute Barbatruc
Le fichier Z.xlsx du post #15 ne tient absolument pas la route !

Dans cette solution j'utilise le fichier X.xlsx du post #12 (commentaires en colonne D), il y a 3 Dictionary :
VB:
Sub Recherche()
Dim chemin$, fichier$, d1 As Object, d2 As Object, d3 As Object, w As Worksheet, tablo, nom$, i&, j&, x$
chemin = ThisWorkbook.Path & "\"
fichier = Dir(chemin & "*.xls*") '1er fichier du dossier
Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")
Set d3 = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
Application.DisplayAlerts = False 'si un fichier est déjà ouvert
While fichier <> ""
    If fichier <> ThisWorkbook.Name Then
        With Workbooks.Open(chemin & fichier)
            For Each w In .Worksheets
                tablo = w.UsedRange.Resize(, 4)
                nom = "#" & .Name & "#"
                For i = 1 To UBound(tablo)
                    x = CStr(tablo(i, 2))
                    If x Like "##############" Then
                        If InStr("#" & d1(x) & "#", nom) = 0 Then
                            d1(x) = IIf(d1(x) = "", "", d1(x) & "#") & .Name
                            For j = i To 1 Step -1
                                If IsDate(Right(tablo(j, 1), 8)) Then
                                    d2(x) = IIf(d2(x) = "", "", d2(x) & "#") & Right(tablo(j, 1), 8)
                                    Exit For
                                End If
                            Next j
                            d3(x) = IIf(d3(x) = "", "", d3(x) & "#") & tablo(i, 4) 'commentaire en colonne D
                        End If
                    End If
            Next i, w
            .Close
        End With
    End If
    fichier = Dir 'fichier suivant
Wend
'---restitution---
tablo = ActiveSheet.UsedRange.Resize(, 4)
For i = 2 To UBound(tablo)
    tablo(i, 2) = d1(CStr(tablo(i, 1)))
    If d2.exists(CStr(tablo(i, 1))) Then tablo(i, 3) = CDate(d2(CStr(tablo(i, 1)))) Else tablo(i, 3) = ""
    tablo(i, 4) = d3(CStr(tablo(i, 1)))
Next i
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 'si la feuille est filtrée
[A1].Resize(UBound(tablo), 4) = tablo
Columns.AutoFit 'ajustement largeur
End Sub
 

Fichiers joints

Discussions similaires


Haut Bas