Excel Avanzado

Macros, Vba en Excel y muchos ejemplos de nuestro Curso de Excel Avanzado

Excel Avanzado

Creación de gráficos con macros (parte 2)

| 5 comentarios

Bueno, ahora  realizaremos una mejora sobre  la creación de gráficos con macros (parte 1)

En la primera parte vimos la creación de un solo gráfico, ahora imaginemos que se tienen que crear varios gráficos, los cuales deseamos que aparezcan ordenados y con un espaciado uniforme entre ellos, los datos de ejemplo podrían ser como se muestra a continuación:

20111018_graficos_segundaparte_datos

Ahora en el código de incorpora un FOR para la cantidad de gráficos que se van a crear, para fines de simplificar el ejemplo asumamos que todos los gráficos deben estar en la misma hoja.

20111018_graficos_segundaparte_vba

Como resultado de la ejecución obtendremos lo siguiente:

20111018_graficos_segundaparte_resultado

Naturalmente cuando se trata de solo un gráfico  el uso de la macro para ello podría considerarse trivial, sin embargo ahora comienza a hacerse necesario a fin de generar siempre el mismo formato para todos los gráficos, la necesidad de utilizar la macro se hace mas notoria cuanto mayor sea el número de gráficos a ser generados.

En un próximo ejemplo incluiremos algunos mejorar mas sobre este ejemplo.

5 comentarios

  1. hola me gustaria saber cual es la parte del codigo donde pones q se ordenen las graficas una debajo de la otra y como puedo cambiar el tamaño ala grafica por codigo yo tengo el sig. codigo que grafica pero la graficame la la ase muy chiquta y me grafica una sobre otra. anexo el codigo aunque esta muy personalizada a cierto formato que tengo pero solo me falta eso que te explico arriva. gracias de antemano
    Sub crear_grafico()
    'Ocultamos el procedimiento
    Application.ScreenUpdating = False
    'Pasamos a una variable la celda donde estamos,
    'para volver a ella al finalizar el macro
    celda_donde_estamos = ActiveCell.Address
    'Vamos al principio del rango de datos
    '(celda de arriba a la izquierda).
    'Mejor usar esto, que CurrentRegion:
    If ActiveCell.Row 1 Then
    If ActiveCell.Offset(-1, 0) "" Then
    Selection.End(xlUp).Select
    End If
    End If
    If ActiveCell.Column 1 Then
    If ActiveCell.Offset(0, -1) "" Then
    Selection.End(xlToLeft).Select
    End If
    End If
    'Pasamos la celda inicial (donde estamos ahora)
    celda_inicial = ActiveCell.Address
    'si la celda está vacía, no creamos el gráfico
    If celda_inicial = "" Or IsEmpty(ActiveCell) Then
    mensaje = MsgBox("No hay datos para crear el gráfico. ", vbInformation, "Imposible crear gráfico")
    Exit Sub
    End If
    'Pasamos a una variable, el nombre de la hoja
    nombre_de_la_hoja = ActiveSheet.Name
    'Pasamos a una variable, el área de datos para el gráfico
    area_de_datos = Range(celda_inicial).CurrentRegion.SpecialCells(xlVisible).Address
    'Creamos el gráfico
    Charts.Add
    'Informamos del tipo de gráfico que deseamos
    ActiveChart.ChartType = xlLineStacked
    'Seleccionamos el área de datos para montar el gráfico
    ActiveChart.SetSourceData Source:=Sheets(nombre_de_la_hoja).Range(area_de_datos), PlotBy:=xlColumns
    'Creamos el gráfico en la hoja donde estamos
    ActiveChart.Location Where:=xlLocationAsObject, Name:=nombre_de_la_hoja
    'Cambiamos el título del gráfico
    With ActiveChart
    .HasTitle = True
    .Axes(xlCategory, xlPrimary).HasTitle = True
    .Axes(xlValue, xlPrimary).HasTitle = True
    End With
    With ActiveChart
    .SeriesCollection(1).Select
    Selection.Delete
    .SeriesCollection(1).Select
    Selection.Delete
    .SeriesCollection(3).Select
    Selection.Delete
    .SeriesCollection(5).Select
    Selection.Delete
    .SeriesCollection(5).Select
    Selection.Delete
    .SeriesCollection(5).Select
    Selection.Delete
    .SeriesCollection(5).Select
    Selection.Delete
    End With
    ActiveChart.ChartType = xlXYScatterLinesNoMarkers
    'Quitamos la leyenda
    ActiveChart.SeriesCollection(2).Select
    ActiveChart.SeriesCollection(2).AxisGroup = 2
    With ActiveChart
    .Axes(xlValue).MinimumScale = 0
    .Axes(xlValue).MinimumScale = 1.2
    .Axes(xlValue).MaximumScale = 3
    .Axes(xlValue).MaximumScale = 3
    .Axes(xlValue).MajorUnit = 0.5
    .Axes(xlValue).MajorUnit = 0.2
    End With
    With ActiveChart
    .Axes(xlValue, xlSecondary).MinimumScale = 270
    .Axes(xlValue, xlSecondary).MinimumScale = 80
    .Axes(xlValue, xlSecondary).MaximumScale = 360
    .Axes(xlValue, xlSecondary).MaximumScale = 440
    .Axes(xlValue, xlSecondary).MajorUnit = 10
    .Axes(xlValue, xlSecondary).MajorUnit = 40
    End With
    ActiveChart.HasLegend = True
    ActiveChart.SeriesCollection(4).Select
    ActiveChart.SeriesCollection(4).AxisGroup = 2
    ActiveChart.Axes(xlCategory, xlPrimary).AxisTitle.Text = "y2"
    ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "y"
    ActiveChart.ChartTitle.Text = "Profile"
    ActiveChart.SetElement (msoElementSecondaryValueAxisTitleRotated)
    ActiveChart.Axes(xlValue, xlSecondary).AxisTitle.Text = _
    "date"
    'Ponemos tamaño 8 para el eje Y
    ActiveChart.Axes(xlCategory).Select
    ActiveChart.Axes(xlValue).HasMajorGridlines = True
    ActiveChart.Axes(xlValue).Select
    Selection.TickLabels.AutoScaleFont = True
    With Selection.TickLabels.Font
    .Size = 12
    End With
    'Ponemos tamaño 8 para el eje X
    ActiveChart.Axes(xlCategory).Select
    Selection.TickLabels.AutoScaleFont = True
    With Selection.TickLabels.Font
    .Size = 12
    End With
    'Ponemos el título en negrita
    ActiveChart.ChartTitle.Select
    Selection.Font.Bold = True
    'Volvemos a la celda donde estábamos inicialmente
    Range(celda_donde_estamos).Select
    'Mostramos el procedimiento
    Application.ScreenUpdating = True
    End Sub

  2. esta funcion, es una muestra de la gran ventaja de un macro, ya que podrias realizar con el propio excel un gráfico, pero tendrias que realizar uno para cada uno, en cambio con la macro, puedes realizarlas todas de un solo paso, solo programando y definiendo las variables.

  3. Cómo sería el código si quisiera que la barra de la peor máquina sea color rojo, y en el caso de la mejor máquina, la barra sea color verde; teniendo en cuenta que mes a mes los rendimientos de las máquinas pueden variar.

    Muchas gracias.

  4. Saludos, les escribo por que necesito de su ayuda. Estoy realizando un gráfico de barras de tres series. Una es averías totales, otra pendiente y la última las solucionadas. Se coloca una fecha determinada y la gráfica muestra las averías del mes hasta el día seleccionado. Hice un filtro que busca todas las fechas del mes hasta la correspondiente a la fecha requerida. Al momento de hecr la gráfica, me es imposible ajustar el eje x y el rango seleccionado a la fecha indicada. Muy agradecido por la ayuda.

  5. saludos, como puedo indicar por medio de vba, la ubicación de un gráfico existente en una hoja.
    me explico:
    necesito que la esquina superior derecha del gráfico se ubique en la esquina superior derecha de una celda.
    esta celda de referencia es dinámica, no es siempre la misma, al ejecutar una macro para crear un reporte debajo de un rango de datos necesito que el gráfico se coloque en la esquina superior derecha de la celda vacia del final del reporte.
    luego al agregar mas datos al reporte y generar nuevamente el reporte logicamente la celda referencia ya no será la misma.
    gracias por su ayuda

Deja una respuesta

Los campos requeridos estan marcados con *.