Liste déroulante selon plusieurs recherches textuelles

Bonjour,

j'ai une liste de produits et jusqu'à présent je sélectionnais les produits en entrant les premiers caractères puis en passant dans une liste déroulante (validation de données). Avec un simple DECALE sur la liste triée.

Il me faut maintenant filtrer sur plusieurs chaînes de caractère du champs ... Par exemple si je veux sélectionner l'un des fauteuils en tissu rouge, je vais taper "faut tiss roug" puis ouvir la list déroulante ..

Comment puis-je faire ça ???

Merci

Benouche

bonjour

de l'abrégé .... faut voir sur piece ; mais cela risque d'etre compliqué ;si il n'y a pas des millions de valeur je pense qu'en decorticant la chaine ( dans des colonne qui seront a masquer) et en parraleelle decortiquer la saisie , disons en 3 criteres typiques (faut tiss rou ) ; je crois qu'un SOMMEPROD (cherche.......) doit pouvoir peter un ou plusieurs n° de ligne

donc à voir ....

cordialement

Bonjour Tulipe,

merci pour la réponse. J'ai environ 4000 enregistrements.

Sinon rien de spécial.

mon fichier en PJ. La colonne 'Intitulé' est celle qui m'interesse dans l'onglet N°2.

J'avais mis en place un filtre (onglet 1) pour sélectionner uniquement les intitulé qui commence par ... 'faut' par exemple.

mais il faudrait pouvoir être plus sélectif en entrant plusieurs bout de chaines de caractères...

Je ne vois pas très bien coment utiliser le sommeprod ... qui semble plutot faire des calculs...

Benouche


le fichier en pèce jointe ... troisième onglet dispo pour demo ..

Bonjour,

En faisant une recherche dans GOOGLE, tu trouveras des exemples de saisie intuitive

excel saisie intuitive combobox

Donne la liste des intitulés qui contiennent les lettres frappées

Dim a()
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect([B11:B30], Target) Is Nothing And Target.Count = 1 Then
    a = Application.Transpose(Sheets("BanqueDeDonnees").Range("liste"))
    Me.ComboBox1.List = a
    Me.ComboBox1.Height = Target.Height + 3
    Me.ComboBox1.Width = Target.Width
    Me.ComboBox1.Top = Target.Top
    Me.ComboBox1.Left = Target.Left
    Me.ComboBox1 = Target
    Me.ComboBox1.Visible = True
    Me.ComboBox1.Activate
    'Me.ComboBox1.DropDown    ' ouverture automatique au clic dans la cellule (optionel)
  Else
    Me.ComboBox1.Visible = False
  End If
End Sub

Private Sub ComboBox1_Change()
 If Me.ComboBox1 <> "" And IsError(Application.Match(Me.ComboBox1, a, 0)) Then
   Me.ComboBox1.List = Filter(a, Me.ComboBox1.Text, True, vbTextCompare)
   Me.ComboBox1.DropDown
 End If
   ActiveCell.Value = Me.ComboBox1
End Sub

Ceuzin

Merci beaucoup Ceuzin, c'est vraiment pas loin de ce que je cherche.

Il manque seulement la recherche de plusieurs chaînes de caractères... mais pour une seule, ça marche parfaitement.

Au niveau ergonomique c'est aussi satisfaisant.

Seulement j'ai un soucis, c'est que je ne vois pas où l'on doit insérer le code et que j'ai peu d'avoir du mal à le modifier.

C'est bien une macros n'est-ce pas ? Mais je ne la vois pas dans Affichage->Macros . Pourriez-vous me guider ?

Merci encore,

Benouche


Merci beaucoup Ceuzin, c'est vraiment pas loin de ce que je cherche.

Il manque seulement la recherche de plusieurs chaînes de caractères... mais pour une seule, ça marche parfaitement.

Au niveau ergonomique c'est aussi satisfaisant.

Seulement j'ai un soucis, c'est que je ne vois pas où l'on doit insérer le code et que j'ai peu d'avoir du mal à le modifier.

C'est bien une macros n'est-ce pas ? Mais je ne la vois pas dans Affichage->Macros . Pourriez-vous me guider ?

Merci encore,

Benouche

Autre version en PJ

Frapper xxx*yyy*zzz

Dim a()
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect([B11:B30], Target) Is Nothing And Target.Count = 1 Then
    a = Application.Transpose(Sheets("BanqueDeDonnees").Range("liste"))
    Me.ComboBox1.List = a
    Me.ComboBox1.Height = Target.Height + 3
    Me.ComboBox1.Width = Target.Width
    Me.ComboBox1.Top = Target.Top
    Me.ComboBox1.Left = Target.Left
    Me.ComboBox1 = Target
    Me.ComboBox1.Visible = True
    Me.ComboBox1.Activate
    'Me.ComboBox1.DropDown    ' ouverture automatique au clic dans la cellule (optionel)
  Else
    Me.ComboBox1.Visible = False
  End If
End Sub

Private Sub ComboBox1_Change()
 If Me.ComboBox1 <> "" And IsError(Application.Match(Me.ComboBox1, a, 0)) Then
   Set d1 = CreateObject("Scripting.Dictionary")
   tmp = "*" & UCase(Me.ComboBox1) & "*"
   For Each c In a
     If UCase(c) Like tmp Then d1(c) = ""
   Next c
   Me.ComboBox1.List = d1.keys
   Me.ComboBox1.DropDown
 End If
   ActiveCell.Value = Me.ComboBox1
End Sub

Ceuzin

c'est assez génial. Je suis en train de continuer à tester ...

Toutefois il y a une chose qui m'embête, c'est que je comprend pas où est la macro et comment je l'insère sur la cellule en question ...

En tout cas un GRAND MERCI !!!

Benouche

On peut frapper plusieurs mots séparés par un espace

bois blanc tiroir

  • Créer un combobox (onglet développeur)
  • Propriété MatchEntry à None
  • Clic droit sur nom onglet Devis
  • Afficher le code
Dim a()
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect([B11:B30], Target) Is Nothing And Target.Count = 1 Then
    a = Application.Transpose(Sheets("BanqueDeDonnees").Range("liste"))
    Me.ComboBox1.List = a
    Me.ComboBox1.Height = Target.Height + 3
    Me.ComboBox1.Width = Target.Width
    Me.ComboBox1.Top = Target.Top
    Me.ComboBox1.Left = Target.Left
    Me.ComboBox1 = Target
    Me.ComboBox1.Visible = True
    Me.ComboBox1.Activate
    'Me.ComboBox1.DropDown   
  Else
    Me.ComboBox1.Visible = False
  End If
End Sub

Private Sub ComboBox1_Change()
 If Me.ComboBox1 <> "" And IsError(Application.Match(Me.ComboBox1, a, 0)) Then
   Set d1 = CreateObject("Scripting.Dictionary")
   clé = UCase("*" & Join(Split(Me.ComboBox1, " "), "*") & "*")
   For Each c In a
     If UCase(c) Like clé Then d1(c) = ""
   Next c
   Me.ComboBox1.List = d1.keys
   Me.ComboBox1.DropDown
 End If
   ActiveCell.Value = Me.ComboBox1
End Sub

Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  Me.ComboBox1.List = a
  Me.ComboBox1.Activate
  Me.ComboBox1.DropDown
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Then ActiveCell.Offset(1).Select
End Sub

Ceuzin

re; bonjour ceuzin

pour le fun ; sur une maquette confectionnée ( ne pas rigoler)

13abrege2.xlsx (10.20 Ko)

cordialement

nb) saisir au moins 3 carracteres de chaque pour efficience ;mais .......

Je relance ce sujet car j'ai un soucis.

J'ai besoin de mettre en place cette solution sur Excel 15.15 sur MAC.

Et là .... arrrrrrg !

Il n'y a pas d'onglet développeur sur cette version d'excel pour Mac ...

Quelqu'un aurait une autre solution ?

Merci

Benoit

Bonsoir,

Sur PC, l'onglet Développeur n'apparait pas par Défaut. Il faut aller dans les options.

Dictionary n'existe pas sur Mac

Version PC & MAC

Dim a(),b()
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect([B6:B25], Target) Is Nothing And Target.Count = 1 Then
    a = Application.Transpose(Sheets("BanqueDeDonnees").Range("liste"))
    Me.ComboBox1.List = a
    Me.ComboBox1.Height = Target.Height + 3
    Me.ComboBox1.Width = Target.Width
    Me.ComboBox1.Top = Target.Top
    Me.ComboBox1.Left = Target.Left
    Me.ComboBox1 = Target
    Me.ComboBox1.Visible = True
    Me.ComboBox1.Activate
  Else
    Me.ComboBox1.Visible = False
  End If
End Sub

Private Sub ComboBox1_Change()
 If Me.ComboBox1 <> "" And IsError(Application.Match(Me.ComboBox1, a, 0)) Then
   ReDim b(1 To UBound(a))
   clé = UCase("*" & Replace(Me.ComboBox1, " ", "*") & "*")
   ligne = 0
   For Each c In a
     If UCase(c) Like clé Then ligne = ligne + 1: b(ligne) = c
   Next c
  If ligne > 0 Then
     ReDim Preserve b(1 To ligne)
     Me.ComboBox1.List = b
     Me.ComboBox1.DropDown
  End If
 End If
   ActiveCell.Value = Me.ComboBox1
End Sub

Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  Me.ComboBox1.List = a
  Me.ComboBox1.Activate
  Me.ComboBox1.DropDown
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Then ActiveCell.Offset(1).Select
End Sub

Ceuzin

Rechercher des sujets similaires à "liste deroulante recherches textuelles"