Saisie semi-automatique dans un TextBox

Bonjour,

Me revoilà avec encore un nouveau problème.

J'aimerais cette fois qu'à la création d'un nouveau client, lorsque que je commence à taper le nom de sa ville, le TextBox propose des noms de villes déjà utilisé.

Par exemple si j'ai déjà des clients de Montpellier et de Marseille, lorsque pour un nouveau Client je commence à taper "M" le TextBox propose Marseille et Montpellier. Et lorsque que je tape "a" ce qui donne "Ma", le TextBox propose seulement Marseille.

Je sais que c'est en partie possible avec un ComboBox mais ce dernier ne prend en compte que la première lettre.

De plus je ne veux pas spécialement que l'on puisse consulter toutes les villes en cliquant sur la flèche d'un ComboBox (c'est pourquoi je préfère l'utilisation d'un TextBox).

Merci d'avance à ceux qui se pencheront sur le sujet.

Salut,

voici une solution...

A+

382villes.xlsm (23.58 Ko)

Bonjour,

Faire une recherche Google: recherche intuitive combobox

Dim a()
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect([A2:A16], Target) Is Nothing And Target.Count = 1 Then
    a = Application.Transpose(Sheets("bd").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
  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

Bonjour Curulis57, ceuzin;

Alors pour commencer par Curulis57 :

C'est exactement ce que je recherche au niveau du fonctionnement ! Cependant c'est dans la forme que ça pèche.

L'idéal pour moi serait que l'onglet dans lequel se font les propositions apparaisse au moment où l'on commence à taper des caractères, et pas qu'il soit toujours là. Mais je pense que je vais pouvoir le faire pour l'adapter à ma guise, merci de ton aide.

Ensuite ceuzin :

Il est vrai qu'à la base je ne voulais pas de combobox. Mais je dois avouer que cette méthode est plutôt sympathique. Le seul soucis pour moi c'est que j'aimerais absolument enlever la flèche cliquable propre à un ComboBox, et je ne suis pas sûr que cela soit possible.. Merci tout de même pour cette solution.

En résumé merci à tous les deux pour votre aide.

Je préfère laisser encore un peu en non résolu pour voir si une autre solution est possible.

Sinon ce post passera en résolu maximum lundi.

Encore merci à vous .

Salut Remdu,

L'idéal pour moi serait que l'onglet dans lequel se font les propositions apparaisse au moment où l'on commence à taper des caractères, et pas qu'il soit toujours là.

Comprends pas! Tu peux expliquer?

A+

Re Curulis57,

Je vais être plus précis en utilisant ta pièce jointe pour répondre (je préfère préciser pour que le lecteur comprenne qu'il a besoin de la PJ que tu as fourni pour comprendre)

Ce que j'aimerais faire en faite, c'est que la seule chose visible pour l'utilisateur soit le TextBox TxtVille.

Et lorsque l'utilisateur commence à taper des caractères dans ce TextBox, à ce moment là, IstVille apparait avec des propositions.

Enfin quand on clique sur une des propositions, cette dernière vient remplir le TextBox TxtVille et non pas lblVille.

Salut Remdu,

tu supprimes la Label et tu remplaces le code par celui-ci!

Private Sub lstVille_Click()
'
For x = 0 To Me.lstVille.ListCount - 1
    If Me.lstVille.Selected(x) = True Then
        Application.EnableEvents = False
        Me.TxtVille.Text = Me.lstVille.List(x)
        Me.lstVille.Visible = False
        Application.EnableEvents = True
        Exit For
    End If
Next
'
End Sub

Private Sub txtVille_Change()
'
sFlag = LCase$(Me.TxtVille.Text)
iFlag = Range("A" & Rows.Count).End(xlUp).Row
'
Me.lstVille.Clear
If Me.TxtVille.Text = "" Then
    Me.lstVille.Visible = False
    Exit Sub
End If
iTemp = 0
'
For x = 1 To iFlag
    If LCase$(Left$(Cells(x, 1), Len(sFlag))) = sFlag Then
        sFlag1 = Cells(x, 1)
        Me.lstVille.AddItem sFlag1
        iTemp = 1
    Else
        If iTemp = 1 Then Exit For
    End If
Next
Me.lstVille.Visible = IIf(iTemp = 1, True, False)
'
End Sub

A+

C'est parfaitement ce que je recherchais !

Merci énormément pour ton aide judicieuse en plus d'être précieuse !!

Trop cool !

Problème résolu !

Bonjour,

Dim témoin
Private Sub TextBox1_Change()
 If Not témoin Then
   a = [liste].Value
   Set d1 = CreateObject("Scripting.Dictionary")
   Me.ListBox1.Clear
   If Me.TextBox1 = "" Then
     Me.ListBox1.Visible = False
     [A1] = ""
   Else
     tmp = UCase(Me.TextBox1) & "*"
     For Each c In a
       If UCase(c) Like tmp Then d1(c) = ""
     Next c
     Me.ListBox1.List = d1.keys
     Me.ListBox1.Height = d1.Count * 12
     Me.ListBox1.Visible = True
   End If
  Else
    témoin = False
  End If
End Sub

Private Sub ListBox1_Click()
  [A1] = Me.ListBox1
  Me.ListBox1.Visible = False
  témoin = True
  Me.TextBox1 = ""
End Sub

Ceuzin

327textboxintuitif.zip (29.87 Ko)
Rechercher des sujets similaires à "saisie semi automatique textbox"