urgent !! moteur de recherche excel !!

arnod67

XLDnaute Nouveau
:) Voila ce que je recherche
- explication-
dans mes cellules d'excel, j'ai des phrases plus au mon court avec ou sans chiffres etc...

Actuellement j'au une macro de Gorfael qui cherche un mot elle fonctionne correctement >Ok

Ce que je j'aimerais c’est rechercher plusieurs mots clés a la fois qui sont aléatoirement dans le texte afin d'affiner ma recherche.

merci

Arno67
***********

Sub Macro_Recherche()

Dim Str_Plage As String

Dim Cel As Range

Dim Feuil As Worksheet

Dim Str_critère As String

Dim X As Byte



Str_Plage = "A1:p360"

Str_critère = InputBox("Mot excat à rechercher ?")

For Each Feuil In Sheets

For Each Cel In Feuil.Range(Str_Plage)

If UCase(Cel) Like "*" & UCase(Str_critère) & "*" Then

Feuil.Activate

Cel.Activate

X = MsgBox("Mot """ & Str_critère & """ trouvé :" & Chr(13) & _

"Sur la feuille : " & Feuil.Name & Chr(13) & _

"à l'adresse : " & Cel.Address(0, 0) & Chr(13) & Chr(13) & _

"Oui : on arrête la recherche et on y va" & Chr(13) & _

"Non : on continue la recherche " & Chr(13) & _

"Annuler : on arrête la recherche" & Chr(13), vbDefaultButton1 + _

vbQuestion + vbYesNoCancel, "MOT TROUVÉ")

Select Case X

Case 6

Feuil.Activate

Cel.Activate

Exit Sub

Case 2 'annuler on sort

Exit Sub

Case Else 'Non=7

'on fait rien, mais on pourrait

End Select

End If

Next Cel

Next Feuil

MsgBox ("pas trouvé, ce mot n'existe pas, refait une nouvelle recherche... !?!")

End Sub
 

Excel-lent

XLDnaute Barbatruc
Re : urgent !! moteur de recherche excel !!

Bonsoir Arnod67,

Macro modifié ci-dessous pour répondre aux nouvelles exigences.

Sans un bout de fichier pour pouvoir tester les modifications, je ne peux garantir le bon fonctionnement de la macro!

Tiens nous au courant

Code:
Sub Macro_Recherche() 

Dim Str_Plage As String 
Dim Cel As Range 
Dim Feuil As Worksheet 
Dim Str_critère As String 
Dim Str_critère2 As String
Dim X As Byte 

Str_Plage = "A1:P360" 
Str_critère = InputBox("Mot  exact n° 1 à rechercher ?") 
Str_critère2 = InputBox("Mot  exact n° 2 à rechercher ?") 


For Each Feuil In Sheets 
     For Each Cel In Feuil.Range(Str_Plage) 
         If UCase(Cel) Like "*" & UCase(Str_critère) & "*" AND UCase(Cel) Like "*" & UCase(Str_critère2) & "*"Then 
            Feuil.Activate 
            Cel.Activate 
            X = MsgBox("Mots " & Str_critère & " et " & Str_critère2 & " trouvés :" & Chr(13) & _ 

"Sur la feuille : " & Feuil.Name & Chr(13) & _ 
"à l'adresse : " & Cel.Address(0, 0) & Chr(13) & Chr(13) & _ 
"Oui : on arrête la recherche et on y va" & Chr(13) & _ 
"Non : on continue la recherche " & Chr(13) & _ 
"Annuler : on arrête la recherche" & Chr(13), vbDefaultButton1 + _ 
vbQuestion + vbYesNoCancel, "MOT TROUVÉ") 

            Select Case X 
            Case 6 
            Feuil.Activate 
            Cel.Activate 
            Exit Sub 

            Case 2 'annuler on sort 
            Exit Sub 

            Case Else 'Non=7 

'on fait rien, mais on pourrait 

           End Select 

          End If 
      Next Cel 
Next Feuil 

MsgBox ("pas trouvé, ces mots n'existe pas, refait une nouvelle recherche... !?!") 

End Sub

Bonne soirée
 

PMO2

XLDnaute Accro
Re : urgent !! moteur de recherche excel !!

Bonjour,

J'ai interprété votre demande comme 1) "recherche de plusieurs mots clés présents dans la même cellule"
et non pas comme 2) "recherche de plusieurs mots clés dans différentes cellules".

EXPLICATION
on cherche 3 mots (ex : toto course maison) et on a
en A1 "toto mange à la maison"
en A2 "la maison est en pierre"
en A3 "toto va faire les courses et passe plusieurs maisons"

Cas 1 (ce que j'ai programmé)
Seule A3 est valide car on y a bien TOUS les mots ou parties de mots recherchés.

Cas 2 (je ne l'ai pas traité)
Les 3 cellules sont valides car on y trouve un élément ou plusieurs .

COMMENT CELA MARCHE
1) lancez la macro "MoteurRecherche"
2) dans la boîte InputBox, saisissez plusieurs mots séparés par des espaces et cliquez OK
3) les mots recherchés sont colorisés et mis en gras dans la colonne "B" d'une
nouvelle feuille. Dans la colonne "A" figurent le nom de la feuille et de la cellule sources
ainsi qu'un lien hypertexte ramenant à la cellule d'origine.

COPIEZ LE CODE ci-dessous dans un module standard
Code:
***************************
Sub MoteurRecherche()
Dim couleur
Dim reponse
Dim var
Dim T()
Dim A$
Dim B$
Dim Nom$
Dim Lien$
Dim g&
Dim h&
Dim i&
Dim j&
Dim cpt&
Dim lig&
Dim valide&
Dim R As Range
Dim R2 As Range
Dim R3 As Range
Dim bool As Boolean
Dim S As Worksheet
Dim DEST As Worksheet

On Error GoTo Erreur
couleur = Array(, 5, 3, 50, 46, 13, 16, 7, 9, _
                  5, 3, 50, 46, 13, 16, 7, 9)
reponse = Application.InputBox(prompt:= _
 "Tapez les mots à rechercher en les séparant par au moins un espace", _
  Title:="Moteur de recherche", Type:=1 + 2)
If reponse = False Or reponse = "" Then Exit Sub
reponse = Trim(CStr(reponse))
A$ = reponse
If InStr(1, A$, Space(1)) = 0 Then
  ReDim Preserve T(1 To 1)
  T(1) = A$
  A$ = ""
End If
Do Until A$ = ""
  cpt& = cpt& + 1
  ReDim Preserve T(1 To cpt&)
  i& = InStr(1, A$, Space(1))
  If i& > 0 Then
    B$ = Mid(A$, 1, i& - 1)
    T(cpt&) = B$
    A$ = Trim(Mid(A$, i& + 1))
  Else
    T(cpt&) = A$
    A$ = ""
  End If
Loop
'------------------
cpt& = 0
Nom$ = "*Recherche"
Do Until bool
  For i& = 1 To Sheets.Count
    bool = True
    If Sheets(i&).Name = Nom$ Then
      cpt& = cpt& + 1
      Nom$ = "*Recherche (" & cpt& & ")"
      bool = False
      Exit For
    End If
  Next i&
Loop
Application.ScreenUpdating = False
bool = False
Set DEST = Sheets.Add(after:=Sheets(Sheets.Count))
DEST.Name = Nom$
For h& = 1 To ActiveWorkbook.Worksheets.Count - 1
  Set S = Sheets(h&)
  If InStr(1, S.Name, "*Recherche") > 0 Then GoTo saut
  If S.UsedRange.Address = "$A$1" Then
    If S.[a1] = "" Then GoTo saut
    Set R = S.[a1]
    A$ = R
    i& = 1
    j& = 1
    GoSub Recherche
  Else
    Set R = S.UsedRange
    var = R
    For j& = 1 To UBound(var, 2)
      For i& = 1 To UBound(var, 1)
        A$ = LCase(var(i&, j&))
        GoSub Recherche
      Next i&
    Next j&
  End If
saut:
Next h&
With DEST.Cells
  .EntireColumn.AutoFit
  If DEST.Columns("b").ColumnWidth < 130 Then _
      DEST.Columns("b").ColumnWidth = 130
  .VerticalAlignment = xlTop
  .WrapText = True
  .EntireRow.AutoFit
End With
'------------------
If Not bool Then
  Application.DisplayAlerts = False
  DEST.Delete
  Application.DisplayAlerts = True
  MsgBox "Aucune cellule ne contient tous les mots recherchés."
End If
Erreur:
Application.DisplayAlerts = True
Application.ScreenUpdating = True
If Err <> 0 Then MsgBox "Erreur " & _
    Err.Number & vbCrLf & Err.Description
Exit Sub
'----- Sous routine -----
Recherche:
valide& = 0
For g& = 1 To UBound(T)
  If InStr(1, A$, LCase(T(g&))) > 0 Then
    valide& = valide& + 1
  End If
Next g&
If valide& = UBound(T) Then
  bool = True
  Set R2 = S.Range(S.Cells(i& + R.Row - 1, j& + R.Column - 1), _
        S.Cells(i& + R.Row - 1, j& + R.Column - 1))
  R2.Copy
  If DEST.[b1] = "" Then
    lig& = 1
  Else
    lig& = DEST.UsedRange.Rows.Count + 1
  End If
  DEST.Paste Destination:=DEST.Range("b" & lig& & "")
  Set R3 = DEST.Range("b" & lig& & "")
  With R3.Font
    .Bold = False
    .ColorIndex = 0
  End With
  cpt& = 1
  For g& = 1 To UBound(T)
    cpt& = InStr(cpt&, LCase(R3), T(g&))
    Do Until cpt& = 0
      With R3.Characters(Start:=cpt&, Length:=Len(T(g&))).Font
        .ColorIndex = couleur(g&)
        .Bold = True
      End With
      cpt& = InStr(cpt& + Len(T(g&)) - 1, R2, T(g&))
    Loop
    cpt& = 1
  Next g&
  Lien$ = Chr(39) & R2.Parent.Name & Chr(39) & _
        "!" & R2.Address(False, False)
  DEST.Hyperlinks.Add Anchor:=DEST.Range("a" & lig& & ""), _
        Address:="", SubAddress:=Lien$, TextToDisplay:=Lien$
End If
Return
End Sub
***************************
En espérant que l'option choisie entre le cas 1 et le cas 2 soit la bonne.

Cordialement.

PMO
Patrick Morange
 

lebillou

XLDnaute Nouveau
Re : urgent !! moteur de recherche excel !!

Salut!
Je me suis permis d'utiliser le code que tu avais donné parce que c'est exactement ce que je voulais faire mais j'ai une erreur qui me dit :

Erreur 1014 (le nom de la feuille ou du graphique n'est pas correct).
Je me doute que quelque chose ne lui plait pas au moment de creer la feuille ou tu affiches les reponses mais je ne sais pas ou/comment/pourquoi modifier cela.

Pourrais tu m'aider si'il te plait??
Merci d'avance

Charles
 

PMO2

XLDnaute Accro
Re : urgent !! moteur de recherche excel !!

Bonjour Lebillou,

Dans la mesure où votre message s'adresse bien à moi,
vous serait-il possible de fournir votre classeur ?
Cela me permettrait de le tester et de déboguer le code.

Cordialement.

PMO
Patrick Morange
 

lebillou

XLDnaute Nouveau
Re : urgent !! moteur de recherche excel !!

Bonjour à tous,

Je me suis permis d'utiliser le code qui avait été donné plus haut pour faire un moteur de recherche d'articles de revue qui marche très bien sauf qu'il ne me donne comme résultat que le premier et le dernier article enregistré qui correspond à la recherche.
Ce que j'ai fait c'est de créer une feuille excel pour chaque revue et le moteur de recherche doit verifier dans chaque feuille les mots cles tapes et renvoyer les reponses. Le problème est donc qu'il me renvoit seulement la premiere reponse correcte apparaissant dans la premiere feuille et la derniere de la derniere feuille mais pas celles entre les deux.

Je vous mets le code que j'ai.

Si vous pouviez m'aider ca m'arrangerait bien parce que je ne vois pas où peut etre le probleme...

Merci d'avance

Code:
Sub MoteurRecherche()
Dim couleur
Dim reponse
Dim var
Dim T()
Dim A$
Dim B$
Dim Nom$
Dim Lien$
Dim g&
Dim h&
Dim i&
Dim j&
Dim cpt&
Dim lig&
Dim valide&
Dim R As Range
Dim R2 As Range
Dim R3 As Range
Dim bool As Boolean
Dim S As Worksheet
Dim DEST As Worksheet

On Error GoTo Erreur
couleur = Array(, 5, 3, 50, 46, 13, 16, 7, 9, _
                  5, 3, 50, 46, 13, 16, 7, 9)
reponse = Application.InputBox(prompt:= _
 "Entre las palabras a buscar separadas por un espacio", _
  Title:="Motor de busqueda", Type:=1 + 2)
If reponse = False Or reponse = "" Then Exit Sub
reponse = Trim(CStr(reponse))
A$ = reponse
If InStr(1, A$, Space(1)) = 0 Then
  ReDim Preserve T(1 To 1)
  T(1) = A$
  A$ = ""
End If
Do Until A$ = ""
  cpt& = cpt& + 1
  ReDim Preserve T(1 To cpt&)
  i& = InStr(1, A$, Space(1))
  If i& > 0 Then
    B$ = Mid(A$, 1, i& - 1)
    T(cpt&) = B$
    A$ = Trim(Mid(A$, i& + 1))
  Else
    T(cpt&) = A$
    A$ = ""
  End If
Loop
'------------------
cpt& = 0
Nom$ = "Recherche"
Do Until bool
  For i& = 1 To Sheets.Count
    bool = True
    If Sheets(i&).Name = Nom$ Then
      cpt& = cpt& + 1
      Nom$ = "Recherche (" & cpt& & ")"
      bool = False
      Exit For
    End If
  Next i&
Loop
Application.ScreenUpdating = False
bool = False
Set DEST = Sheets("index")
For h& = 2 To ActiveWorkbook.Worksheets.Count
  Set S = Sheets(h&)
  If InStr(1, S.Name, "index") > 0 Then GoTo saut
  If S.UsedRange.Address = "$A$1" Then
    If S.[a1] = "" Then GoTo saut
    Set R = S.[a1]
    A$ = R
    i& = 1
    j& = 1
    GoSub Recherche
  Else
    Set R = S.UsedRange
    var = R
    For j& = 1 To UBound(var, 2)
      For i& = 1 To UBound(var, 1)
        A$ = LCase(var(i&, j&))
        GoSub Recherche
      Next i&
    Next j&
  End If
saut:
Next h&
With DEST.Cells
  .EntireColumn.AutoFit
  If DEST.Columns("b").ColumnWidth < 150 Then _
      DEST.Columns("b").ColumnWidth = 150
  .VerticalAlignment = xlTop
  .WrapText = True
  .EntireRow.AutoFit
End With
'------------------
If Not bool Then
 
  MsgBox "Aucune cellule ne contient tous les mots recherchés."
End If
Erreur:
Application.DisplayAlerts = True
Application.ScreenUpdating = True
If Err <> 0 Then MsgBox "Erreur " & _
    Err.Number & vbCrLf & Err.Description
Exit Sub
'----- Sous routine -----
Recherche:
valide& = 0
lig& = 9
For g& = 1 To UBound(T)
  If InStr(1, A$, LCase(T(g&))) > 0 Then
    valide& = valide& + 1
  End If
Next g&
If valide& = UBound(T) Then
  bool = True
  Set R2 = S.Range(S.Cells(i& + R.Row - 1, j& + R.Column - 1), _
        S.Cells(i& + R.Row - 1, j& + R.Column - 1))
  R2.Copy
  If DEST.Range("b" & lig& & "") = "" Then
    lig& = lig&
  Else
    lig& = lig& + 1
  End If
  DEST.Paste Destination:=DEST.Range("b" & lig& & "")
  Set R3 = DEST.Range("b" & lig& & "")
  With R3.Font
    .Bold = False
    .ColorIndex = 0
  End With
  cpt& = 1
  For g& = 1 To UBound(T)
    cpt& = InStr(cpt&, LCase(R3), T(g&))
    Do Until cpt& = 0
      With R3.Characters(Start:=cpt&, Length:=Len(T(g&))).Font
        .ColorIndex = couleur(g&)
        .Bold = True
      End With
      cpt& = InStr(cpt& + Len(T(g&)) - 1, R2, T(g&))
    Loop
    cpt& = 1
  Next g&
  Lien$ = Chr(39) & R2.Parent.Name & Chr(39) & _
        "!" & R2.Address(False, False)
  DEST.Hyperlinks.Add Anchor:=DEST.Range("a" & lig& & ""), _
        Address:="", SubAddress:=Lien$, TextToDisplay:=Lien$
End If
Return
End Sub
 

PMO2

XLDnaute Accro
Re : urgent !! moteur de recherche excel !!

Bonjour,

Essayez avec le code modifié ci-dessous
Code:
Const LIG_DEPART As Long = 9

Sub MoteurRecherche()
Dim couleur
Dim reponse
Dim var
Dim T()
Dim A$
Dim B$
Dim Nom$
Dim Lien$
Dim g&
Dim h&
Dim i&
Dim j&
Dim cpt&
Dim lig&
Dim LigDepart&
Dim valide&
Dim R As Range
Dim R2 As Range
Dim R3 As Range
Dim bool As Boolean
Dim S As Worksheet
Dim DEST As Worksheet
On Error GoTo Erreur
couleur = Array(, 5, 3, 50, 46, 13, 16, 7, 9, _
                  5, 3, 50, 46, 13, 16, 7, 9)
reponse = Application.InputBox(prompt:= _
 "Entre las palabras a buscar separadas por un espacio", _
  Title:="Motor de busqueda", Type:=1 + 2)
If reponse = False Or reponse = "" Then Exit Sub
reponse = Trim(CStr(reponse))
A$ = reponse
If InStr(1, A$, Space(1)) = 0 Then
  ReDim Preserve T(1 To 1)
  T(1) = A$
  A$ = ""
End If
Do Until A$ = ""
  cpt& = cpt& + 1
  ReDim Preserve T(1 To cpt&)
  i& = InStr(1, A$, Space(1))
  If i& > 0 Then
    B$ = Mid(A$, 1, i& - 1)
    T(cpt&) = B$
    A$ = Trim(Mid(A$, i& + 1))
  Else
    T(cpt&) = A$
    A$ = ""
  End If
Loop
'------------------
cpt& = 0
Nom$ = "Recherche"
Do Until bool
  For i& = 1 To Sheets.Count
    bool = True
    If Sheets(i&).Name = Nom$ Then
      cpt& = cpt& + 1
      Nom$ = "Recherche (" & cpt& & ")"
      bool = False
      Exit For
    End If
  Next i&
Loop
Application.ScreenUpdating = False
bool = False
On Error Resume Next
Set DEST = Sheets("index")
If DEST Is Nothing Then
  Set DEST = Sheets.Add(before:=Sheets(1))
  DEST.Name = "index"
Else
  DEST.Move before:=Sheets(1)
  DEST.Cells.Delete
End If
On Error GoTo Erreur
For h& = 2 To ActiveWorkbook.Worksheets.Count
  Set S = Sheets(h&)
  If InStr(1, S.Name, "index") > 0 Then GoTo saut
  If S.UsedRange.Address = "$A$1" Then
    If S.[a1] = "" Then GoTo saut
    Set R = S.[a1]
    A$ = R
    i& = 1
    j& = 1
    GoSub Recherche
  Else
    Set R = S.UsedRange
    var = R
    For j& = 1 To UBound(var, 2)
      For i& = 1 To UBound(var, 1)
        A$ = LCase(var(i&, j&))
        GoSub Recherche
      Next i&
    Next j&
  End If
saut:
Next h&
With DEST.Cells
  .EntireColumn.AutoFit
  If DEST.Columns("b").ColumnWidth < 150 Then _
      DEST.Columns("b").ColumnWidth = 150
  .VerticalAlignment = xlTop
  .WrapText = True
  .EntireRow.AutoFit
End With
'------------------
If Not bool Then
  MsgBox "Aucune cellule ne contient tous les mots recherchés."
End If
Erreur:
Application.DisplayAlerts = True
Application.ScreenUpdating = True
If Err <> 0 Then MsgBox "Erreur " & _
    Err.Number & vbCrLf & Err.Description
Exit Sub
'----- Sous routine -----
Recherche:
valide& = 0
For g& = 1 To UBound(T)
  If InStr(1, A$, LCase(T(g&))) > 0 Then
    valide& = valide& + 1
  End If
Next g&
If valide& = UBound(T) Then
  bool = True
  Set R2 = S.Range(S.Cells(i& + R.Row - 1, j& + R.Column - 1), _
        S.Cells(i& + R.Row - 1, j& + R.Column - 1))
  R2.Copy
  If DEST.Range("b" & lig& + LIG_DEPART & "") = "" Then
    lig& = lig&
  Else
    lig& = lig& + 1
  End If
  DEST.Paste Destination:=DEST.Range("b" & lig& + LIG_DEPART & "")
  Set R3 = DEST.Range("b" & lig& + LIG_DEPART & "")
  With R3.Font
    .Bold = False
    .ColorIndex = 0
  End With
  cpt& = 1
  For g& = 1 To UBound(T)
    cpt& = InStr(cpt&, LCase(R3), T(g&))
    Do Until cpt& = 0
      With R3.Characters(Start:=cpt&, Length:=Len(T(g&))).Font
        .ColorIndex = couleur(g&)
        .Bold = True
      End With
      cpt& = InStr(cpt& + Len(T(g&)) - 1, R2, T(g&))
    Loop
    cpt& = 1
  Next g&
  Lien$ = Chr(39) & R2.Parent.Name & Chr(39) & _
        "!" & R2.Address(False, False)
  DEST.Hyperlinks.Add Anchor:=DEST.Range("a" & lig& + LIG_DEPART & ""), _
        Address:="", SubAddress:=Lien$, TextToDisplay:=Lien$
End If
Return
End Sub

Cordialement.

PMO
Patrick Morange
 

Discussions similaires

Statistiques des forums

Discussions
312 358
Messages
2 087 581
Membres
103 598
dernier inscrit
f-laurent