Como autocompletar Combobox en vba

Los lectores de este foro

Quisiera que me ayudaran con una duda que tengo con un combobox en vba, lo que quiero es saber como hago para que cuando yo comience a digitar un nombre en un combobox que contiene un listado de nombres de personas este se autocompletara y me mostrara las coincidencias en la medida que valla digitando.

Respuesta
3

Sigue los pasos.

Si el combo está en una hoja:

Pon el siguiente código en los eventos del libro para cargar por primera vez los nombres en el combo

Private Sub Workbook_Open()
'Por.Dante Amor
    Sheets("Factura").Select
    Set h2 = Sheets("hoja2")
    col = "A"
    ActiveSheet.ComboBox1.Clear
    For i = 2 To h2.Range(col & Rows.Count).End(xlUp).Row
        ActiveSheet.ComboBox1.AddItem h2.Cells(i, col)
    Next
End Sub

Cambia "Factura" por el nombre de tu hoja donde está el combo.


Ahora en los eventos de la hoja pon el siguiente código

Dim cargando
Private Sub ComboBox1_Change()
'Por.Dante Amor
    Application.ScreenUpdating = False
    If cargando = True Then Exit Sub
    Set h2 = Sheets("hoja2")
    col = "A"
    cargando = True
    dato = ComboBox1
    ComboBox1.Clear
    For i = 2 To h2.Range(col & Rows.Count).End(xlUp).Row
        If UCase(h2.Cells(i, col)) Like UCase(dato) & "*" Then
            ComboBox1.AddItem h2.Cells(i, col)
            'j = j + 1
        End If
    Next
    ComboBox1 = dato
    '
    'Se activa una celda para que aparezca el combo completo
    Range("Z1000"). Activate
    ComboBox1. Activate
    ComboBox1. DropDown
    '
    Application.ScreenUpdating = True
    cargando = False
End Sub

Tienes que crear una hoja llamada "hoja2" para poner los nombres en la columna A, empezando en la fila 2.

Cambia la propiedad MatchEntry del combo a 2 - frmMatchentryNone


Si el combo lo tienes en un userform, pon el siguiente código en el userform

Dim cargando
'
Private Sub ComboBox1_Change()
'Por.Dante Amor
    Application.ScreenUpdating = False
    If cargando = True Then Exit Sub
    Set h2 = Sheets("hoja2")
    col = "A"
    cargando = True
    dato = ComboBox1
    ComboBox1.Clear
    For i = 2 To h2.Range(col & Rows.Count).End(xlUp).Row
        If UCase(h2.Cells(i, col)) Like UCase(dato) & "*" Then
            ComboBox1.AddItem h2.Cells(i, col)
        End If
    Next
    ComboBox1 = dato
    '
    'Se activa una celda para que aparezca el combo completo
    TextBox1. SetFocus
    ComboBox1. SetFocus
    ComboBox1. DropDown
    '
    Application.ScreenUpdating = True
    cargando = False
End Sub
'
Private Sub UserForm_Activate()
'Por.Dante Amor
    Set h2 = Sheets("hoja2")
    For i = 2 To h2.Range("A" & Rows.Count).End(xlUp).Row
        ComboBox1.AddItem h2.Cells(i, "A")
    Next
End Sub

De igual manera deberás tener una hoja "hoja2", en la columna A poner los nombres.

Cambia la propiedad MatchEntry del combo a 2 - frmMatchentryNone

Agrega un textbox1 a tu formulario, o cambia en la macro Textbox1 por algún textbox que tengas en el formulario.


'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

amigo muchas ¡Gracias! 

el código funciona a la perfección

no quiero ser molesto pero me gustaría saber si depronto tienes tienes la explicación de este código en algún vídeo personal o en algún canal de youtube, es que me gustaría entenderlo mejor pues hay alguna cosas no logro entender bien.

pero vuelvo y digo muchas gracias funciona bien

A propósito el código es el de combobox en userform

No tengo el vídeo, pero con gusto te anexo una explicación:

'Variable global
Dim cargando
'
Private Sub ComboBox1_Change()
'Por.Dante Amor
    Application.ScreenUpdating = False
    'si la variable global está prendida se sale de la rutina
 'para no cargar nuevamente el combo
    If cargando = True Then Exit Sub
    'Establece en el objeto h2 la hoja2
    Set h2 = Sheets("hoja2")
    'en la variable col se almacena la letra "A"
    col = "A"
    'se prende la variable global
    cargando = True
    'como el combo fue modificado, entonces paso el dato que tiene
    'el combo a la variable dato
    dato = ComboBox1
    'borro todo el combo
    ComboBox1.Clear
    'vuelvo a cargar el combo
    For i = 2 To h2.Range(col & Rows.Count).End(xlUp).Row
        'pero solamente voy a cargar en el combo los nombres
        'que empiecen con lo que puse en la variable dato 
        'con like dato & "*" significa que cargue lo que sea
        'que esté después de la variable dato
        If UCase(h2.Cells(i, col)) Like UCase(dato) & "*" Then
            'cargo el nombre que haya coincidido con la condición
            ComboBox1.AddItem h2.Cells(i, col)
        End If
    Next
    'Vuelvo a poner en el combo el valor que tiene la variable dato
 'como borré el combo, ahora tengo que poner el valor que tenía
 'antes de borrarlo, esto hace el efecto como si siempre estuviera
 'ahí el valor capturado
    ComboBox1 = dato
    '
    'Se activa otro control para que aparezca el combo completo
 'se tiene que activar otro control, es un detalle que encontré
 'al realizar este proceso, después de activar otro control, se
 'regresa el foco al combo, con este paso, se puede mostrar todos
 'los datos que coinciden con lo capturado en el combo
    TextBox1. SetFocus
    ComboBox1. SetFocus
    ComboBox1. DropDown
    '
    Application.ScreenUpdating = True
    cargando = False
End Sub
'
Private Sub UserForm_Activate()
'Por.Dante Amor
    Set h2 = Sheets("hoja2")
    'se cargan todos los nombres en el combo.
    For i = 2 To h2.Range("A" & Rows.Count).End(xlUp).Row
        ComboBox1.AddItem h2.Cells(i, "A")
    Next
End Sub

sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas