lunes, noviembre 15, 2010

Activar una macro desde un cuadro combinado (ComboBox)

En la nota anterior vimos como activar una macro a partir de la elección en una lista desplegable. Esta lista fue creada con validación de datos.

Podemos también crear listas desplegables usando el control cuadro combinado (ComboBox). Pero en ese caso tendremos que usar técnicas un poco distintas de las que mostramos ayer.

Empecemos por señalar que hay dos tipos de controles: los de la barra de formularios y los ActiveX (tema que ya fue tratado en este blog). Los controles de la barra de formularios son fáciles de usar pero no pueden ser programados. Los ActiveX al poder programarlos son más flexibles, pero requieren un poco más de conocimientos.

Siguiendo con el ejemplo de la nota anterior, veremos cómo implementarlo con ambos tipos de controles.


Cuadro combinado de la barra de formularios.

Empezamos por crear las tres macros en un módulo común del editor de Vba

Sub dia()
    MsgBox "Buenos dias"
End Sub
Sub tarde()
    MsgBox "Buenas tardes"
End Sub

Sub noche()
    MsgBox "Buenas noches"
End Sub


Luego creamos una lista con los nombres de las macros y le asignamos un nombre (en este caso usamos el cuadro de nombres para crearlo)



El próximo paso es pegar el cuadro combinado y definir sus propiedades. En la pestaña Programador



Una vez creado abrimos el menú de propiedades del control apretando el botón derecho del mouse.



En el rango de entrada ponemos el nombre que se refiere al rango con la lista de macros y en la casilla de vincular con celda ponemos alguna celda, no necesariamente en la misma hoja y no necesariamente visible



Ahora podemos ver que al elegir la opción "dia", la celda vinculada recibe el valor 1 (ya que "dia" es el primer elemento de la lista). Si elegimos "tarde" la celda vinculada recibe el valor 2.

El paso siguiente es crear una macro lo que haremos abriendo el menú contextual del control (clic con el botón derecho) y eligiendo la opción Asignar macro y apretando el botón Nuevo



En el editor de Vba veremos que Excel ha creado una macro, sin código en esta etapa



En esa macro ponemos este código

Sub Listadesplegable1_AlCambiar()
    Dim intCaseSel As Integer

    intCaseSel = Range("C8")

    Select Case intCaseSel
        Case 1: Call dia
        Case 2: Call tarde
        Case 3: Call noche
    End Select
      
    
End Sub


Cada vez que un valor del cuadro combinado es elegido, la instrucción Select activa la macro correspondiente según el valor de la celda vinculada al control.


Cuadro combinado ActiveX

Empezamos seleccionando el cuadro combinado de los controles ActiveX




y pegándolo en algún lugar de la hoja. En el momento en que terminamos de pegar el control, la hoja pasa al modo "Diseño", lo que nos permite definir las propiedades del control. Abrimos el menú de propiedades (no el de formato!) y definimos el rango de los valores de la lista (ListFillRange)



En el próximo paso abrimos el menú Ver código. Excel crea un evento Change para el control,




donde ponemos este código

Private Sub ComboBox1_Change()
    Application.Run ComboBox1.Value
End Sub


Nótese que el código está en el módulo de la hoja que contiene el control. El evento usa el método Run con el valor elegido en el cuadro combinado (ComboBox1.Value) para activar la macro adecuada.

Todo sobre listas desplegables en Excel, técnicas avanzadas y descarga gratuita de ejemplos  en la Caja de Herramientas Excel - Listas Desplegables de JLD. Ver la nota o ir a la página de descarga de la guía.

15 comentarios:

  1. Jorge
    Excelente tus dos formas de resolver un mismo problema
    Te pasastes
    Gracias
    Hugo

    ResponderBorrar
  2. Hola Jorge.

    Como siempre, excelente con tus notas. No me pierdo ninguna de tus notas pues he aprendido un montón con ellas.

    ResponderBorrar
  3. He descubierto este blog hace unos días, y es un alivio saber que no soy el único loco de Excel. Qué gusto ser raro entre muchos!!

    ResponderBorrar
  4. Jo_selito,
    el 20 de mayo de 1996 Microsoft anunció que había màs 30 millones de usuarios de Excel y que tomando en cuenta que Excel fue introducido en 1985, la tasa de crecimiento era de 5 nuevos usuarios por minuto. Haciendo la cuenta desde entoonces hasta ahora, se han sumado por lo menos otros 38 millones de usuarios. Si agregamos los que usan copias de otros y versiones "non-sancti", digamos que nos acercarìamos a los 100 millones.
    Como verás, hay muchos raros!

    ResponderBorrar
  5. Bien, me quedé corto! En una nota de julio de este año Microsoft declara que hay más 500 millones de usuarios Excel en el mundo. Supongo que sabrán lo que dicen...

    ResponderBorrar
  6. ERES EL MAXIMO, ME HE TIRADO MAS DE UN MES BUSCANDO ESTO , MUCHAS GRACIAS

    ResponderBorrar
  7. Hola,

    Tengo una pregunta. No entiendo la parte del código que dice: intCaseSel = Range("C8")

    ¿Por qué Range("C8")? ¿Qué información contiene esta celda?

    Lo que pasa es que cuando ejecuto el código no me corre la macro sino que me sale un número correspondiente a la opción que seleccioné.

    ResponderBorrar
  8. Ahora que lo mencionas veo que hay un error en la nota. La celda C8 sería la celda vinculada del control, la que contiene el valor elegido (en la imgen de la nota se ve la celda D6). Es resto está expicado en la nota.

    ResponderBorrar
  9. Muchísimas gracias!!

    Tu post es realmente bueno, me ha ayudado muchísimo

    ResponderBorrar
  10. muy bueno m sirvio para excel 2010

    ResponderBorrar
  11. Que tal Jorge, me gustaría saber si es posible crear una lista en la q despliegue elementos segun lo q se vaya digitando, es decir, si digito AL deberia mostrar ALBERTO o ALMACEN, espero pueda ayudarme, Gracias porr su gentil labor.

    ResponderBorrar
  12. Hace semanas buscaba esto! Muchas gracias!

    ResponderBorrar
  13. Una explicación de gran ayuda!, mil gracias...

    ResponderBorrar
  14. Muchas gracias, funciona a la perfección.

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.