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

Ejecutar macro al seleccionar un elemento de un combobox

El otro día me preguntaba una lectora del blog, como se podía ejecutar un macro al cambiar un elemento de un ComboBox. Esta idea le había surgido, tras leer el artículo donde explicaba como ejecutar un macro, al cambiar una celda. Además, no solo quería que se ejecutase el macro al pulsar un botón del UserForm, que daba conformidad al elemento seleccionado en el ComboBox, sino que quería que se ejecutase simplemente al seleccionar el elemento (el item), del ComboBox.

Como ambas opciones son interesantes, vamos a verlas como siempre, con un sencillo ejemplo. Primero veremos la opción más normal o habitual, es decir, la que ejecuta el macro al pulsar el botón que da conformidad al elemento seleccionado en el Combobox.

Para ello, supondremos que tenemos un listado de marcas de vehículos, que alimentarán y llenarán el ComboBox1 que tenemos dentro del UserForm1. Al seleccionar el elemento nº 2 de la lista (con independencia de la marca de coches de que se trate) y pulsar el botón "OK", ejecutaremos un macro, que mostrará un mensaje. Esto podíamos hacerlo directamente, sin necesidad de llamar al macro que contiene el MsgBox, pues nos hubiera bastado con insertar el MsgBox en el evento change del propio ComboBox1, pero para ilustrar como lanzar un macro al cambiar el item, lo mejor es hacerlo de esta forma indirecta, es decir, llamando al macro, en lugar de insertando las líneas del macro directamente. Aparte de lanzar el macro, también nos desplazaremos a la celda que contiene el elemento seleccionado en el ComboBox1.

El segundo ComboBox, que llamaremos ComboBox2, hará lo mismo (en este caso con marcas de motos, en lugar de coches), pero sin necesidad de pulsar el botón "OK", porque de hecho ya no existirá ese botón pues en el UserForm2, solo aparece un desplegable, y nada más. Es decir, haremos lo mismo que con el UserForm1, pero sin necesidad de confirmarlo pulsando el botón "OK". La simple selección del elemento, lanzará el macro, y nos desplazará hasta la celda que contiene el valor seleccionado.

Necesitaremos algo como esto:


Lo primero que necesitaremos, será lanzar los UserForm, desde los botones que veis en la imagen anterior. Para ello escribiremos estas líneas en un módulo VBA:


Sub lanzar_userform1()
'llamamos al userform1
UserForm1.Show
End Sub


Sub lanzar_userform2()
'llamamos al userform2
UserForm2.Show
End Sub

Necesitaremos también los dos UserForm, tal y como muestran las siguientes imágenes (uno con el botón OK, y otro sin el):



Al activarse el UserForm1, es decir, al lanzarlo mediante el botón de la primera imagen, llamado "Lanzar el UserForm1", llenaremos dinámicamente el ComboBox1, con las marcas de vehículos. Para ello, necesitaremos este código, que irá dentro del UserForm1:

Private Sub UserForm_Activate()
'Nos situamos en la celda que nos interesa
Range("A2").Select
'Hasta que no encuentre una celda vacía, que llene el combo
Do While Not IsEmpty(ActiveCell)
'Añadimos los nombres de las hojas al combobox
ComboBox1.AddItem ActiveCell
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
End Sub

El botón con el texto "OK" (el nombre del botón es CommandButton1), llevará asociado este código, también dentro del UserForm1:

Private Sub CommandButton1_Click()
'Llamamos al macro "mensaje", siempre y cuando
'hayamos elegido el elemento nº 2 del ComboBox

If ComboBox1.List(ComboBox1.ListIndex) = ComboBox1.List(1) Then
'llamamos al macro "mensaje1"
mensaje1
End If
'Nos desplazamos a la celda que contenga el dato
'seleccionado en el combobox, para lo cual
'pasamos el dato a una variable

celda = ComboBox1.List(ComboBox1.ListIndex)
Cells.Find(What:=celda).Activate
End Sub

Y ahora necesitaremos el macro llamado "mensaje1", tal y como podemos ver en el código anterior. Este macro, irá en un módulo VBA, y contendrá estas líneas:

Sub mensaje1()
'Mostramos un mensaje, al seleccionar el elemento nº 2
'del Combobox (ponemos 1, porque los elementos comienzan
'a numerarse por cero: 0, 1, 2, 3, etc.

MsgBox ("Has seleccionado el elemento nº 2 de la lista, es decir: " & UserForm1.ComboBox1.List(1))
End Sub

Ahora nos tocará hacer lo mismo con el UserForm2. Para alimentar el ComboBox2, utilizaremos este código:

Private Sub UserForm_Activate()
'Nos situamos en la celda que nos interesa
Range("B2").Select
'Hasta que no encuentre una celda vacía, que llene el combo
Do While Not IsEmpty(ActiveCell)
'Añadimos los nombres de las hojas al combobox
ComboBox2.AddItem ActiveCell
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
End Sub

Al seleccionar un elemento del ComboBox2, lo que haremos será llamar al macro "mensaje2". En este caso, sin necesidad de confirmar la selección mediante el botón "OK", porque de hecho no existe ese botón en el UserForm2. Necesitaremos este código, que se ejecutará cada vez que se cambie un elemento seleccionado del ComboBox2:

Private Sub ComboBox2_Change()
'Si seleccionamos el elemento 2 de la lista,
'mostraremos un mensaje (recordemnos que los elementos
'del combo se numeran empezando por cero (0, 1, 2...)

If ComboBox2.List(ComboBox2.ListIndex) = ComboBox2.List(1) Then
'llamamos al macro "mensaje2"
mensaje2
End If
'Nos desplazamos a la celda que contenga el dato
'seleccionado en el combobox, para lo cual
'pasamos el dato a una variable

celda = ComboBox2.List(ComboBox2.ListIndex)
Cells.Find(What:=celda).Activate
End Sub

Ahora, igual que en el caso anterior, necesitaremos el macro llamado "mensaje2", tal y como podemos ver en el código anterior. Este macro, irá en un módulo VBA, y contendrá estas líneas:

Sub mensaje2()
'Mostramos un mensaje, al seleccionar el elemento nº 2
'del Combobox (ponemos 1, porque los elementos comienzan
'a numerarse por cero: 0, 1, 2, 3, etc.

MsgBox ("Has seleccionado el elemento nº 2 de la lista, es decir: " & UserForm2.ComboBox2.List(1))
End Sub

Aquí os dejo unos pantallazos, que ilustran este artículo. El primero de ellos, es cuando llamamos al UserForm2:


El siguiente pantallazo nos muestra como se ejecuta el macro "mensaje2", al ejecutar el elemento nº 2 de la lista, es decir, al cliquear sobre la marca de motos Derbi (he desplazado el MsgBox hacia abajo, para que veáis que en el UserForm2 está seleccionado ese segundo item):


Desde aquí podéis descargar el fichero, con el ejemplo que hemos visto en este artículo.



4 comentarios:

Juan dijo...

Hola Javier Marco,deberías de llamarte Javier Macro...jeje
La verdad que soy nuevo en esta pagina, nos muestras las bondadesque se pueden hacer con las macros.Al respecto tengo una curiosidad
Como puedo crear una macro que a partir de un combobox controle varias hojas y me muestre sus contenidos de ellas, osea a partir de una hoja principal.
Gacias por tu respuesta.Saludos Juanelnobe@hotmail.com

mefiskafka dijo...

que tal javier. Te felicito por tu blogger es impresionantemente bueno, actualmente compre un libro de macros porque necesito aprender hacer macros, pero resulta que tu blogger esta mejor que este libro, jaja claro mi libro es nivel basico. Y estoy aprendiendo a utilizar macros pues en mi trabajo lo requieren.
a cerca de los combo box, como podria hacer un macro donde al seleccionar un dato dentro del combobox cambien algunas celdas de mi fichero, ejemplo, en el combo box tengo nombres de trabajadores y segun la seleccion de este cambien cedas como "orden de trabajo = Dep-311009" "categoria = ext" " nombre del jefe "... esa es mi dida y pregunta!!!
Por otro lado seria bueno que nos muestres a hacer macros conforme a las fechas, por decirlo que dejen de funcionar al cumplir 3 meses cosas asi... Otra duda exita una forma de hacer una macro que se capaz de colocar en una celda la fecha de esta forma 30 de septiembre de 2009 pero que solo muestre las fechas que estan dentro de lunes a viernes y si es dia festivo que no se coloque en las celdas...
Bueno de cualquier forma eres muy bueno en esto de las macros recibe de mi parte una gran felicitacion.

RedRos dijo...

Hola antes que nada debo felicitarte por el gran aporte que haces a la comunidad de internet. Bueno mi pregunta es la siguiente como puedo yo con un combo box jalar los registros de una base de datos sin que estos se repitan en este algo como un filtro... además me gustaria saber una vez jalado al hacer click en un elemento del combo box me mostrara tan solo tuvieran ese elemento e indicar en que celda quiero que comienze la consulta. Gracias. Vi algo parecido en otro de tus post algo referido a que uno hacia click en un boton y jalaba todos los registros de la base de datos de access me gustaria hacer lo mismo pero con un combo box y condicionandolos segun el elemento que elija. gracias espero me ayudes.

Javier Marco dijo...

Mírate este artículo, donde entre otras cosas tienes un ejemplo para cargar items no repetidos: sacándoles provecho a los combobox.

Mírate este otro ejemplo también: ejecutar macro al seleccionar un elemento de un combobox.

Saludos