Macro para 3 Combobox

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.

1 respuesta

Respuesta
1
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?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas