Como aplicar vombobox de 3 Filtros

Necesito ayuda urgente para solucionar el siguiente problema:

Tengo en una Hoja que se llama DATOS, los siguientes Datos:

Columna D: Material, Columna E: Tallas, Columna F: Color

Además tengo un formulario ya creado el cual lo despliego con un boton y éste contiene 3 combobox:

En el combobox 1 Selecciono el Material, En el combobox2 Selecciono la talla correspondiente al material pero al seleccionar el combobox3 me arroja opciones para todas las tallas seleccionadas en e combobox2 así no correspondan al material indicado en el combobox1. Es decir por ejemplo: Hay un material 522030 que tiene tallas: 2,4,6,8,10,12 y este sus colores y así diferentes materiales que tienen las mismas tallas pero diferentes Colores.

Mi problema es que en el combobox1 digito 522030, selecciono talla 10 y me aparecen todos los colores que no corresponden al indicado 522030 en combobox1.

Necesito que me indique solo los colores para ese material y esa talla en específico que pueden ser solo 2 Colores o tres y a veces solo 1 no todos.

Espero me haya explicado bien y de verdad agradeceré la ayuda que me puedan brindar.

2 respuestas

Respuesta
2

¿Algo así es lo que buscas?, esta macro funciona así, filtra el material duplicado y carga materiales únicos en el combobox1, luego carga las tallas mediante un array y para ahorrar código de programación crea una columna auxiliar que se borra cuando cierras el formulario concatenando material y color, en cuanto seleccionas material y color en los 2 primero comboboxs estos son buscados en la 4 columna y llevados al 3er combobox para esto uso 2 funciones Match y contar las cuales definen los parámetros para filtrar solo esos colores para ese material y esa talla en especifico.

y esta es la macro

Private Sub ComboBox2_Change()
Set materiales = Range("MATERIALES")
MATERIAL = ComboBox1.Value
INDICE = ComboBox1.ListIndex
XColor = ComboBox2.Value
If INDICE < 0 Then MsgBox ("SELECCIONA UN MATERIAL PRIMERO"), vbInformation, "AVISO": GoTo SAL
CADENA = MATERIAL & " " & XColor
CUENTA = WorksheetFunction.CountIf(materiales.Columns(4), CADENA)
FILA = WorksheetFunction.Match(CADENA, materiales.Columns(4), 0)
ComboBox3.Clear
MATRIZ = materiales.Cells(FILA, 3).Resize(CUENTA, 1)
ComboBox3.List = MATRIZ
SAL:
Set materiales = Nothing
End Sub
Private Sub UserForm_Initialize()
Dim UNICOS As New Collection
Set datos = Range("d1").CurrentRegion
With datos
    .Sort _
    KEY1:=Range(.Columns(1).Address), ORDER1:=xlAscending, _
    KEY2:=Range(.Columns(2).Address), ORDER2:=xlAscending, _
    KEY3:=Range(.Columns(3).Address), ORDER3:=xlAscending, _
    Header:=xlYes
    F = .Rows.Count
    For I = 2 To F
        MATERIAL = .Cells(I, 1)
        TALLA = .Cells(I, 2)
        .Cells(I, 4) = MATERIAL & " " & TALLA
        On Error Resume Next
            UNICOS.Add MATERIAL, CStr(MATERIAL)
            If Err.Number = 0 Then ComboBox1.AddItem MATERIAL
        On Error GoTo 0
    Next I
    datos.Name = "MATERIALES"
    ComboBox2.List = Array(2, 4, 6, 8, 10, 12)
End With
Set datos = Nothing: Set UNICOS = Nothing
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Range("A1").CurrentRegion.Columns(4).Clear
End Sub

¡Gracias!

Excelente maestro, es exactamente lo que estaba buscando.

Saludos.

Amigo, de este código que me facilitaste me encontré con un pequeño problema en la siguiente línea:

ComboBox2.List = Array(2, 4, 6, 8, 10, 12, 14, 16, 18, 30, 32, 34, 36, 38, 40, 42)

Las tallas también hay de textos pero no me permite ingresarlas: ES, M, L, XL, XS

Podrías ayudarme por favor si no es mucho pedir.

Saludos.

Más bien amigo las preguntas serían como hacer que el combobox2 permita escribir para buscar justo como lo hace el combobox1 y que no de ningún error a la hora de borrar los datos del combobox2 y que uno pueda reeescribir los datos de las tallas por ejemplo:

1) Busco una referencia escribiendo los primeros números, aparece y la selecciono, (hasta ahí va todo bien.

2) al momento de buscar una talla escribiendo me da un error  y tengo que cerrar forzosamente.

3) si paso de escoger la talla con el mouse me salen bien los datos en el combobox3 .

4) Después de encontrar mis datos, ejecuto la función del formulario y requiero  que esa función me borre los datos de los combobox, pero al hacerlo vuelvo al problema del paso 2, al modificar o borrar los datos del combobox2 da un error y no puedo seguir y debo cerrar forzosamente

De verdad, te agradecería mucho si me ayudas.

El problema es que quieres mezclar números con letras y eso en un array no se puede, se requiere un cambio en la programación como el siguiente, en la imagen puedes ver losresultados de la macro solo que ahora ya la macro sabe diferenciar texto de números para las tallas

y esta es la macro modificada

Private Sub ComboBox1_Change()
Dim UNICOS As New Collection
Set MATERIALES = Range("MATERIALES")
MATERIAL = Val(ComboBox1.Value)
ComboBox2.Clear
ComboBox3.Clear
With MATERIALES
    CUENTA = WorksheetFunction.CountIf(.Columns(1), MATERIAL)
    FILA = WorksheetFunction.Match(MATERIAL, .Columns(1), 0)
    Set TALLAS = .Rows(FILA).Resize(CUENTA)
    TALLAS.Select
    For I = 1 To CUENTA
        talla = TALLAS.Cells(I, 2)
        On Error Resume Next
            UNICOS.Add talla, CStr(talla)
            If Err.Number = 0 Then ComboBox2.AddItem talla
        On Error GoTo 0
    Next I
    TALLAS.Name = "TALLAS"
End With
Set MATERIALES = Nothing: Set TALLAS = Nothing
End Sub
Private Sub ComboBox2_Change()
Dim UNICOS As New Collection
Set TALLAS = Range("TALLAS")
talla = ComboBox2.Value
If talla = Empty Then GoTo SIG:
If IsNumeric(talla) Then talla = Val(talla)
ComboBox3.Clear
With TALLAS
    CUENTA = WorksheetFunction.CountIf(.Columns(2), talla)
    FILA = WorksheetFunction.Match(talla, .Columns(2), 0)
    .Cells(FILA, 3).Resize(CUENTA, 1).Select
    If CUENTA = 1 Then
        ComboBox3.AddItem .Cells(FILA, 3).Resize(CUENTA, 1).Value
Else
    matriz = .Cells(FILA, 3).Resize(CUENTA, 1)
    ComboBox3.List = matriz
End If
End With
Erase matriz
Set talla = Nothing: Set UNICOS = Nothing
SIG:
End Sub
Private Sub UserForm_Activate()
With UserForm1
    .Caption = " "
    .Move 150, 15
End With
End Sub
Private Sub UserForm_Initialize()
Dim UNICOS As New Collection
Set datos = Range("d1").CurrentRegion
With datos
    .Sort _
    KEY1:=Range(.Columns(1).Address), ORDER1:=xlAscending, _
    KEY2:=Range(.Columns(2).Address), ORDER2:=xlAscending, _
    KEY3:=Range(.Columns(3).Address), ORDER3:=xlAscending, _
    Header:=xlYes
    F = .Rows.Count
    For I = 2 To F
        MATERIAL = .Cells(I, 1)
           On Error Resume Next
            UNICOS.Add MATERIAL, CStr(MATERIAL)
            If Err.Number = 0 Then ComboBox1.AddItem MATERIAL
        On Error GoTo 0
    Next I
    datos.Name = "MATERIALES"
End With
Set datos = Nothing: Set UNICOS = Nothing
End Sub
Respuesta
1

Desde mi blog busca la entrada de Junio:

https://elsamatilde.blogspot.com/2018/06/listas-dependientes.html 

Desde allí también tendrás acceso al video con los ejemplos. Si bien los ejemplos trabajan con 2 controles bien te servirá adaptarlos para un 3er combobox.

Sdos.

Elsa

*Cyber-mes en manuales Excel

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas