Filtro en Combobox dentro de UserForm en excel

La idea es cargar el segundo Combobox solo los datos que coincidan con los introducidos en el primero. Ejemplo:

    A                                                   B

CATEGORIA 1                     SUBCATEGORIA1

                                              SUBCATEGORIA2

                                               SUBCATEGORIA3

CATEGORIA 2                     SUBCATEGORIA1

                                              SUBCATEGORIA2

                                               SUBCATEGORIA3

CATEGORIA 3                     SUBCATEGORIA1

                                              SUBCATEGORIA2

                                               SUBCATEGORIA3

Al ingresar en el ComboBox1 Categoria1 se carguen en el ComboBox2 los datos correspondientes a lo introducido en el ComboBox1.

1 Respuesta

Respuesta
1

¿Pero en la columna A tienes celdas vacías?

Te recomiendo que siempre pongas la categoría a la que pertenece cada subcategroría, de esta forma:

Categoría 1 Subcategoria1

Categoría 1 Subcategoria2

Categoría 1 Subcategoria3

Categoría 2 Subcategoria1

Categoría 2 Subcategoria2

Categoría 2 Subcategoria3

Categoría 3 Subcategoria1

Dime si puedes preparar tus datos como mi ejemplo para prepararte la macro.

Buenas Experto

Gracias por la ayuda de antemano. 

No hay ningún problema, prepararé mi base de datos siguiendo su ejemplo.

Saludos cordiales

Blás

Pon lo siguiente en tu formulario para cargar el combo1 y el combo2. Cambia el nombre de la hoja "Hoja1" por el nombre de tu hoja donde tienes tus datos.

La macro empieza a cargar los datos desde la fila 2, asumiendo que en la fila 1 tienes un encabezado.

Private Sub ComboBox1_Change()
'Por.Dante Amor
    'Cuando seleccionas un dato del combo1 se carga el combo2
    ComboBox2.Clear
    If ComboBox1.ListIndex = -1 Or ComboBox1.Value = "" Then Exit Sub
    '
    Set h1 = Sheets("Hoja1")
    For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
        If h1.Cells(i, "A") = ComboBox1.Value Then
            ComboBox2.AddItem h1.Cells(i, "B")
        End If
    Next
End Sub
'
Private Sub UserForm_Activate()
'Por.Dante Amor
    'Carga el combo1
    Set h1 = Sheets("Hoja1")
    For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
        agregar ComboBox1, Cells(i, "A").Value
    Next
End Sub
'
Sub agregar(combo As ComboBox, dato As String)
'Por.Dante Amor
    For i = 0 To combo.ListCount - 1
        Select Case StrComp(combo.List(i), dato, vbTextCompare)
            Case 0: Exit Sub 'ya existe en el combo y ya no lo agrega
            Case 1: combo.AddItem dato, i: Exit Sub 'Es menor, lo agrega antes del comparado
        End Select
    Next
    combo.AddItem dato 'Es mayor lo agrega al final
End Sub
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Estimado experto:

El código funciona, pero al seleccionar algunos temas, no coinciden con los sub-temas. De nuevo gracias por tu ayuda.

 Saludos cordiales

Blás

Es muy simple, solamente pon los datos como se muestran en la siguiente imagen.

Pon tus datos de esa manera, si no te funciona tengo que revisar cómo pusiste los datos, puedes poner una imagen de la hoja con tus datos. Procura que en la imagen se vean las filas y las columnas. Si ya te funciona, recuerda valorar la respuesta.

Estimado experto:

Sigo trabado en el mismo problema, esta es la disposición de la base de datos:

Y el diseño del UserForm es el siguente:

Una vez seleccionado el código del tema (cbm_CT)se carga su descripción (cbm_TE), sus respectivos códigos de sub-temas (cbm_CS) y al seleccionar uno se carga su descripción (cbm_SU).Pero no coinciden.

Gracias por tú ayuda

Saludos cordiales

Blás

El código que te envié es para que funcione si tienes el código en la columna A y el subcódigo en la columna B. Pero en tu imagen tienes los datos en otras columnas. Te anexo la macro actualizada para cargar las columnas G e I

Private Sub ComboBox1_Change()
'Por.Dante Amor
    'Cuando seleccionas un dato del combo1 se carga el combo2
    ComboBox2.Clear
    If ComboBox1.ListIndex = -1 Or ComboBox1.Value = "" Then Exit Sub
    '
    Set h1 = Sheets("CONFIGURATIONS")
    For i = 2 To h1.Range("G" & Rows.Count).End(xlUp).Row
        If h1.Cells(i, "G") = ComboBox1.Value Then
            ComboBox2.AddItem h1.Cells(i, "I")
        End If
    Next
End Sub
'
Private Sub UserForm_Activate()
'Por.Dante Amor
    'Carga el combo1
    Set h1 = Sheets("CONFIGURATIONS")
    For i = 5 To h1.Range("G" & Rows.Count).End(xlUp).Row
        agregar ComboBox1, h1.Cells(i, "G").Value
    Next
End Sub
'
Sub agregar(combo As ComboBox, dato As String)
'Por.Dante Amor
    For i = 0 To combo.ListCount - 1
        Select Case StrComp(combo.List(i), dato, vbTextCompare)
            Case 0: Exit Sub 'ya existe en el combo y ya no lo agrega
            Case 1: combo.AddItem dato, i: Exit Sub 'Es menor, lo agrega antes del comparado
        End Select
    Next
    combo.AddItem dato 'Es mayor lo agrega al final
End Sub


Lo de las descripciones de los códigos, columnas H y J no lo mencionaste en la pregunta original. Y no sé cuál sea tu idea. Si gustas también te ayudo con esa parte pero tendrás que valorar esta respuesta y crear una nueva pregunta, ahí me describes cuál es tu idea, es decir, quieres cargas los subtemas, ¿ya sea que selecciones el tema por código de tema o por tema?

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

¡Gracias Dante!

El código funciona muy bien. Gracias a tu ayuda voy superando las dificultades en mi proyecto. Tu aporte es invaluable.

Saludos cordiales

Blás

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas