jueves, 5 de mayo de 2011

VBA:Configurar un gráfico usando Botones de Opción.

Hace algunos días expliqué en que forma podíamos configurar nuestros gráficos empleando Celdas validadas para seleccionar la Serie a mostrar (ver entrada). En esta ocasión añadiremos una nueva funcionalidad a nuestra propuesta; y es que empleando los Botones de opción de los Controles ActiveX conseguiremos alternar el gráfico mostrado entre las distintas Series de las que partimos, así como elegir qué Tipo de Gráfico nos conviene más.
Para todo ello necesitamos un origen de datos y un gráfico inicial de partida ya creado, nombrado como "2 Gráfico"(por comodidad).
Veámoslo:


Explicaré ahora como agregar a nuestra Hoja de cálculo los diferentes Botones de Opción que necesitaremos:


Para incorporar estos cinco botones de opción de los Controles ActiveX deberemos navegar por:
Ficha Programador > Controles > Insertar > Controles ActiveX > Botón de Opción:


De igual forma agruparemos estos botones de opción en dos grupos, empleando el Control de formulario Cuadro de Grupo:


Me pararé en este momento para explicar, superficialmente cuáles son las diferencias entre los Controles de Formulario y los Controles de ActiveX:
  • Controles de Formulario: controles que son fácilmente configurables (con limitaciones) y directamente vinculables con las celdas de nuestras Hojas, sin el empleo de macros.
  • Controles ActiveX: controles con mayores posibilidades de configuración pero que requieren desarrollos de programación VBA para su completa funcionalidad.

En la ayuda de Microsoft existe una buena introducción que distingue ambos (ver ayuda Ms-Office).


Visto estos aspectos o diferencias, continuaremos con el desarrollo del ejemplo.
Es necesario saber que al incluir los Botones de Opción (ya sean como Controles de Fromulario o como Controles ActiveX) sólo uno de ellos puede estar activo al tiempo, y que si, como en nuestro ejemplo, queremos tener pulsado varios de ellos, se requiere el control de Cuadro de grupo (control de formulario) o el Control de marco-Frame-Microsoft Forms 2.0 Frame (control ActiveX).

Rodeando aquellos Botones de opción que queramos ejecutar de manera independiente será suficiente:


A cada uno de estos Controles ActiveX le asignaremos un texto adecuado y lo formatearemos desde sus Propiedades. Seleccionando uno a un o los 'Botones de opción' y desde Ficha Programador > Controles > Propiedades nos fijaremos en:


Entre las distintas propiedades resaltaré la propiedad 'Caption' que modifica el texto que muestra dicho botón, y la propiedad 'GroupName' que refuerza la agrupación a la que pertenece dicho botón de opción.
Repetiríamos este paso para cada uno de los controles que hemos insertado en nuestra Hoja de cálculo.

El último paso es dar funcionalidad a estos Botones de opción. En mi caso he optado por un lado, definir un grupo que defina el tipo de gráfico a mostrar, y un segundo grupo de opciones que muestre qué serie incluir en el gráfico; por tanto, el código VBA agregado a cada botón sería:

Private Sub OptionButton1_Click()
ActiveSheet.ChartObjects("2 Gráfico").Activate
ActiveChart.SeriesCollection(1).ChartType = xlColumnClustered
ActiveSheet.Select
End Sub
'----------------------------------------------------
Private Sub OptionButton2_Click()
ActiveSheet.ChartObjects("2 Gráfico").Activate
ActiveChart.SeriesCollection(1).ChartType = xlLine
ActiveSheet.Select
End Sub
'----------------------------------------------------
Private Sub OptionButton3_Click()
ActiveSheet.ChartObjects("2 Gráfico").Activate
ActiveChart.SeriesCollection(1).ChartType = xlPie
ActiveSheet.Select
End Sub
'----------------------------------------------------
Private Sub OptionButton4_Click()
ActiveSheet.ChartObjects("2 Gráfico").Activate
'situa el gráfico a partir de la celda A6.
With ActiveSheet
.ChartObjects("2 Gráfico").Left = .Columns("A").Left
.ChartObjects("2 Gráfico").Top = .Rows("6").Top
End With
ActiveChart.SeriesCollection(1).Values = Range("B2:B4")
ActiveChart.SeriesCollection(1).Name = Range("B1")
ActiveChart.SeriesCollection(1).XValues = Range("$A$2:$A$4")
ActiveChart.SeriesCollection(1).ApplyDataLabels
ActiveSheet.Select
End Sub
'----------------------------------------------------
Private Sub OptionButton5_Click()
ActiveSheet.ChartObjects("2 Gráfico").Activate
'situa el gráfico a partir de la celda A6.
With ActiveSheet
.ChartObjects("2 Gráfico").Left = .Columns("A").Left
.ChartObjects("2 Gráfico").Top = .Rows("6").Top
End With
ActiveChart.SeriesCollection(1).Values = Range("C2:C4")
ActiveChart.SeriesCollection(1).Name = Range("C1")
ActiveChart.SeriesCollection(1).XValues = Range("$A$2:$A$4")
ActiveChart.SeriesCollection(1).ApplyDataLabels
ActiveSheet.Select
End Sub


Recordemos que por comodidad, el gráfico ya existía y estaba nombrado como '2 Gráfico'.
Otro aspecto a observar del código es el inicio de cada procedimiento Sub que para este caso lleva asociado el evento 'click': Sub OptionButton1_Click()
Vemos como queda el ejemplo finalizado en este video:

2 comentarios:

  1. me aparece erro en compilacion en grafico 2

    ResponderEliminar
  2. Hola,
    asegúrate que el gráfico generado se llama '2 Gráfico'.
    Slds

    ResponderEliminar

Nota: solo los miembros de este blog pueden publicar comentarios.