Usando el Evento _Change ...
Tendrias que usar el evento _Change del TextBox para validar lo que se lleva tecleado y buscar en alguna lista donde tendras guardados los nombres posibles...
En este ejemplo se usa una matriz de nombres misma que se traslada a un ListBox para su uso como base en el evento _Change... La lista es muy corta pero sirve perfectamente para el ejemplo...
Para probar el codigo, pon un TextBox (Text1) y un ListBox (List1) en una forma, pega el codigo, y ejecutalo ...
Varia la propiedad .Sorted del ListBox de False a True y vuelve a probar (no se puede cambiar esta propiedad desde codigo) ...
'''''''''''''''''''''''''''''
Dim aNombres(22) As String
Dim lAutoChange As Boolean
Private Sub Form_Load()
Dim nPos As Integer
aNombres(0) = "Abdul"
aNombres(1) = "Abigail"
aNombres(2) = "Adan"
aNombres(3) = "Alberto"
aNombres(4) = "Carla"
aNombres(5) = "Danitza"
aNombres(6) = "Eloisa"
aNombres(7) = "Eloy"
aNombres(8) = "Fernando"
aNombres(9) = "Francisco"
aNombres(10) = "Juana"
aNombres(11) = "Judea"
aNombres(12) = "Julio"
aNombres(13) = "Agustin"
aNombres(14) = "Mexico"
aNombres(15) = "España"
aNombres(16) = "Panamá"
aNombres(17) = "Canada"
aNombres(18) = "Costa Rica"
aNombres(19) = "Inglaterra"
aNombres(20) = "Argentina"
aNombres(21) = "Arabia"
' Cargamos el ListBox con los elementos disponibles ...
' En este caso, desde la matriz de ejemplo ...
' La propiedad .SORTED del listbox puede estar activada
' o no estarlo... Si esta activada, el recorrido buscando
' coincidencias con lo tecleado en el textbox sera "mas corto"
Me.List1.Clear
For nPos = 0 To 21
Me.List1.AddItem aNombres(nPos)
Next
lAutoChange = False
End Sub
Private Sub Text1_Change()
Dim nPos As Integer
Dim nSavePos As Integer
' Si el evento _Change lo provoca nuestro codigo al alterar
' el contenido del textbox, entonces salimos sin hacer mas...
' (Evitamos que se genere este evento en cascada) ..
If lAutoChange Then
Exit Sub
End If
' OJO: Encendemos la bandera para en caso de que cambiemos el
' contenido del textbox desde este codigo, no se provoque este evento en cascada
lAutoChange = True
' Salvamos la posicion del cursor dentro del textbox
nSavePos = Me.Text1.SelStart
For nPos = 0 To Me.List1.ListCount - 1
' Si encontramos coincidencia con lo que se lleva tecleado
' actualizamos el textbox con lo encontrado,
' restablecemos la posicion del cursor en el textbox,
' sincronizamos el ListBox con lo encontrado ...
' y salimos del FOR ...
If UCase(Left(Me.Text1.Text, Me.Text1.SelStart)) = UCase(Left(Me.List1.List(nPos), Me.Text1.SelStart)) Then
Me.Text1.Text = Me.List1.List(nPos)
Me.Text1.SelStart = nSavePos
Me.List1.ListIndex = nPos
Exit For
End If
' Si la lista esta sorteada y ya se rebaso el orden
' alfabetico, salimos del FOR sin alterar nada ...
If Me.List1.Sorted = True Then
If UCase(Left(Me.List1.List(nPos), Me.Text1.SelStart)) > UCase(Left(Me.Text1.Text, Me.Text1.SelStart)) Then
Exit For
End If
End If
Next
' Apagamos la bandera para saber que la proxima vez que se
' ejecute este evento es por causa del usuario tecleando
' en el textbox
lAutoChange = False
End Sub
''''''''''''''''''''''