Modificación de código para autocompletar combobox

Dante buenas tardes, quisiera hacerle una consulta acerca del siguiente código que es de su autoría y que estoy implementando a mi formulario.

'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

Estoy tratando de modificar el codigo para que por ejemplo busque algo en el combobox2 de mi userform1, despues me salen todas las coincidencias abajo del combobox hasta ahi todo bien pero al presionar la tecla hacia abajo se escoge la primera coincidencia o primer item del  dropdown y las demas coincidencias se desaparecen. Lo que no quiero es que se quiten las demas coincidencias al presionar la tecla hacia abajo.Pero de casuailidad nose como logre arreglar este problema en mi userform3 de mi combobox1, ahi si me funciona lo que estoy tratando de conseguir que es no borrar las demas coincidencias. Quiero implementar lo mismo para el combobox2 de mi userform1

Le anexo el link del archivo. Los userform se encuentran en el libro llamado A.P.U.S

https://1drv.ms/u/s!AjkfMfY_dIaFghlX-ICJ3UzRdMgt 

1 respuesta

Respuesta
1

En el userform3, te falta declarar como global la variable cargando

Lo que tienes en tu userform3 es esto:

    Buscar = ComboBox1.Value
    For x = 0 To ListBox1.ListCount - 1
        If UCase(ListBox1.List(x)) = UCase(Buscar) Then
            ListBox1.ListIndex = x
            Exit Sub
         End If
    Next x
    For x = 0 To ListBox2.ListCount - 1
        If UCase(ListBox2.List(x)) = UCase(Buscar) Then
            ListBox2.ListIndex = x
            Exit Sub
         End If
    Next x
    For x = 0 To ListBox3.ListCount - 1
        If UCase(ListBox3.List(x)) = UCase(Buscar) Then
            ListBox3.ListIndex = x
            Exit Sub
         End If
    Next x
    For x = 0 To ListBox4.ListCount - 1
        If UCase(ListBox4.List(x)) = UCase(Buscar) Then
            ListBox4.ListIndex = x
            Exit Sub
         End If
    Next x

Si lo que tienes en tu combobox1 es igual a algún dato de tus listbox, entonces se sale de la rutina.

Luego más adelante tienes esto:

    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 = Workbooks("fuente de materiales.xlsm").Sheets("CONTENIDO")
    'en la variable col se almacena la letra "A"
    col = "B"
    col2 = "D"
    col3 = "F"
    col4 = "H"
    '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 = 4 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 SinAcento(UCase(h2.Cells(i, col))) Like "*" & SinAcento(UCase(dato)) & "*" Then
            'cargo el nombre que haya coincidido con la condición
            ComboBox1.AddItem h2.Cells(i, col)
        End If
    Next

Pero como el dato del combo fue igual a un dato del listbox, entonces ya no llegó a la parte donde se borra el combobox1 (ComboBox1.Clear) y se vuelve a cargar el combobox1 (ComboBox1.AddItem h2.Cells(i, col)).

Es por eso que en el combo se conservan los datos.


En el Userform1, cambia la propiedad Matchentry del combobox2 a fmMatchentryNone.

Declara la variable cargando como global

Pon el siguiente código en el evento change del combobox2

Private Sub ComboBox2_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 = ComboBox2
    '
    '
    'si el dato del combobox2 es un dato del combo, entonces se sale
    If ComboBox2.ListIndex > -1 Then
        ComboBox2.DropDown
        Exit Sub
    End If
    'borro todo el combo
    ComboBox2.Clear
    'vuelvo a cargar el combo
    For i = 0 To ComboBox1.ListCount - 1
        If UCase(ComboBox1.List(i)) Like UCase(dato) & "*" Then
        ComboBox2.AddItem (ComboBox1.List(i))
        End If
    Next i
'    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
    ComboBox2 = 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
    ComboBox2. SetFocus
    ComboBox2. DropDown
    '
    Application.ScreenUpdating = True
    cargando = False
End Sub

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas