recherche sur plusieurs onglets

heho13

XLDnaute Occasionnel
bonjour,

Peut on faire une recherche sur un fichier de plusieurs onglets.

un ex en pj

merci
 

Pièces jointes

  • test.xls
    24.5 KB · Affichages: 64
  • test.xls
    24.5 KB · Affichages: 65
  • test.xls
    24.5 KB · Affichages: 70

Gen Rose

XLDnaute Impliqué
Supporter XLD
Re : recherche sur plusieurs onglets

Bonjour heho13
Le Forum,

Habituellement, lorsque je cherche un mot sur plusieurs onglets je fait Ctrl+F; j'inscrit mon mot; je clique sur Options; Avec Dans, je choisi Classeur.

Sauf que, en regardant le résultat souhaité, il me semble que c'est plutôt un report de données que tu souhaites et ce, sans doublons. C'est un tout autre sujet!

À vue d'oeil, comme les données à reporter peuvent se retrouver partout dans la feuille sans aucune autre référence, il faudrait un code VBA pour balayer toutes les feuilles et les reporter en Feuil1 'resultat'.

Ceci dit, est-ce pour un autre travail plus complexe où il y a des tableaux? Car si c'est le cas, il serait plus utile d'avoir le document dans sa forme originale avec des données factices afin de tester des solution.

Cdt,
 

job75

XLDnaute Barbatruc
Re : recherche sur plusieurs onglets

Bonsoir heho13, Geneviève, CISCO,

Une solution VBA dans le fichier joint :

Code:
Sub Recherche()
Dim d As Object, w As Worksheet, tablo, t
'---recherche des textes sans doublon--
Set d = CreateObject("Scripting.dictionary")
For Each w In Worksheets
  If w.Name <> "resultat" Then
    tablo = w.UsedRange 'matrice, plus rapide
    For Each t In tablo
      If Not IsNumeric(t) Then d(t) = ""
    Next
  End If
Next
'---résultat---
With Sheets("resultat")
  If d.Count Then
    .[B9].Resize(d.Count) = Application.Transpose(d.keys)
    .[B9].Resize(d.Count).Sort .[B9], xlAscending, Header:=xlNo 'tri
  End If
  .Range("B" & 9 + d.Count & ":B" & .Rows.Count).ClearContents
End With
End Sub
A+
 

Pièces jointes

  • Recherche(1).xls
    49 KB · Affichages: 59
  • Recherche(1).xls
    49 KB · Affichages: 60
  • Recherche(1).xls
    49 KB · Affichages: 54

job75

XLDnaute Barbatruc
Re : recherche sur plusieurs onglets

Re,

En fait c'est plus compliqué car si une feuille est vide ou ne contient qu'une donnée la macro précédente beugue.

Donc utiliser :

Code:
Sub Recherche()
Dim d As Object, w As Worksheet, tablo, t
'---recherche des textes sans doublon--
Set d = CreateObject("Scripting.dictionary")
For Each w In Worksheets
  If w.Name <> "resultat" Then
    tablo = w.UsedRange 'matrice, plus rapide
    If Application.CountA(tablo) < 2 Then
      If Not IsNumeric(tablo) Then d(tablo) = ""
    Else
      For Each t In tablo
        If Not IsNumeric(t) Then d(t) = ""
      Next
    End If
  End If
Next
'---résultat---
With Sheets("resultat")
  If d.Count Then
    .[B9].Resize(d.Count) = Application.Transpose(d.keys)
    .[B9].Resize(d.Count).Sort .[B9], xlAscending, Header:=xlNo 'tri
  End If
  .Range("B" & 9 + d.Count & ":B" & .Rows.Count).ClearContents
End With
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Recherche(2).xls
    52 KB · Affichages: 53
  • Recherche(2).xls
    52 KB · Affichages: 56
  • Recherche(2).xls
    52 KB · Affichages: 72

job75

XLDnaute Barbatruc
Re : recherche sur plusieurs onglets

Re,

Merci pour le Like Geneviève, mais je fais mumuse :)

Avec le formatage en Feuil6 du fichier (3), de nouveau il y avait bug.

Alors ceci fonctionnera dans tous les cas :

Code:
Sub Recherche()
Dim d As Object, w As Worksheet, tablo, t
'---recherche des textes sans doublon---
Set d = CreateObject("Scripting.dictionary")
For Each w In Worksheets
  If w.Name <> "resultat" Then
    If w.UsedRange.Count < 2 Then
      If Not IsNumeric(w.UsedRange.Value) Then d(w.UsedRange.Value) = ""
    Else
      tablo = w.UsedRange 'matrice, plus rapide
      For Each t In tablo
        If Not IsNumeric(t) Then d(t) = ""
      Next
    End If
  End If
