domingo, 4 de julio de 2010

VBA: Gráfico 'dinámico' con autoescalado.

Sigo investigando y aprendiendo con esto de las macros en Excel... en esta ocasión he querido buscar la forma de obtener un gráfico 'dinámico', ajustado en cada momento al número de datos de la tabla origen; y por incorporar algo más de valor añadido al código VBA, he editado la programación para que de un autoescalado adaptado a los valores de la serie.

Para empezar a trabajar con este asunto hemos de acordar que la tabla origen de datos, desde la que construiremos el Gráfico, debe estar situado en las columnas A y B, siendo necesario que los valores que emplearemos para los títulos del eje X empezarán en la celda A2, así como los valores que se incorporarán en el gráfico en modo columnas en la celda B2, dejando la celda B1 para el título de la Serie.

Por supuesto, como siempre, estoy a disposición de cualquier usuario avanzado para mejorar o cambiar algo de lo que voy a explicar.

Supongamos entonces que tenemos el siguiente origen de datos:



Contruiré entonces el código que nos permitirá alcanzar nuestra meta. Dentro del Editor de VBA insertaremos un nuevo Módulo:

'macro que genera un gráfico adaptado al número de valores, ajustando su escalado.
Sub Macro1()
'definimos las variables que emplearemos en el desarrollo de la macro
Dim rngtit, rngdat As String
Dim fin As Integer
Dim max, min As Variant
Dim unit, valores As Variant
Dim nombrehoja, rangocelda As String
'asignamos a las variables nombrehoja y rangocelda un valor
nombrehoja = ActiveSheet.Name
rangocelda = ActiveCell.Address

fin = Cells(Worksheets("Hoja1").Range("B" & Rows.Count).End(xlUp).Row, 1).Row

rngtit = "A2:A" & fin
rngdat = "B1:B" & fin

'el siguiente código crea el gráfico de columnas
'partiendo del rango de datos de la columna B

ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range(rngdat)
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SeriesCollection(1).XValues = Range(rngtit)

'definimos los cálculos que permitirán el ajuste automático del escalado del gráfico.
max = Application.WorksheetFunction.max(Range("B2:B" & fin))
min = Application.WorksheetFunction.min(Range("B2:B" & fin))
unit = WorksheetFunction.Average(Range("B2:B" & fin))
valores = Range("B2:B" & fin).CountLarge

'terminamos con el desarrollo que proporciona el escalado del eje Y.
With ActiveChart.Axes(xlValue)
.MinimumScale = min * 0.95
.MaximumScale = max * 1.05
.MinorUnit = unit / valores
.MajorUnit = unit / valores
End With

'por último la macro nos devuelve a una celda activa de la Hoja de cálculo activa
Sheets(nombrehoja).Range(rangocelda).Select
End Sub



Podemos observar que el gráfico que se construye a partir de esta macro se adapta independientemente de los valores de la Tabla origen, así como del número de registros de ésta.

1 comentario:

  1. Buen dia, me pudes apoyar use este ejercicio y lo adapte a mi caso, pero como no tengo el mismo rango no me funciono. Saludos

    ResponderEliminar

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