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.
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