Next
'---résultat---
With Sheets("resultat")
  If d.Count Then
    .[B9].Resize(d.Count) = Application.Transpose(d.keys)
    .[B9].Resize(d.Count).Sort .[B9], xlAscending, Header:=xlNo 'tri
  End If
  .Range("B" & 9 + d.Count & ":B" & .Rows.Count).ClearContents
End With
End Sub
A+
 

Pièces jointes

  • Recherche(3).xls
    56 KB · Affichages: 67
  • Recherche(3).xls
    56 KB · Affichages: 60
  • Recherche(3).xls
    56 KB · Affichages: 58

job75

XLDnaute Barbatruc
Re : recherche sur plusieurs onglets

Bonsoir le fil,

Je repasse par là avec un complément.

En effet, même sur Excel 2010, Application.Transpose ne peut pas transposer plus de 65536 items.

Dans ce cas il faut faire la transposition item par item :

Code:
Sub Recherche()
Dim d As Object, w As Worksheet, tablo(), t, a, i&
'---recherche des textes sans doublon---
Set d = CreateObject("Scripting.dictionary")
For Each w In Worksheets
  If w.Name <> "resultat" Then
    If w.UsedRange.Count < 2 Then
      If Not IsNumeric(w.UsedRange.Value) Then d(w.UsedRange.Value) = ""
    Else
      tablo = w.UsedRange 'matrice, plus rapide
      For Each t In tablo
        If Not IsNumeric(t) Then d(t) = ""
      Next
    End If
  End If
Next
'---résultat---
With Sheets("resultat")
  If d.Count Then
    a = d.keys
    ReDim tablo(UBound(a), 0)
    For i = 0 To UBound(a) 'transposition
      tablo(i, 0) = a(i)
    Next
    .[B9].Resize(d.Count) = tablo
    .[B9].Resize(d.Count).Sort .[B9], xlAscending, Header:=xlNo 'tri
  End If
  .Range("B" & 9 + d.Count & ":B" & .Rows.Count).ClearContents
End With
End Sub
Fichier (4) .xlsm joint donnant un résultat jusqu'à la ligne 100017.

A+
 

Pièces jointes

  • Recherche(4).zip
    522.7 KB · Affichages: 69
  • Recherche(4).zip
    522.7 KB · Affichages: 68
  • Recherche(4).zip
    522.7 KB · Affichages: 68

job75

XLDnaute Barbatruc
Re : recherche sur plusieurs onglets

Bonjour heho13, le forum,

Suivant la version Excel utilisée, on peut se donner la hauteur maximum du tableau des résultats, avec éventuellement plusieurs colonnes.

Les items sont triés par la macro Quick sort :

Code:
Sub Recherche()
Dim d As Object, w As Worksheet, tablo(), t, dc&, a, h&, col%, i&, j%, n&
'---recherche des textes sans doublon---
Set d = CreateObject("Scripting.dictionary")
For Each w In Worksheets
  If w.Name <> "resultat" Then
    If w.UsedRange.Count < 2 Then
      If Not IsNumeric(w.UsedRange) Then d(w.UsedRange) = ""
    Else
      tablo = w.UsedRange 'matrice, plus rapide
      For Each t In tablo
        If Not IsNumeric(t) Then d(t) = ""
      Next
    End If
  End If
Next
'---résultat---
With Sheets("resultat")
  dc = d.Count
  If dc Then
    a = d.keys
    Call tri(a, 0, dc - 1)
    h = 50000 'hauteur maximum du tableau de résultat, à adapter
    col = Application.RoundUp(dc / h, 0)
    ReDim tablo(1 To h, 1 To col) 'base 1
    Do
      i = i + 1
      For j = 1 To col
        tablo(i, j) = a(n)
        n = n + 1
        If n = dc Then Exit Do
      Next
    Loop
    .[B9].Resize(i, col) = tablo
  End If
  .Range(.Columns(col + 2), .Columns(.Columns.Count)).ClearContents
  .Rows(i + 9 & ":" & .Rows.Count).ClearContents
End With
End Sub

Sub tri(a, gauc, droi)          ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
Fichier (5) .xls joint.

A+
 

Pièces jointes

  • Recherche(5).zip
    718.1 KB · Affichages: 48
  • Recherche(5).zip
    718.1 KB · Affichages: 43
  • Recherche(5).zip
    718.1 KB · Affichages: 49

Discussions similaires

Statistiques des forums

Discussions
312 248
Messages
2 086 594
Membres
103 250
dernier inscrit
keks974