Debes poner un ListBox debajo del TextBox y darle la apariencia que tu quieras con las propiedads (queda mejor sin bordes y con un color diferente) Tambien es importante que pongas la propiedad .Visible a False para que no se vea
En el modulo del formulario van estos códigos que hacen la magia:
Private Sub ListBox1_Click()
With Me
If .ListBox1.ListIndex >= 0 Then _
.TextBox1.Text = .ListBox1.List(.ListBox1.ListIndex)
End With
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Long
Dim strNombre As String
If ListBox1.ListIndex <> -1 Then
For i = 0 To ListBox1.ColumnCount - 1
strNombre = ListBox1.Column(i)
Next i
End If
Me.TextBox1.Value = strNombre
With Me
.ListBox1.Clear
.ListBox1.Visible = False
End With
End Sub
Private Sub ListBox1_Enter()
Me.ListBox1.Selected(0) = True
End Sub
Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
With Me
.ListBox1.Clear
.ListBox1.Visible = False
End With
End If
End Sub
Private Sub TextBox1_Change()
If Me.ActiveControl.Name = "TextBox1" Then
Call filterByNombres
End If
End Sub
Y yo puse en un modulo aparte este código que hace el filtrado:
Sub filterByNombres()
Dim i As Integer
Dim Nombres As Worksheet: Set Nombres = Sheets("Nombres")
Dim uF As Integer
Dim fndNombre As String
uF = Nombres.Range("A" & Rows.Count).End(xlUp).Row
If Trim(UserForm1.TextBox1.Value) = "" Then
UserForm1.ListBox1.Visible = False
UserForm1.ListBox1.Clear
Exit Sub
End If
UserForm1.ListBox1.Clear
For i = 1 To uF
fndNombre = Nombres.Cells(i, 1).Value
If UCase(fndNombre) Like UCase(UserForm1.TextBox1.Value) & "*" Then
UserForm1.ListBox1.Visible = True
UserForm1.ListBox1.AddItem Nombres.Cells(i, 1).Text
End If
Next i
End Sub
Si tienes mas controles en el formulario, el TabIndex del ListBox debe ser el que continua del TextBox. Cuando aparecen los resultados, puede moverte por ellos con las "flechitas" del teclado. También con el Mouse, dando doble click hace la selección.
Andy