Lista dinámica de un combobox para almacen

Buenos días, pues con la novedad de que estoy programando una MACRO para llevar el control de un almacen, ahorita estoy diseñando un UserForm, el cual tiene dentro una "Página múltiple", esta a su vez esta compuesta por separadores, cada separador lo tengo especificado por alguna "FAMILIA" de materiales, el primer separador es ACEROS, el segundo es ADITIVOS, etc, cada separador tiene un "combobox", para desplegar todos los tipos de materiales que están disponibles o que se se pretende ingresar en caso de que no se tenga en existencia. El problema con el que me encuentro es que requiero es que cada "combobox" despliegue una lista dinámica, la base de datos de donde se extraen los datos están todos los materiales de distintas "FAMILIAS", poo lo que requiero que haga un filtrado por "FAMILIA", y muestre esa lista actualizada constantemente en el "combobox", la idea que tengo por el momento lamentablemente no se como programarla, pero es la siguiente, la base de datos viene por columnas la descripción "B", proveedor "C", unidad"D", etc, y quiero insertarle una columna para que describa por CLAVE a la FAMILIA que pertenece, por ejemplo que todos los aceros tengan en esta columna la letra A, los ADITIVOS AD, etc. Esto me daría la opción de filtrar todos los materiales. Sin embargo la lista del "combobox" requiero muestre no su CLAVE sino la descripción que esta en la columna "B". Espero se explicito en mi problemática, y le pueda servir a alguien más si llegamos a una respuesta satisfactoria, de antemano les agradezco su ayuda.

1 respuesta

Respuesta
1
El tema es algo complejo pero tiene solución y voy a darte una idea de como hacerlo
Lo primero que debes usar es la función de filtro avanzado. Puedes grabar una macro para que el editor te arroje el código y tu puedas adaptarlo. Cuando tengas claro como funciona el filtro avanzado y hayas definido las columnas de salida, entonces con fórmulas creas unas cadenas que serán la propiedad rowsource del objeto combobox así: Supongamos que después de que has aplicado los filtros avanzados (Recuerda usar la opción Registros Únicos y Copiar a Otro Lugar) la lista de origen para el combo Aceros te quedo en la columna H de la hoja "FILTROS", entonces ahora lo que necesitas saber es el numero de filas que se asociaran a ese combo. En una celda, para el ejemplo I1, escribes la fórmula:
="FILTROS!H2:H" & CONTARA("H:H"), el resultado de esta formula debe ser del estilo:
FILTROS! H2:H25 dependiendo del numero de items en la columna H. Se inicia en 2 para omitir el encabezado. Luego a través de código asignas la propiedad rowsource así:
cmbAceros.RowSource=worksheets("FILTROS").Range("I1")
Esto lo puedes programar en el evento change del objeto combobox, pero debes usar una variable control para que el programa no se encierre en un bucle infinito, entonces en un modulo puedes declarar Public ActualizandoCombo as Boolen y usarla
Private Sub cmbAceros_Change()
if ActualizandoCombo=True then Exit Sub
ActualizandoCombo=True
tu codigo aqui
ActualizandoCombo=False
End Sub
Esta mismo control debes aplicarlo en todos los combos que uses para evitar ciclos infinitos.
Ahora, si estas usando base de datos y puedes traer la informaciòn a excel desde ella mediante codigo vba, puedes usar "SELECT DISTINCT ROW FROM TABLA.CAMPO WHERE TABLA.FAMILIA= 'ACEROS'" para traer de una vez los registros unicos correspondientes a esta familia  ahorrarte el paso de los filtros en excel.
Se que suena difícil, pero en realidad es más extenso que complicado. Inicia el trabajo y si tienes dudas te voy ayudando
Buenos días, oye muchas gracias por tu respuesta, ahorita estoy aprendiendo justamente lo que comentas de como usar un filtro avanzado, en cuanto tenga resultados positivos te comento alguna duda o en el mejor de los casos puntualizar y finalizar, pero por lo pronto gracias por tu tiempo.
Buenas tardes amigo experto, disculpa la tardanza, ya resolví lo del filtro avanzado, ya supe como programarle los rangos y demás, para que me arroje en otra hoja llamada "FILTROS" la información, pero puse la fórmula que me facilitaste ="FILTROS!B4:B" & CONTARA("B:B") como vez la adecue a la columna B, que es donde arroja la información, los datos arrancan desde la fila 4, pero me esta dando este resultado "FILTROS!B4:B1", pero en realidad el filtro avanzado me esta dando datos hasta la celda B11, ojala pudieras ayudarme con esto para poder seguir dando pasos, quizás lentos pero firmes, también trate de vincularlo al código del combobox, pero no te capte muy bien lo de la variable control, te agradecería enormemente si me pudieras explicar un poco más a detalle como no generar el bucle infinito, gracias de antemano y estamos al pendiente
Si la lista arranca en B4 entonces la fórmula quedaría:
="FILTROS!B4:B" & CONTARA("B:B") +3
Recuerda que no debe haber filas vacías en el intermedio de la lista
En cuanto a lo de la variable control como te explique, debe usarse para que cuando el combo cambie su valor y active el evento change, no se meta infinitamente en este ciclo sino que con la variable se de cuenta que ya lo hizo o lo esta haciendo y salga del procedimiento
Ya esta mi buen, mira ya esta funcionando la funcion que me pasaste, me quedo de la siguiente manera      ="FILTROS!B4:B"& CONTARA(B:B)+1    como vez le quite las comillas que estaban en "B:B", perdon que vaya un poco o muy lento, pero es que le estoy dando en mis ratitos libres, oye te quiero pedir de favor si me pudieras explicar un poco mas a detalle como vincular este rango variable en el COMBOBOX, y es que no se si tenga que meterle el      cmbAceros.RowSource=worksheets("FILTROS").Range("D1")     dentro del código del objeto, o tengo que hacer un Sub en otro modulo y ahi vincularlo, ojala sea clara mi pregunta y podamos seguir dandole salida a este asunto, gracias como siempre de antemano. Saludos
Implementalo en el evento Open del Objeto Workbook
Seguimos trabajando...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas