Créer un champ de recherche

Bonjour,

je cherche à créer un champ de recherche qui affiche instantanément les résultats de la recherche à chaque caractère que je tape à l'intérieur.

Les résultats de la recherche se trouvent sous un autre onglet: c'est l'onglet 'Nomenclature'.

La recherche doit se faire sur la colonne E: 'Libellé'.

Le champ de recherche doit retourner tous les libellés (sous forme de liste) contenant le caractère ou le mot indiqué dans la barre de recherche.

Aussi, dans une colonne à côté, je souhaiterais que s'affiche automatiquement la catégorie, le secteur et l'éligibilité du libellé correspondant pour chaque résultat de la recherche.

Je vous met en pièce jointe une version simplifiée de mon document afin que vous puissiez comprendre le fonctionnement de celui-ci.

Note: j'ai essayé tout d'abord de créer un TextBox sous Excel pour la barre de recherche que je souhaite créer mais je n'ai pas ces fonctionnalités sur mon Excel (Excel 2016 sur Mac).

Je vous remercie pour votre aide!

Bonjour Julia et bienvenue sur ce Forum,

Passer par une ListBox me semblerait être une meilleur idée (surtout si tu veux que la liste se fasse à chaque saisie de caractère)

M'enfin! Tu trouveras ci-joint ton fichier modifié.

Je te laisse tester et revenir vers nous

22pour-julia.xlsm (24.63 Ko)

Merci beaucoup 'Juice', le code fonctionne très bien!

As-tu donc utiliser ListBox? Je crois que ma version d'Excel ne me permet pas de ListBox dans mes fonctionnalités, est-ce possible?

Aussi, si ce n'est pas trop demandé, pourrais tu m'expliquer comment fonctionne ton code (étape par étape), par exemple, je ne comprend pas bien cette ligne dans la macro:

If Range("D" & Rows.Count).End(xlUp).Row > 1

Merci encore

Aussi, est-ce possible d'intégrer dans le code un MessageBox - MsgBox 'Mot introuvable dans la liste' - si le mot indiqué dans la barre de recherche est introuvable?

Merci d'avance

Alors finalement je me heurte à un problème comme j'ai voulu intégrer le code dans mon document de base où le champ de recherche doit s'appliquer et cela ne fonctionne pas.

Quelles parties du code est-ce que je dois modifier si je veux déplacer le code dans un autre fichier?

Quelles variables changer au niveau des colonnes, cellules, nom de plages etc?

Merci d'avance

Bonjour juliak

Bonjour Juice

Une autre formule

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A2")) Is Nothing Then Exit Sub
    Sheets("Nomenclature").Range("Tableau1[#All]").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range("A4:A5"), _
        CopyToRange:=Range("A10:D10"), _
        Unique:=False
End Sub

Bonsoir,

Recherche intuitive multi-mots multi-colonnes.

Les colonnes de recherche peuvent être définies.

Boisgontier

Autre méthode avec le filtre élaboré et un menu déroulant des mots clés (G2).

Boisgontier

Re- Julia,

Salut Steelson,

Enchantée Boisgontierjacques!

As-tu donc utiliser ListBox?

Alors non, j'ai utilisé une Boucle pour rechercher les résultats dans ta feuille "Nomenclature" et les afficher sur la feuille recherche.

Une ListBox est utilisé via un UserForm, et un UserForm est une fenêtre que tu créé toi même.

Un exemple de ListBox :

capture

Je crois que ma version d'Excel ne me permet pas de ListBox dans mes fonctionnalités, est-ce possible?

Vous pouvez sur Excel-MAC créer des UserForms, mais je ne sais pas comment :p

Aussi, si ce n'est pas trop demandé, pourrais tu m'expliquer comment fonctionne ton code (étape par étape)

C'est parti!

If Not Application.Intersect(Target, Range("B2")) Is Nothing Then

Si ce n'est pas une autre procédure / macro qui modifie ma cellule B2, alors je lance ma recherche

If Range("D" & Rows.Count).End(xlUp).Row > 1 Then Range("D2:G" & Range("D" & Rows.Count).End(xlUp).Row).ClearContents

Si le nbr de ligne est supérieur à 1 (si il n'y a pas que l'en-tête de colonne), alors on remet à blanc avant de faire la nouvelle recherche

Range("D" & Rows.Count).End(xlUp).Row --> Compte le nbr de ligne de la colonne D

If Cells(2, 2) = "" Then
        If Range("D" & Rows.Count).End(xlUp).Row > 1 Then Range("D2:G" & Range("D" & Rows.Count).End(xlUp).Row).ClearContents
        Exit Sub
    End If

Si la cellule B2 est vide, ou si l'utilisateur à supprimer son contenu, alors on remet à blanc

    For x = 2 To Sheets(2).Range("A" & Rows.Count).End(xlUp).Row
        If InStr(1, UCase(Sheets(2).Cells(x, 4)), UCase(Cells(2, 2))) >= 1 Then
            y = Range("E" & Rows.Count).End(xlUp).Row + 1
            Cells(y, 4) = Sheets(2).Cells(x, 4)
            Cells(y, 5) = Sheets(2).Cells(x, 3)
            Cells(y, 6) = Sheets(2).Cells(x, 2)
            Cells(y, 7) = Sheets(2).Cells(x, 1)
        End If
    Next

En partant de x = 2, on veut aller jusqu'à x = 'nbr ligne de la colonne A de la Feuille 2'

Pour chaque x, nous recherchons dans la ligne n°x et la colonne 4, si il n'y a pas un texte semblable à ma cellule B2

Si c'est le cas, alors on extrait la ligne pour la mettre dans notre feuille Recherche

Columns("D:G").EntireColumn.AutoFit
Columns("D:G").WrapText = False

Simple remise en forme

Voilà, si tu a d'autre question n'hésite pas ;D

Aussi, est-ce possible d'intégrer dans le code un MessageBox - MsgBox 'Mot introuvable dans la liste' - si le mot indiqué dans la barre de recherche est introuvable?

Oui c'est possible (et même simple) mais avant sa, il semblerait que tu ai du mal à intégrer le code à ton propre fichier :

Alors finalement je me heurte à un problème comme j'ai voulu intégrer le code dans mon document de base où le champ de recherche doit s'appliquer et cela ne fonctionne pas.

Quelles parties du code est-ce que je dois modifier si je veux déplacer le code dans un autre fichier?

Quelles variables changer au niveau des colonnes, cellules, nom de plages etc?

Merci d'avance

Est-ce que tu a un message d'erreur lorsque tu exécute le code ? Si oui lequel ?

Sinon c'est que tu a bien des références ayant changées entre ton fichier exemple et ton fichier original, et dans ce cas, il faut vérifier les réf une par une

Restant à ta dispo

Bonjour,

tout d'abord merci à 'Steelson' et 'Boisgontierjacques' pour vos réponses!

Et merci beaucoup 'Juice' pour cette réponse très détaillée!

Pour répondre à tes questions:

Est-ce que tu a un message d'erreur lorsque tu exécute le code ? Si oui lequel ?

non il ne s'affiche pas de message d'erreur, seulement la macro ne s'applique pas à mon fichier original car je n'ai pas modifié les références correctement je crois. Je vais essayer, avec tes explications fournis, de changer les références et faire marcher la macro, je reviens vers vous si jamais cela ne fonctionne pas

Merci encore

Alors j'ai essayé de changer les références sachant que les seules différences de mon fichier original sont les suivantes:

  • ma cellule où indiquer la recherche de mot clé est en F7 et non en B2.
  • mon second onglet avec les données Libellés, Catégorie, Eligibilité etc. se présente de la manière suivante:
1ere colonne: nouveauté ou non (information dont je n'ai pas besoin)

2eme colonne: eligibilité

3eme colonne: secteur

4eme colonne: catégorie

5eme colonne: Libellé

Et la liste s'étend jusqu'à la ligne 371.

J'ai donc essayé de changer les références mais le code ne fonctionne pas:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim x As Long

If Not Application.Intersect(Target, Range("F7")) Is Nothing Then

If Range("E" & Rows.Count).End(xlUp).Row > 1 Then Range("D2:G" & Range("E" & Rows.Count).End(xlUp).Row).ClearContents

If Cells(2, 2) = "" Then

If Range("E" & Rows.Count).End(xlUp).Row > 1 Then Range("D2:G" & Range("E" & Rows.Count).End(xlUp).Row).ClearContents

Exit Sub

End If

For x = 2 To Sheets(2).Range("B" & Rows.Count).End(xlUp).Row

If InStr(1, UCase(Sheets(2).Cells(x, 5)), UCase(Cells(2, 2))) >= 1 Then

y = Range("E" & Rows.Count).End(xlUp).Row + 1

Cells(y, 5) = Sheets(2).Cells(x, 5)

Cells(y, 6) = Sheets(2).Cells(x, 4)

Cells(y, 7) = Sheets(2).Cells(x, 3)

Cells(y, 8) = Sheets(2).Cells(x, 2)

End If

Next

Columns("D:G").EntireColumn.AutoFit

Columns("D:G").WrapText = False

End If

End Sub

capture d ecran 2018 12 19 a 11 19 01 capture d ecran 2018 12 19 a 11 19 01 capture d ecran 2018 12 19 a 11 19 01

Re- Julia,

Ton code modifié :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As Long
If Not Application.Intersect(Target, Range("F7")) Is Nothing Then
If Range("E" & Rows.Count).End(xlUp).Row > 1 Then Range("D2:G" & Range("E" & Rows.Count).End(xlUp).Row).ClearContents
If Cells(7, 6) = "" Then
    If Range("E" & Rows.Count).End(xlUp).Row > 1 Then Range("D2:G" & Range("E" & Rows.Count).End(xlUp).Row).ClearContents
    Exit Sub
End If
For x = 2 To Sheets(2).Range("B" & Rows.Count).End(xlUp).Row
If InStr(1, UCase(Sheets(2).Cells(x, 5)), UCase(Cells(7, 6))) >= 1 Then
    y = Range("E" & Rows.Count).End(xlUp).Row + 1
    Cells(y, 5) = Sheets(2).Cells(x, 4)
    Cells(y, 6) = Sheets(2).Cells(x, 3)
    Cells(y, 7) = Sheets(2).Cells(x, 2)
    Cells(y, 4) = Sheets(2).Cells(x, 5)
End If
Next
Columns("D:G").EntireColumn.AutoFit
Columns("D:G").WrapText = False
End If
End Sub

A savoir que :

Cells(x,y) donne la référence à une cellule de ligne x et de colonne y

Donc par exemple, la Cells(2,2) fais référence à la cellule ligne 2 colonne 2 soit B2

Pour faire correctement référence à ta cellule F7 où est inséré le mot clef pour la recherche, alors tu dois indiquer la Cells(7,6) -> Ligne 7 Colonne 6

Restant à ta dispo

Essaie la macro que je t'ai proposée ... elle fait 2 lignes !!

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A2")) Is Nothing Then Exit Sub
    Sheets("Nomenclature").Range("Tableau1[#All]").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("A4:A5"), CopyToRange:=Range("A10:D10"), Unique:=False
End Sub

Mais bravo à Juice pour sa belle proposition !

Merci beaucoup pour vos retours!

Merci 'Juice' le code que vous m'avez envoyé colle parfaitement et je comprend mieux le fonctionnement de celui-ci et je saurais l'adapter dans le futur grâce à tes explications!

Néanmoins, j'ai une petite question: comment faire en sorte que les colonnes où s'indiquent les résultats de la recherche (Libellé, Secteur etc.) restent de la même taille car dès que je rentre un nouveau mot ou alors quand ma cellule de recherche est vide, mes colonnes deviennent plus petite.

Merci 'Steelson' également pour ton code qui fonctionne très bien!

Les deux codes correspondent tout à fait à ce que je voulais, votre aide est très apprécié, je garderais les deux codes à disposition!

Reeeee~

Essaie la macro que je t'ai proposée ... elle fait 2 lignes !!

Code : Tout sélectionner

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A2")) Is Nothing Then Exit Sub

Sheets("Nomenclature").Range("Tableau1[#All]").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("A4:A5"), CopyToRange:=Range("A10:D10"), Unique:=False

End Sub

Mais bravo à Juice pour sa belle proposition !

Encore une fois tu résume en trois mots ce que je fais en trente xDDD

Néanmoins, j'ai une petite question: comment faire en sorte que les colonnes où s'indiquent les résultats de la recherche (Libellé, Secteur etc.) restent de la même taille car dès que je rentre un nouveau mot ou alors quand ma cellule de recherche est vide, mes colonnes deviennent plus petite.

C'est la ligne de code [...]

Columns("D:G").EntireColumn.AutoFit

[...] qui étire la taille de tes colonnes.

Tu peux la supprimer pour que la taille reste fixe

Merci beaucoup!

Rechercher des sujets similaires à "creer champ recherche"