Completar información mientras escribo en un texbox

Espero me puedan ayudar como puedo hacer en un formulario que mientras escriba en el texbox se me complete la información sin necesidad de escribir todo como una búsqueda inteligente al estilo de GOOGLE algo así, pero sin que se repita los datos como por ejemplo si escribo Te en el lisbox tiene que desplegarse la palabra teclado sola.

2 Respuestas

Respuesta
2

Este el resultado de la macro, la macro lee y filtra lo que pongas en el textbox, luego lo filtra, copia y quita duplicados en la hoja2, lo carga al listbox y luego cuando selecciones del listbox lo pone en el textbox1

y esta es la macro

Private Sub ListBox1_Click()
TextBox1.Text = ListBox1.Value
End Sub
Private Sub TextBox1_Change()
If TextBox1.Text <> Empty Then
Sheets("HOJA2").Cells.Clear
ListBox1.Clear
With Range("B2").CurrentRegion
    .AutoFilter
    .AutoFilter 2, TextBox1.Text & "*"
    .Offset(1).Copy
    With Sheets("HOJA2").Range("B2")
        .PasteSpecial
        .CurrentRegion.RemoveDuplicates Columns:=2
        FILAS = .CurrentRegion.Rows.Count
        MATRIZ = .CurrentRegion.Columns(2)
        If FILAS = 1 Then ListBox1.AddItem MATRIZ
        If FILAS > 1 Then ListBox1.List = MATRIZ
    End With
    .AutoFilter
    End With
End If
End Sub
Respuesta
1

Hay algunas formas interesantes de hacer eso, si te refieres a auto completar que el resto del texto aparece seleccionado como en este vídeo:

Video demo

Entonces usa este código en el modulo del formulario:

Dim SinEventos As Boolean
Dim AutoHalo As Boolean
Private Sub TextBox1_Change()
Dim Nombres As Worksheet: Set Nombres = Sheets("Nombres")
Dim txtAutoCompletado As String
Dim actComienzo As Long
If SinEventos Or AutoHalo Then Exit Sub
With Me.TextBox1
    txtAutoCompletado = Nombres.Range("A1").AutoComplete(.Text)
    If txtAutoCompletado <> vbNullString Then
        actComienzo = .SelStart
        SinEventos = True
            .Text = txtAutoCompletado
            .SelStart = actComienzo
            .SelLength = Len(.Text) - actComienzo
        SinEventos = False
    End If
End With
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    AutoHalo = False
End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    AutoHalo = (KeyCode = vbKeyBack)
End Sub

Fíjate que comienza con dos variables globales, cuando copies y pegues el código asegúrate que esas dos variables están en lo mas arriba del modulo, no puede haber ninguna macro arriba de ellas.

¡Gracias! 

Gracias experto Andy Machin, quedo de maravilla.

Saludos.

Inicialmente te había hecho una parecida a la de James Bond pero luego pensé que no era lo que realmente querías.

Así funciona: video demo

Consiste en un TextBox y un ListBox, lleva un poco más de código. Si lo quieres avísame para pasártelo.

Seria excelente Experto Andy Machin tener ambas lógicas demostradas.

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

Esta excelente experto Andy Machin pero hay un detalle cuando hay por ejemplo 3 registros iguales aparecen todos, por ejemplo si tengo 3 USB, solo debe aparecer 1 en el filtro, algo así experto.

Porque en tu caso, tu realmente necesitas la primera opción que te di. El segundo método es mas para nombres de personas o cosas que tienen un nombre parecido, no igual; no tendría sentido. La segunda opción solo tómala para conocimientos y por si algún día lo necesitas, pero para este proyecto deberías usar el primer método que te di en mi primera respuesta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas