Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Rechercher du texte dans une plage de données

16 réponses
Avatar
JP
Bonjour,

J'ai une ligne avec des adresses. Chaque adresse est compos=E9 d'un nom, d'=
une rue, d'un code postal et d'une ville. Une adresse compl=E8te par cellul=
e et sur trois lignes.
je recherche un code qui permettrait de rechercher tout ou partie d'adresse=
.

Exemple:
j'ai une adresse comme celle l=E0:

Jean MARTIN
12, rue des oliviers
75000 PARIS

Je lance la recherche sur "PARIS", je voudrai pouvoir rep=E9rer toutes les =
adresses contant le terme recherch=E9.

Je pense que c'est fastidieux.

Auriez-vous un code qui fasse ce travail?

Merciiii d'avance.

JP

10 réponses

1 2
Avatar
MichD
Bonjour,

Essaie ceci :

Dans la procédure, tu dois indiquer le nom de la feuille où sont tes
données.

Si tu as une feuille dont l'onglet porte le nom de "Résultat", modifie dans
la
procédure le nom que doit prendre l'onglet de la feuille qui affichera les
résultats.

'---------------------------------------
Sub test()

Dim X As Variant, Trouve As Range
Dim Sh As Worksheet, Adr As String
Dim Dest As Worksheet, A As Long

On Error Resume Next

'La feuille où sont tes données.
Set Sh = Worksheets("Feuil1") 'Nom feuille à adapter

'Suppression de la feuille résultat si elle existe déjà
Application.DisplayAlerts = False
Worksheets("Résultat").Delete
Application.DisplayAlerts = True

'Ajout d'une feuille pour recueillir les résultats.
Set Dest = Worksheets.Add
Dest.Name = "Résultat"

X = Application.InputBox(Prompt:="Valeur recherchée.", Type:=3)
If X = False Then Exit Sub
With Sh.Cells
Set Trouve = .Find(what:=X, LookIn:=xlValues, lookat:=xlPart)
If Not Trouve Is Nothing Then
Adr = Trouve.Address
Do
A = A + 1
With Dest
.Range("A" & A) = Trouve.Address
.Range("B" & A) = Trouve.Value
End With
Set Trouve = .FindNext(Trouve)
Loop Until Trouve.Address = Adr
End If
End With
End Sub
'---------------------------------------


MichD
---------------------------------------------------------------
Avatar
JP
Bonsoir Denis,

Merci, je vais tenter de l'adapter à ma situation.
Je regarde demain et je reviendrai vers toi au besoin.

Merci encore.

JP
Avatar
JP
Bonjour Denis,

J'ai adapté mais je n'obtiens pas tout à fait ce que je souhaite.

Voici le code modifié:

Sub recherche()

Dim X As Variant, Trouve As Range
Dim Sh As Worksheet ', Adr As String (déclaration passée en public Adr as string)
'Dim Dest As Worksheet, A As Long

On Error Resume Next

'La feuille où sont les données.
Set Sh = Worksheets("pfmp") 'Nom feuille à adapter

X = Sheets("PFMP").TextBox1
If X = "" Then Exit Sub
With Sh.Range("E3:DH3")
Set Trouve = .Find(what:=X, LookIn:=xlValues, lookat:=xlPart)
Adr = Trouve.Address
Do
A = A + 1
Set Trouve = .FindNext(Trouve)
' UserForm5.Show
Loop Until Trouve.Address = Adr
' MsgBox " occurences trouvées: " & A
Sheets("pfmp").Range(Adr).Select
End With
End Sub


La cellule selectionnée est toujours la première occurence.
J'ai créé un userform avec un bouton suivant et un autre ok
Suivant, pour poursuivre la recherche
Ok si l'occurrence est la bonne.

Mais voilà, il y a toujours un voilà, quel code faut-il mettre derriè re les deux boutons?

Merci

JP
Avatar
MichD
Ta question initiale ne faisait pas mention d'un formulaire!

La procédure telle que présentée, copie dans une nouvelle feuille "résultat"
en colonne A, les adresses des occurrences de la valeur recherchée dans la
feuille où la recherche à lieu et dans la colonne B, le contenu complet de
la cellule trouvée.

Si tu veux les afficher dans un formulaire les données de la feuille
résultat
c'est une autre chose!

Pour l'instant, ta demande est incompréhensible!!!




MichD
---------------------------------------------------------------
"JP" a écrit dans le message de groupe de discussion :


Bonjour Denis,

J'ai adapté mais je n'obtiens pas tout à fait ce que je souhaite.

Voici le code modifié:

Sub recherche()

Dim X As Variant, Trouve As Range
Dim Sh As Worksheet ', Adr As String (déclaration passée en public Adr as
string)
'Dim Dest As Worksheet, A As Long

On Error Resume Next

'La feuille où sont les données.
Set Sh = Worksheets("pfmp") 'Nom feuille à adapter

X = Sheets("PFMP").TextBox1
If X = "" Then Exit Sub
With Sh.Range("E3:DH3")
Set Trouve = .Find(what:=X, LookIn:=xlValues, lookat:=xlPart)
Adr = Trouve.Address
Do
A = A + 1
Set Trouve = .FindNext(Trouve)
' UserForm5.Show
Loop Until Trouve.Address = Adr
' MsgBox " occurences trouvées: " & A
Sheets("pfmp").Range(Adr).Select
End With
End Sub


La cellule selectionnée est toujours la première occurence.
J'ai créé un userform avec un bouton suivant et un autre ok
Suivant, pour poursuivre la recherche
Ok si l'occurrence est la bonne.

Mais voilà, il y a toujours un voilà, quel code faut-il mettre derrière les
deux boutons?

Merci

JP
Avatar
JP
Non, je ne veux pas afficher le résultat dans un userform. Je veux repé rer sur la même feuille (celle où se fait la recherche) les cellules co ntenant le terme de la recherche (Exemple Paris)
Si "Paris" est dans 3 cellules différentes, je voudrais que les cellules soient sélectionnées à tour de rôle.
C'est là qu'un petit userforme avec deux boutons intervient.
Bouton "Suivant" pour passer à l'occurrence suivante
Bouton "Ok" si l'occurrence trouvée convient. La macro s'arrête et la c ellule reste sélectionnée.

J'espère que c'est plus clair pour toi.

Cordialement

JP
Avatar
Jacquouille
Bonjour

Si c'est pour afficher toutes les cellules contenant le mot "Paris", un
simple filtre suffirait.
Données/Filtrer/filtre automatique/personnalisé/contient "Paris".
On peut même jouer avec un Sous.Total pour compter le nombre de cellules. -)

Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"JP" a écrit dans le message de groupe de discussion :


Non, je ne veux pas afficher le résultat dans un userform. Je veux repérer
sur la même feuille (celle où se fait la recherche) les cellules contenant
le terme de la recherche (Exemple Paris)
Si "Paris" est dans 3 cellules différentes, je voudrais que les cellules
soient sélectionnées à tour de rôle.
C'est là qu'un petit userforme avec deux boutons intervient.
Bouton "Suivant" pour passer à l'occurrence suivante
Bouton "Ok" si l'occurrence trouvée convient. La macro s'arrête et la
cellule reste sélectionnée.

J'espère que c'est plus clair pour toi.

Cordialement

JP
Avatar
MichD
Tout le code suivant dans ton formulaire :

Pour lancer la recherche, tu lies la procédure "Nouvelle_Recherche()"
à un bouton de ton formulaire.

Pour trouver toutes les autres occurrences de l'expression recherchée,
tu lies la procédure "La_Prochaine_Valeur()" à un bouton "Next".


'Déclaration des variables dans le haut du formualaire
Dim LastAdr As String
Dim X As Variant
Dim Debut As String

'-------------------------------------------
Sub Nouvelle_Recherche()

Dim Trouve As Range
Dim Sh As Worksheet, Adr As String

LastAdr = "": X = ""

Worksheets("Feuil1").Activate 'Nom feuille à adapter
X = Application.InputBox(Prompt:="Valeur recherchée.", Type:=3)
If X = False Then Exit Sub

Call Recherche(X)
End Sub

'-------------------------------------------
Sub Touver_La_Prochaine_Valeur()
Call Recherche(X)
End Sub

'-------------------------------------------
Sub Recherche(Expression As Variant)
Dim X As Variant, Trouve As Range

With ActiveSheet.Cells
If LastAdr = "" Then LastAdr = "A1"
Set Trouve = .Find(what:=Expression, After:=.Range(LastAdr),
LookIn:=xlValues, lookat:=xlPart, SearchDirection:=xlNext,
SearchOrder:=xlByColumns)
If Not Trouve Is Nothing Then
If LastAdr = "A1" Then
Debut = Trouve.Address
End If
Trouve.Select
If LastAdr <> "A1" And Debut = Trouve.Address Then
MsgBox "Nous sommes revenus au point de départ."
End If
LastAdr = Trouve.Address

End If
End With
End Sub
'-------------------------------------------




MichD
---------------------------------------------------------------
"JP" a écrit dans le message de groupe de discussion :


Non, je ne veux pas afficher le résultat dans un userform. Je veux repérer
sur la même feuille (celle où se fait la recherche) les cellules contenant
le terme de la recherche (Exemple Paris)
Si "Paris" est dans 3 cellules différentes, je voudrais que les cellules
soient sélectionnées à tour de rôle.
C'est là qu'un petit userforme avec deux boutons intervient.
Bouton "Suivant" pour passer à l'occurrence suivante
Bouton "Ok" si l'occurrence trouvée convient. La macro s'arrête et la
cellule reste sélectionnée.

J'espère que c'est plus clair pour toi.

Cordialement

JP
Avatar
JP
Je regarde cela et te tiens au courant.

Bonjour Jacquouille,

La plage de recherche est une ligne.

Merci à vous

JP
Avatar
MichD
| La plage de recherche est une ligne

Dans cette ligne, il serait mieux d'utiliser XlByRows au lieu de xlByColumns

Set Trouve = .Find(what:=Expression, After:=.Range(LastAdr),
LookIn:=xlValues, lookat:=xlPart, SearchDirection:=xlNext,
SearchOrder:=xlByColumns) <<<<<<==========

MichD
---------------------------------------------------------------
Avatar
JP
Super!
Encore une ou deux questions car la recherche s'effectue sur la ligne C de C3 à DC3.
Dans la partie de code suivant:

Sub Recherche(Expression As Variant)
Dim X As Variant, Trouve As Range
With ActiveSheet.Cells


Est-ce que je peux remplacer ActiveSheet.Cells par Sheets("PFMP").Range("C3 :DC3")

Deuxième question:
Quand la recherche n'aboutit pas, où peut-on mettre un message du genre M sgbox "Aucune occurrence trouvée" ?

merci d'avance

JP
1 2