Hojas de cálculo en Excel - página principal

Mi primer Combobox

Hoy os presento los Combobox, o como los llama excel, los Cuadros combinados. Su utilidad dentro de un formulario, para presentar opciones disponibles, a través de un desplegable, está fuera de toda duda. El problema que se plantea, es: ¿cómo muestro en el Combobox los datos que tengo en determinado rango de celdas?. Pues muy sencillo, ...lo veremos a continuación.

Antes de nada, deberemos crear el formulario. Uno como este del ejemplo que os propongo, y donde como veis, hay varios elementos más, aparte del Combobox, entre ellos, cuatro etiquetas (label), dos de ellas con texto (Edad y País), y otras dos que no muestran nada junto a esas otras:


Si queréis añadir más controles al formulario, solo tenéis que seleccionarlos del Cuadro de herramientas, y arrastrarlo hasta el Userform. Si no veis el cuadro de herramientas, una vez situados en el Userform, elegiremos del menú Ver, la opción Cuadro de herramientas, de tal forma que veréis algo como esto:


Una vez hecho todo eso, y con el Userform tal y como se muestra en la imagen anterior, ahora solo nos quedará añadir el siguiente código, una vez hayamos cliqueado en el propio Combobox:


Private Sub ComboBox1_Change()
Hoja1.Select
'Sumamos 2 al listindex, porque empieza en cero,
'y porque tenemos una fila de cabecera en la fila 1.
'Mostraremos en las etiquetas invisibles,
'los datos correspondientes a la persona seleccionada
'en el desplegable (en el combobox)

Label2.Caption = Cells(ComboBox1.ListIndex + 2, 1).Offset(0, 1)
Label4.Caption = Cells(ComboBox1.ListIndex + 2, 1).Offset(0, 2)
End Sub

La parte del código anterior, donde sale label2 y la label4, es la que indica que estamos trabajando con las etiquetas "invisibles" (porque no tienen texto), esas que hay junto a la edad y al país.

Para poder decirle al Combobox que coja los datos de determinados rango de celdas, solo tendremos que informar de ello, tal y como os muestro en la siguiente imagen (ver la zona coloreada). Eso sí, para mostrar las propiedades del Combobox, tal y como veis en la siguiente imagen, deberéis haber seleccionado previamente el Combobox, pues éste no tiene las mismas propiedades, que por ejemplo las etiquetas de edad, o país:


Y ese es todo el secreto de los Combobox.



29 comentarios:

Anónimo dijo...

me parece muy interesante, lo unico es que me gustaria saber si hay alguna forma que actualice el rango del ComboBox1 automaticamente luego de insertar una linea a la base datos

Javier Marco dijo...

Hola que tal...

Puedes probar esto:

1.- Creamos un nombre para el rango de datos (seleccionamos el rango, y le ponemos de nombre, por ejemplo datos)

2.- Quitamos el RowSource que teníamos puesto inicialmente (Hoja1!A1:A5)

3.- Añadimos este código al UserForm:
Private Sub UserForm_Initialize()
ComboBox1.RowSource = "datos"
End Sub

4.- Cada vez que insertemos una fila por encima de la última, tendremos un nuevo rango de datos actualizado en el Combobox.

Salu2

Anónimo dijo...

muchas gracias, lo probare

Tomuer01 dijo...

y como seria, si tengo 3 hojas con distinto nombre y asocie esos nombres al combobox, cosa que si selecciono uno me despliege el contenido de esa hoja???

Anónimo dijo...

hola que tal,
como podria hacer para consultar y modificar la informacion de una base de datos con una forma parecida a esta que nos explicas?

gracias

Anónimo dijo...

Hola:
He estado buscando sobre este tema, es muy didactica tu explicación e interesante me quisiera me ayudes con una inquietud.
Tengo un formulario con 3 comobo box, a la vez tengo 3 hojas con de datos. Cuando seleccione el valor en el primer combo debe hacer referencia a la segunda columna de la segunda hoja.

Anónimo dijo...

hola.. muy buena pagina!!.. gracias... queria saber como hacer para configurar dentro un ComboBox la fecha.. con el formato dd/mm/yyyy.. por que tengo todas las fechas de un mes .. y me lo pone con formato de numero.. o sino si hay alguna otra forma de validar fechas mejor.. desde ya muchas gracias..

Javier Marco dijo...

Suponiendo que tengas la fecha en la celda A1, y quieras que se cargue en una etiqueta del formulario, tan solo deberías poner esto dentro del código del formulario (se ejecutaría al cargar el formulario):

Private Sub UserForm_Initialize()
'ponemos la fecha de la celda A1 en la etiqueta Label1
Label1 = Range("A1")
End Sub

Si así te recupera el valor de A1, pero en formato numérico, como dices, prueba de esta otra forma:

Private Sub UserForm_Initialize()
'ponemos la fecha de la celda A1 en la etiqueta
Label1 = Format(Range("A1"), "dd-mm-yyyy")
End Sub

Fíjate que he puesto guiones para separar día, mes y año, en lugar de la barra, para que veas que puedes personalizarlo a tu gusto.

Anónimo dijo...

gracias..
Pero tengo un problema
lo que yo quiero hacer es q .. en el formulario uno pueda elegir dentro de un combobox la fecha de un determinado mes.. por ej: del 01/12/09 al 31/12/09.. hice el combobox pero no me aparece el formato de la fecha.. y la fecha cuando la grabo me aparece como numero..
Tambien queria saber si hay otra forma de validar fechas mas facil.. x q sino tengo q hacer un fomulario por cada mes..
GRACIAS POR TUS CONOCIMIENTOS!!

Javier Marco dijo...

Este código te cargará en el UserForm todos los días del mes en curso (mes de la fecha del sistema):

Private Sub UserForm_Initialize()
'último día del mes
ultimo_dia = Day(DateSerial(Year(Date), Month(Date) + 1, 1 - 1))
'añadimos los items al combobox
For i = 1 To ultimo_dia
ComboBox1.AddItem DateSerial(Year(Date), Month(Date), i)
Next
End Sub

Si quieres adaptarlo a un mes diferente al del mes de la fecha, tendrás que adaptarlo a tus necesidades, ...pero creo que te será facilísimo, pues te he dado muchas pistas :-)

Anónimo dijo...

no es eso precisamente lo q necesito.. perdon por mi ignorancia.. soy nuevo en esto..

MI PLANTEO ES EL SIGUIENTE
... vos tenes un formulario para registrar gastos o egresos de una empresa o una persona..

Y HAY UN FORMULARIO CON CONCEPTO, IMPORTE Y FECHA..:como

REGISTRACION DE EGRESOS

CONCEPTO: panaderia

IMPORTE: 10

FECHA : (aca hice un combobox con todos los dias del mes..(Q NO SON DEL MES ACTUAL.. )pero el problema es q cuando elijo el dia .. ESTE queda expresado en numero.. y por lo tanto al grabar los datos en una planilla se graba como numero y no como una fecha..(con el formato de la fecha)) YO QUIERO SABER COMO HACER PARA QUE T LO GRABE EN EL FORMATO DE FECHA..)

MUCHAS GRACIAS PORTU AYUDA!!
espero que hayas entendido cual es mi problema..=)

Javier Marco dijo...

Vale, ya voy entendiendo...

Mírate este artículo donde explico como validar la entrada de datos en un formulario, y descárgate el ejemplo que verás al final del mismo. Podrás validar la entrada de fechas, de números, y de letras.

Para el tema de las fechas, solo habría que añadir al ejemplo, una validación con la función CDate (en la ayuda de VBA está explicada), para que no se pueda incluir una fecha como por ejemplo el 35/01/2010, pues enero no puede tener 35 días.

Dario Fuentes Castro dijo...

Gracias Loco!
Capo!
=)

JoaoM dijo...

Me gusta mucho la ofimatica pero no puedo praticarla mucho por mi tiempo y ocupacion.
Abri tu libro de Mi primer combobox
Cambio en RAWSOURCE Hoja1!A2:G15 pero quise darle mas largas y hice una coluna de 4 celdas partiendo de la G(nombre) H(edade) I(pais) y no se como hacer para que el combobox me reconozca desde la Hoja1!A1:G50. Podrias darme una manita? De programacion no me invites

Javier Marco dijo...

En las propiedades del combobox, aparte de indicar el Rowsource poniendo Hoja1!A2:G15, en esa misma pantalla de propiedades del Combobox, verás que más arriba pone ColumnCount. Ponle 7, y listo.

JoaoM dijo...

tengo este codigo en un forme en los 6 TextBox para que solo acepten numeros
-------------------------------------
'Este campo solo puede ser numérico
If Not IsNumeric(TextID) Then
MsgBox prompt:="Debe ingresar SOLO valor numérico, en el campo de ID", Buttons:=vbInformation + vbOKOnly, Title:="CARACTER NULO"
TextID = Empty
TextID.SetFocus
Exit Sub
End If
---------------

Resulta que en la columna(C) correspondiente a TextID no me inserta el primer numero que es un 0(cero), y ese cero hace falta pues es parte del numero y no se puede colocar al inicio una ' porque es solamente numeros.

¿Como corrigir este codigo?

Del formato de celdas no es, de eso estoy plenamente seguro, ya les di varios formatos y SIEMPRE sucede lo mismo.

Lo otro es, hacer que el ComboBox se llene con TODSO LOS DATOS , hoja1, hoja y hoja3 y si seleciono un item que está en la hoja3, automaticamente el forme pasaria a la hoja3 para trabajar en esa hoja.

Gracias por tu respuesta anterior, muy amable de tu parte

Edgar_hj1 dijo...

Me parece muy buen aporte... es de mucha ayuda para los que estamos aprendiendo.
Yo coloqué la lista en la Hoja2 con el fin de utilizar la lista como referencia; en realidad me gustaría que el dato seleccionado me lo descargue en la hoja1 en una tabla previamente elaborada... se puede hacer esto?
Gracias

Javier Marco dijo...

Hola Edgar.

Claro que se puede. Se supone que tendrás un botón "Aceptar" (el ejemplo que puse es muy sencillo, y carece de botón). Solo tienes que programar el botón CommandButton1 (o como se llame, aunque ese sería el nombre por defecto de tu primer botón en el formulario).

Aquí tienes tres ejemplos de uso de combobox: sacándoles provecho a los combobox, y aquí otro más: llenar dinámicamente un combobox.

Descárgate este ejemplo que acabo de preparar: http://www.megaupload.com/?d=TJ88XDF6

Saludos

Anónimo dijo...

MUY bueno el blog mi consulta es la siguiente, tengo tres combobox y tres textbox, como hago que al elegir un dato del combobox1 me rellene el textbox1 y asi susevivamente con los otros combos y textbox , por si acaso tengo en otra hoja el rago de los codigos para los combobox y el dato que deberia cargar en el textbox, un millon de gracias por su tiempo

Javier Marco dijo...

Prueba esto:

Private Sub ComboBox1_change()
'ponemos en el textbox el dato seleccionado del combobox
TextBox1 = ComboBox1.List(ComboBox1.ListIndex)
End Sub

Saludos.

Anónimo dijo...

Gracias por la pronta respuesta, solo que creo que no fui claro en mi consulta, lo siento.
Lo que quiero hacer es que al elegir un valor del combobox1 me rellene el textbox1, similar a la funcion buscar de excel digamos
eligo 001 del combo box y en el textbox1 llene AM,
cobombox1 textbox1
001 AM

y una consulta mas, como lleno mi combobox, como veras soy muy principiante en esto del vb, te rogaria que seas mas explicito. gracias mil

Anónimo dijo...

Podria ayudarme como multiplico un ComboBox Con otro para que me de un resultado Determinado !
Por ejemplo tengo un textBox con una Unidad, Tengo un Combobox1 donde dice unas unidades de Masa y tengo un ComboBox 2 donde dice tambien unidades de masa, Lo que quiero lograr es que al yo darle calcular al CommandButton me de una determinada Medida. Que digamos 55684 gramos me pase a kilogramos.

Gracias de antemano

Javier Marco dijo...

Para pasar de gramos a kg. simplemente divide el resultado entre 1000. Pero como eso es muy sencillo, y lo que buscas es multiplicar entre dos combobox, aquí te dejo un ejemplo, que no hace falta ni que comente, porque es muy sencillo de entender:

Private Sub ComboBox1_Enter()
ComboBox1.Clear
ComboBox1.AddItem "1"
ComboBox1.AddItem "2"
End Sub

Private Sub ComboBox2_Enter()
ComboBox2.Clear
ComboBox2.AddItem "3"
ComboBox2.AddItem "4"
End Sub

Private Sub CommandButton1_Click()
resultado = ComboBox1.List(ComboBox1.ListIndex) * ComboBox2.List(ComboBox2.ListIndex)
MsgBox (resultado)
End Sub

aescobar68 dijo...

Hola.. de antemano garcias por este blog.. pero tengo una duda .. tengo un combobox relacionado a un lista de matriculas, quiero que cuando digite una matricula y no este en la lista me de un mensaje " Matricula no existe " por ejm. gracias por la ayuda ..

JoaoM dijo...

Javier, ayudame en este caso, ya que mi experiencia es baja o nula.
Te agradezco. Ya dfespues para sumar y restar, me arreglare con el ejemplo que me puedas suministrar

El caso de 2 textbox para insertarle numeros, Multiplicar, o dividir segun el caso agregandole un CommandBotton para cada caso.
Ejemplo:
TextBox1 le ingreso 50201
TextBox2 le ingreso 127 'multiplico, divido, sumo o resto por 127, segun el CommandBotton a presionar
Private Sub CommandButton1_Click()
resultado =
MsgBox "Resultado de la multiplicacion" & (resultado)
End Sub

Private Sub CommandButton2_Click()
resultado =
MsgBox "Resultado de la division" & (resultado)
End Sub

Private Sub CommandButton3_Click()
resultado =
MsgBox "Resultado de la suma" & (resultado)
End Sub

Private Sub CommandButton4_Click()
resultado =
MsgBox "Resultado de la resta" & (resultado)
End Sub

Javier Marco dijo...

Aquí te dejo un ejemplo para la suma y la resta. Te dejo la multiplicación y la división:

http://www.megaupload.com/?d=HCLP1CJH

Saludos.

JoaoM dijo...

Lo resolvi así, a lo bruto.

Claro que el tuyo es mas tecnico, por eso dije que yo de macros (programacion) estoy nulo.
Gracias por el ejemplo

Anónimo dijo...

Nueva consulta Javier:
Tengo un formulario que tiene incrustado un Combobox, el cual recolecta algunos nombres de la columna A que cumplen con determinada restricción y un botón ACEPTAR que vuelca los datos del formulario a la planilla de Excel . Lo que no logro conseguir es que una vez seleccionado tal nombre del combobox, se active la celda del cual el combobox obtiene los datos. Es decir, que si por ejemplo despliego el combobox y selecciono Jorge Perez, dato que se obtiene del rango "A542", al presionar el botón ACEPTAR esta celda se seleccione y se active.
Dentro del evento Click del botón aceptar debería ir algo con Range.Address, pero no logro dar con el clavo.

Javier Marco dijo...

Mírate el ejemplo 3 de este artículo: Combobox: sacándoles provecho.

Saludos.