Tengo una base de datos con 3 columnas, en la primera aparecen proveedores, en la segunda artículos de aseo y en la tercera categoría de aseo. Quiero hacer una macro que tenga 3 combobox, el primero que me muestre todos los proveedores pero que no se repitan, en el segundo quiero que me muestre los artículos de aseo que tiene el proveedor elegido en el combobox 1 y en el tercero quiero que me muestre las categoría que tiene el proveedor elegido en combobox1 y combobox2.
Ejemplo: Columna1 Columna2 Columna3 Proveedor1 Aseo1 Categoría1 Proveedor2 Aseo3 Categoría1 Proveedor3 Aseo1 Categoría2 Proveedor1 Aseo1 Categoría2 Proveedor1 Aseo2 Categoría3 En el combobox1, al hacer click en Proveedor1 quiero que el combobox2 me de sólo las opciones de elegir Aseo1 y Aseo2 y al seleccionar Aseo1 en el combobox2 me de la opción de elegir Categoría1 y Categoría2. La razón por la que quiero esto es que tengo una base de datos gigante que al elegir combinaciones solo me arroje los resultados que corresponde.
Para reproducir tu ejemplo he hecho una hoja con los datos que indicas en las columnas A, B y C. En dicha hoja he insertado un botón y los tres combos. El código asociado es el siguiente. He utilizado una especie de truco de colores para que veas como funciona la cosa. Si no te aclaras dejame una dirección de email y te envío el fichero. Espero te sirva de ayuda. Option Explicit Private Sub ComboBox1_Change() Dim s As String Dim e As Integer Dim i As Integer Dim maxi As Integer Dim maxj As Integer Dim m As Integer 'Para enseñar cambio el color de fuente del elemento elegido en la fila 12 e = ComboBox1.ListIndex 'los listindex empiezan en cero si hay seleccion If e + 1 > 0 Then 'si no el combo no esta cargado y se activo el evento de cambio por el clear Cells(e + 1, 12).Font.ColorIndex = 3 Call Relaciona(ComboBox1.Text, 2, 1, 1, 13) 'Coloreo las parejas Call CargaCom(13, ComboBox2, 3) End If End Sub Private Sub ComboBox2_Change() Dim e As Integer e = ComboBox2.ListIndex '-1 si no es por selección de elemento If e + 1 > 0 Then 'si no el combo no esta cargado y se activó el evento de cambio por el clear Call Relaciona(ComboBox2.Text, 2, 2, 1, 14) 'Coloreo las parejas Call CargaCom(14, ComboBox3, 3) End If End Sub Private Sub CommandButton1_Click() Dim i As Integer Dim maxi As Integer Dim s As String 'pone color negro en la fuente de las columnas de trabajo Columns("L:N").Select Selection.Font.ColorIndex = 1 Range("A1").Select 'borra los combos ComboBox1.Clear ComboBox2.Clear ComboBox3.Clear maxi = Cells(1, 1).End(xlDown).Row Call CopiaDistintos(1, 2, maxi, 12, 1) Call CopiaDistintos(2, 2, maxi, 13, 1) Call CopiaDistintos(3, 2, maxi, 14, 1) 'Carga el primer combo con los valores distintos Call CargaCom(12, ComboBox1, 1) End Sub Function Encuentra(s As String, col As Integer, desde As Integer, hasta As Integer) As Integer 'Indica la fila donde está lo buscado o 0 si no está Dim esta As Boolean Dim i As Integer esta = False i = desde - 1 While Not esta And (i < hasta) i = i + 1 If Cells(i, col).Value = s Then esta = True End If Wend If esta Then Encuentra = i Else Encuentra = 0 End Function Sub CopiaDistintos(colini As Integer, desde As Integer, hasta As Integer, _ colfin As Integer, desdefin As Integer) Dim i As Integer Dim j As Integer j = desdefin For i = desde To hasta If Encuentra(Cells(i, colini).Value, colfin, desdefin, j) = 0 Then 'no esta y lo copio Cells(j, colfin).Value = Cells(i, colini).Value j = j + 1 End If Next i End Sub Sub Relaciona(s As String, fini As Integer, cini As Integer, ffin As Integer, cfin As Integer) 'Marca en rojo los valores de la columa final que tienen pareja en la siguiente a la inicial Dim i As Integer Dim maxi As Integer Dim maxj As Integer Dim m As Integer maxi = Cells(1, cini).End(xlDown).Row maxj = Cells(1, cfin).End(xlDown).Row For i = fini To maxi 'recorro la columna inicial buscando el string If s = Cells(i, cini) Then 'busco su pareja de la siguiente columna en la columna final m = Encuentra(Cells(i, cini + 1).Value, cfin, ffin, maxj) If m > 0 Then 'si existe y lo pongo en rojo Cells(m, cfin).Font.ColorIndex = 3 End If End If Next i End Sub Sub CargaCom(col As Integer, com As ComboBox, color As Integer) 'Carga el combo con los elementos que estén en color indicado de una columa Dim i As Integer Dim maxi As Integer com.Clear maxi = Cells(1, col).End(xlDown).Row For i = 1 To maxi 'cargo el combobox If Cells(i, col).Font.ColorIndex = color Then com.AddItem (Cells(i, col).Value) End If Next i End Sub
Muchas gracias Prozac, por darte el tiempo de responder a esta consulta, te doy mi dirección para que me envíes el fichero ya que las macros que he hecho han sido a puro esfuerzo sin haber estudiado del tema, por eso me cuesta un poco también leer los códigos, necesito el ejemplo para entenderlo mejor. [email protected] Gracias nuevamente.
Ya lo tienes.
Gracias Nuevamente, es de gran ayuda el código que creaste, me estaba cabeciando mucho con el problema, pero gracias a ti, me he ahorrado mucho tiempo, ¿qué puedo hacer por ti?
@puedes enciarme tu archivo de los tres combobox?, mi correo es [email protected], gracias de antemano - Henrry Emerson Obregon Vergaray