domingo

ComboBox Dinamico (Userform)

Hola amigos!
Se conoce que existe una forma de llenar listas desplegables de modo dinamico, algo relacionado lo vimos en este tema: Listas Desplegables sin Desref y con Indice
Pues aqui un poco similar se trata este post y es llenar ComboBox desde un userform y para los que aun desconecen como hacerlo, aqui les adjunto un ejemplo, en el cual veran dos tipos, como importante, si exitieran espacios en blanco en la lista de datos (es decir celdas vacias) con codigo VBA se supera ese inconveniente, llenando sin espacios el ComboBox, automaticamente...



No es dificil, ni nada complicado, puesto que basta crear un bucle, para marcar el rango usado, condicionarlo y listo

Aqui los dos codigos:

Private Sub ComboBox1_enter()
Me.ComboBox1.Clear
For x = 2 To Range("A" & Rows.Count).End(xlUp).Row
If Cells(x, 1) <> Empty Then ComboBox1.AddItem Range("A" & x).Value
Next
End Sub


Private Sub ComboBox2_enter()
Me.ComboBox2.Clear
For Each celda In Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
If celda <> Empty Then ComboBox2.AddItem celda.Value
Next
End Sub



Y les adjunto el archivo para pruebas/revision/analisis/comentarios

Espero les guste o sea de utilidad

Saludos desde Honduras

38 comentarios:

  1. Muy buen aporte, compa Gerson. Muy util y sencillo.

    Aun asi, tengo una duda:

    1.- por que limpias el ComboBox antes del codigo?

    Me.ComboBox.Clear

    Gracias anticipadas, compa.

    ResponderEliminar
  2. Hola himself
    En realidad no tiene gran utilidad es solo una practica nada mas, pero no pasa nada si lo quitas

    Saludos y gracias por tu comentario

    ResponderEliminar
  3. Está muy bien, maravilloso para mis conocimientos (casi nulos).
    Guardare este codigo talves para un futuro ¿quien sabe?
    Voy buscando tambien casi lo mismo pero sin celdas vacias para agregar un otro (3º) comboBox para tener los 3 en el mismo form tuyo y guardar todo en uno solo.
    Lo demas es que quiero saber como llenar un Combo insertado en hoja excel SIN formulario.

    Gracias amigo y un gran abrazo

    ResponderEliminar
  4. Hola JoaoM
    Te adjunto un ejemplo de un COMBOBOX en la hoja, doble click para actualizar la BD

    Espero te funcione

    Bajar el archivo:
    https://dc2.safesync.com/CpWlxBM/Combobox%20dinamico%20en%20hoja.xls?a=V_BsfjcWlcY

    Saludos desde Honduras

    ResponderEliminar
  5. Hola, estoy intentando hacer lo mismo pero no he podido. Tengo un combobox en una hoja de excel, es decir, no uso un userform. Por ahora lo estoy ubicando así:
    Private Sub ComboBox1_DropButtonClick()
    Hoja1.ComboBox1.Clear
    For Each celda In Range("E149:E200")
    If celda <> Empty Then ComboBox1.AddItem celda.Value
    Next
    End sub


    Tengo un rango especifico que es de la celda E149 a la E200. Cuando lo pruebo me sale error de automatización en la linea de clear (error '-2147467259 (80004005)' en tiempo de ejecucion:error de automatizacion)

    Y cuando entra a la linea de ComboBox1.AddItem celda.value sale error 70 en tiempo de ejecución: permiso denegado.

    Sin embargo cuando corro tu archivo excel con la tecla F8 no me sale ninguno de estos errores.

    Me podrias ayudar porfavor

    ResponderEliminar
  6. Hola mayiya

    Baja este archivo
    https://dc2.safesync.com/CpWlxBM/Combobox%20dinamico%20en%20hoja.xls?a=V_BsfjcWlcY

    Para actualizar la BD tienes que que dar "DOBLE CLICK", espero te sirva

    Saludos

    ResponderEliminar
  7. Hola, quisiera que por favor me ayudes con hacer un formulario en el cual hayan 3 combobox, en el primer combobox que esten departamentos, en el 2do (una vez elegido un departamento) se carguen sus respectivas provincias , y luego de elegir la provincia, en el 3er combobox se carguen sus distritos, y que al final al elegir un distrito , la mascara del formulario me muestre unos datos correspondientes al distrito elegido (como poblacion,etc).
    todos los datos los tengo en una hoja de excel

    ResponderEliminar
  8. porfavor ayudame jose carlos18 de mayo de 2012, 11:18

    por favor ayudame, es urgente
    te lo agradeceria muchisimo

    ResponderEliminar
  9. Hola gracias por ayudarnos con tu conocimiento, queria saber como direccionar el codigo para que el combobox cargue el rango desde otra hoja del mismo libro, se puede?

    ResponderEliminar
  10. Hola Gabriel

    Es sencillo solo tienes que anteponer el nombre de la hoja y listo, como algo asi

    Private Sub ComboBox2_enter()
    With Sheets("Hoja2")
    For Each celda In .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)
    If celda <> Empty Then ComboBox2.AddItem celda.Value
    Next
    End With
    End Sub

    Cambia "Hoja2" por el nombre original de tu hoja

    Prueba y ya comentaras...

    Saludos

    ResponderEliminar
  11. Hola, me parece muy bueno este aporte, pero quiero saber como hacer para que no me despliegue repetidos, es decir, puedo tener valores duplicados en mi hoja y solo deseo ver mas o menos lo siguiente, columna "C" 601,602,602,603,604,604,604, que solo me muestre lo siguiente 601,602,603,604 y si se puede de una vez los ordene de mmenor a mayor valor, gracias de antemano.

    ResponderEliminar
  12. Excelente opción al uso de desref, muchas gracias por compartirla!
    Aunque me pierdo con la expresión "Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)"
    o la las del otro método. Espero algun día entenderlas.
    Salud hermano.

    ResponderEliminar
  13. Hola

    Te explico

    Range("A2:A" & ...
    Significa que el rango comenzara desde A2 hasta la ultima fila ocupada (con datos)

    Range("A" & Rows.Count).End(xlUp).Row
    Obtengo la ultima fila con datos de la columna A, es decir cuenta las filas a partir de la ultima, en otras palabras de abajo hacia arriba End(xlUp)

    Intenta haciendolo manual, ubicate en la ULTIMA FILA de la columna A, luego presiona las teclas Ctrl y Flecha Arriba, te va seleccionar la ultima fila OCUPADA

    Espero no enredarte mas jeje


    Saludos a todos!

    ResponderEliminar
  14. hola no se si me puedas ayudar pero en una base de datos de userform al momento de eliminar un registro no se me descarga del comboBox y al momento de buscar otro dato actua el excel como si no se hubiera eliminado nada
    que codigo puedo utilizar y en donde????
    gracias por tu ayuda

    ResponderEliminar
  15. wow, por fin encontré lo que necesitaba, todos los demás códigos similares no me funcionaban y mac carece del campo Row Source de verdad mil gracias por compartir

    ResponderEliminar
  16. Gracias Gerson.

    Mi pregunta es, a este codigo se puede acoplar alguna línea que no permita datos duplicados.

    'Cargar Datos Combobox
    Private Sub ComboBox1_Enter()
    With Sheets("PERSONAL")
    Me.ComboBox1.Clear
    For Each Celda In Range("F2:F" & Range("F" & Rows.Count).End(xlUp).Row)
    If Celda <> Empty Then ComboBox1.AddItem Celda.Value
    Next
    End With
    End Sub

    Saludos
    Fernando

    ResponderEliminar
  17. Hola

    Revisa este tema y adaptarlo a tu libro
    http://gerson-pineda-el-catracho.blogspot.com/2013/06/unicos-en-combobox-activex.html


    Saludos

    ResponderEliminar
  18. Buenas Noches Gerson!! Muy interesante tu blog y agradecido por las enseñanzas que he obtenido de tu persona. Pocas personas son las que disfrutan impartiendo sus conocimientos y eso lo encuentro en tí.. cómo es posible agregar 2 columnas al combobox? Tengo datos que van unidos y me gustaría seleccionarlos en este combobox e insertarlos en dos columnas contiguas (Nombre de Empresa e Identificación). Ej. Columna A "La Casa de Excel" Columna B "Número Identificador". Saludos desde Venezuela!!!

    ResponderEliminar
  19. Hola Pedro Suarez

    Sera algo asi
    Private Sub ComboBox2_enter()
    Me.ComboBox2.Clear
    For Each celda In Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
    If celda <> Empty Then ComboBox2.AddItem celda.Value & celda.offset(,1).value
    Next
    End Sub

    Prueba


    Saludos

    ResponderEliminar
  20. Hola Gerson, antes que nada déjame decirte que tu blog esta muy completo y hay temas muy interesante. Mi duda es ¿ cómo puedo cargar un combobox con dos columnas y al mismo tiempo eliminar los duplicados?, y cuando seleccione un item solamente visualice el dato de la primera columna.

    ResponderEliminar
  21. Hola

    Es posible que este aporte te sirva de guia, revisalo y adaptalo a tu caso

    http://gerson-pineda-el-catracho.blogspot.com/2013/06/unicos-en-combobox-activex.html


    Saludos desde Honduras

    ResponderEliminar
  22. Hola Gerson. Tengo un UserForm con varios textbox y un commandButton Este último imprime el contrato y a la vez, registra los datos a una hoja(ARCHIVO).
    Este UserForm realiza contratos a clientes.Hasta aquí todo va bien. Pero ahora he eliminado uno de los textbox reemplazandolo por un ComboBox.
    Este cambio, es porque se da la circunstancia de que a veces, se repite el mismo cliente y sus datos personales ( en un nuevo contrato, hay textbox que varian y otros no ). Ese ComboBox contiene un dato único por cliente, así que si escribo esos datos en el, consigo que me aparezcan
    los datos en los demás textbox que me interesan y así voy mucho más rápido al confeccionar un nuevo contrato. Pero tengo un problemilla. Si los datos que le proporciono al ComboBox no coincide con ninguno de los que el tiene (nuevo cliente), puedo escribir el nuevo, pero en el resto de los textbox que tengo referenciados, me aparecen los titulos de cada rango y lo suyo sería que apareciese en blanco. Te mando los dos códigos por si puedes ayudarme a solucionarlo.

    Private Sub ComboBox1_Change()
    Application.ScreenUpdating = False
    Sheets("ARCHIVO").Activate
    On Error Resume Next
    Cells(ComboBox1.ListIndex + 3, 1).Select
    C1 = ActiveCell.Offset(0, 5)
    C2 = ActiveCell.Offset(0, 6)
    C3 = ActiveCell.Offset(0, 7)
    C4 = ActiveCell.Offset(0, 8)
    C5 = ActiveCell.Offset(0, 10)
    End Sub

    Private Sub ComboBox1_Enter()
    Application.ScreenUpdating = False
    ComboBox1.Clear
    Sheets("ARCHIVO").Select
    Range("J3").Select
    Do While Not IsEmpty(ActiveCell)
    ComboBox1.AddItem ActiveCell.Value
    ActiveCell.Offset(1, 0).Select
    Loop
    End Sub

    ResponderEliminar
  23. Hola

    Si es cliente nuevo, porque no limpias los textbox?

    Textbox1 = ""


    Saludos

    ResponderEliminar
  24. Hola de nuevo Gerson y gracias por tu pronta respuesta.
    Lo que no se es como combinarlo. Es decir, si ya existe el cliente ha de salir su número identificativo único en el ComboBox y al mismo tiempo el resto de los textbox con los datos de ese cliente. Y si no existe el número identificativo del cliente, que quede ese nuevo número en el ComboBox y los textbox queden limpios para incorporar los nuevos datos,
    Hasta ahora solo consigo o lo uno o lo otro.

    ResponderEliminar
  25. Hola... tu nombre?

    No es fácil ayudar sin ver un archivo


    Saludos

    ResponderEliminar
    Respuestas
    1. Mi nombre es Manuel.

      Si me dices como mandártelo, te lo envío.

      Gracias de nuevo

      Saludos

      Eliminar
  26. tengo un problema, quisiera que un combobox de un archivo me desplegara una lista de otro archivo como lo puedo realizar?????????????????????

    ResponderEliminar
  27. Hola Gerson...
    Quisiera saber si las formulas son aplicables a un combobox que uso como búsqueda, puesto que no he logrado que funcione...
    Te Adjunto la Formula que tengo en mi UserForm que busca en mi Combobox

    On Error GoTo Fin
    Cells.Find(What:=cmbLista, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate
    cmbLista.SetFocus
    Exit Sub
    Fin:
    MsgBox "DATO '" & cmbLista & "' NO ENCONTRADO", vbInformation, "Excel e Info"
    cmbLista = ""
    cmbLista.SetFocus
    End Sub

    ResponderEliminar
  28. Estimado Gerson Pineda he encontrado tu blog veo que hay buena paticipación espero me permitas interactuar tambien aquí.
    Visor

    ResponderEliminar
  29. Estimado Gerson Pineda he encontrado tu blog veo que hay buena paticipación espero me permitas interactuar tambien aquí.
    Visor

    ResponderEliminar
  30. Hola y un saludo para todos!

    Manuel hare un tema para tu caso, para que lo tomen como ejemplo y quede en el blog

    Angy igual hare un archivo y lo subire al blog

    Visor
    Gracias por tus buenos comentarios, por aqui andamos, toma el blog como tuyo!


    Un abrazo!

    ResponderEliminar
  31. Buenos días:
    lo primero gracias por tu inestimable ayuda.
    Tengo un combobox que carga datos de una hoja determinada y de una columna.
    En la citada columna hay celdas que no tienen datos y al buscar mediante el combobox me muestra tambien los espacios en blanco.
    el codigo vba es :
    Private Sub ComboBox4_Change()
    Dim RAZON_SOCIAL As String
    Dim idBusca As String
    Dim fila As Integer
    Application.ScreenUpdating = False

    Sheets("General").Select
    Range("F2").Select

    fila = 1
    RAZON_SOCIAL = ComboBox4

    Do While idBusca <> RAZON_SOCIAL
    fila = fila + 1
    idBusca = Range("F" & fila).Value


    Loop
    TextBox7 = Range("A" & fila).Value
    TextBox5 = Range("B" & fila).Value
    TextBox3 = Range("C" & fila).Value
    TextBox4 = Range("D" & fila).Value
    TextBox6 = Range("E" & fila).Value
    TextBox12 = Range("G" & fila).Value
    TextBox13 = Range("H" & fila).Value
    TextBox14 = Range("I" & fila).Value
    TextBox15 = Range("J" & fila).Value
    TextBox8 = Range("K" & fila).Value
    TextBox9 = Range("L" & fila).Value
    TextBox10 = Range("M" & fila).Value
    TextBox11 = Range("N" & fila).Value
    TextBox16 = Range("O" & fila).Value
    TextBox17 = Range("P" & fila).Value
    TextBox18 = Range("Q" & fila).Value
    TextBox19 = Range("R" & fila).Value
    TextBox20 = Range("S" & fila).Value
    TextBox28 = Range("T" & fila).Value
    TextBox21 = Range("U" & fila).Value
    TextBox29 = Range("V" & fila).Value
    TextBox22 = Range("W" & fila).Value
    TextBox23 = Range("X" & fila).Value
    TextBox30 = Range("Y" & fila).Value
    TextBox24 = Range("Z" & fila).Value
    TextBox25 = Range("AA" & fila).Value
    TextBox26 = Range("AB" & fila).Value
    TextBox27 = Range("AC" & fila).Value

    End Sub

    ¿Como puedo hacer para evitar las celdas en blanco?
    Mil gracias por tu ayuda

    ResponderEliminar
  32. Hola

    Viendo tu codigo no encuentro donde estas cargando los datos e tu combobox

    Ademas al inicio de este aporte, hay dos formas para llenarlo, trata de adaptarlo, si aun sigues con problemas pues avisa

    Saludos

    ResponderEliminar
  33. Hola

    Espero puedas ayudarme, tengo un libro con 5 formularios, cada formulario tiene más de 2 combobox.

    No he querido rellenarlos con código porque cuando se vuelve a cargar el formulario se duplican los datos. He intentado utilizar Rowsource dentro del control, si sólo ocupo esta opción en el primer combobox puedo correr el formulario, pero si ocupo esta opción en los demás, al correr el formulario me arroja el error 70:Permiso denegado (todas las listas están en la misma hoja, en diferentes columnas) puedes darme alguna idea de ¿qué hago mal? Muchas gracias por el tiempo Gerson

    ResponderEliminar
  34. Hola!

    Disculpa la demora en responder...

    Para cargar los combobox y no se duplique los valores, puedes borrarlos con .Clear; ademas que también se pueden cargar de varias formas

    En fin al ver tu archivo sería más adecuado para dar una respuesta certera

    Saludos

    ResponderEliminar
  35. Hola Gerson,

    estoy utilizando el código que indicas pero me surge un problema, ambos funcionan pero solo si lo ejecuto desde la consola de desarrollador, es decir no salen automaticamente los valores en el desplegable del comboBox, solo cuando ejecuto la macro desde desarrollador funciona pero si cierro el libro y lo vuelvo a abrir no salen los valores en el ComboBox y debo volver a activarlo desde Desarrollador. No se si necesitaré poner algún código antes para que se ejecute cada vez que abro el libro, lo intente haciendo un Call desde WorkBook_Open pero tampoco funcionó ¿me podrías indicar cual podría ser el problema?

    Muchas gracias y felicidades por el Blog

    ResponderEliminar
    Respuestas
    1. Finalmente lo puede solucionar poniendo el código del ComboBox en ThisWorkBook (especificando la hoja donde estaba el combobox) y haciendo una Call en WorkBook_Open.

      Gracias de todas formas

      Eliminar
  36. Enhorabuena Oscar Lorenzo!


    Saludos

    ResponderEliminar