Quizá el mejor modo de familiarizarse con el modelo de objeto de clase Chart sea activar el Grabador de macro mientras se crean y manipulan gráficos.
AÑO 2000 SEAT 1200 BMW 2000 AUDI 3200 FIAT 1300 RENAULT 3100
VENTAS DEL AÑO 2000
1200 2000 3200 1300 3100 0 500 1000 1500 2000 2500 3000 3500
SEAT BMW AUDI FIAT RENAULT
MARCAS
179
Marcela Genero Bocco – Noviembre del 2002
Sub grafico()
Range("A2:E6").Select Charts.Add
ActiveChart .ChartType = xlColumnClustered
ActiveChart .SetSourceData Source:=Sheets("Hoja1").Range("A2:E6"), PlotBy:= _ xlColumns
ActiveChart .Location Where:=xlLocationAsObject , Name:="Hoja1" With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "VENTAS DEL AÑO 2000" .Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "MARCAS" .Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "CANTIDAD" End With
ActiveChart .HasLegend = False
ActiveChart .ApplyDataLabels Type:=xlDataLabelsShowValue, LegendKey:=False End Sub
Excel con VBA
Cuando se genera un gráfico usando el método Add de la colección Charts, el gráfico es siempre una hoja de gráfico. En el código anterior, el método Location mueve el gráfico a una hoja de cálculo.
ACTIVAR UN GRÁFICO
El código VBA puede activar un gráfico incrustado usando el método Activate. ActiveSheet.ChartObjects(“Gráfico 1”).Activate
Si el gráfico se encuentra en una hoja de gráfico, se usa una instrucciión como esta: Sheets(“Gráfico1”)Activate
Una vez activado el gráfico, se puede hacer referencia a él en el código con ActiveChart. Por ejemplo, la siguiente instrucción despliega el nombre del gráfico activo. S no existe un gráfico activo, la instrucción genera un error.
181
Marcela Genero Bocco – Noviembre del 2002
Para modificar un gráfico en VBA, no es necesario activarlo. Veamos un ejemplo que cambia el tipo de gráfico a Areas.
Sub Modificar_Grafico
ActiveSheet.ChartObjects(“Grafico1”).Chart.Type = xlArea End Sub
Convertir un gráfico incrustado en una hoja de gráfico
Sub ConvertChart1()
Sheets(“Hoja1”).ChartObjects(1).Chart.Location xlLocationAsNewShee, “Mi Gráfico” End Sub
Convertir una hoja de gráfico en un gráfico incrustado
Sub ConvertChart2()
Charts(“Mi gráfico”).Location xlLocationAsObject, “Hoja1” End Sub
Excel con VBA
Determinar si un gráfico está activado
La siguiente función CharIsSelected devuelve Verdadero si está activa una hoja de grafico o si está activo un gráfico incrustado, y devuelve Falso si no está activado ningún gráfico: Private Function ChartIsSelected() As boolean
Dim x As String ChartIsSelected = False On Error Resume Next x = ActiveChart.Name
if Err = 0 Then CharIsSelected = True End Function
Eliminar ObjetosGráficos (ChartObjects) de gráficos (Charts)
Para eliminar objetos de clase ChartObject de un libro de trabajo, se puede usar simplemente el método Delete de la colección ChartObjects.
183
Marcela Genero Bocco – Noviembre del 2002
Para eliminar hojas de gráfico de un libro de trabajo activo, se usa la siguiente instrucción:
ActiveWorkBook.Charts.Delete
Normalmente, si se eleminan hojas Excel presenta una advertencia. El usuario debe contestar a este aviso para que pueda continuar la macro. Para elimnar este aviso se usa la siguiente serie de instrucciones:
Application.DisplayAlerts = False ActiveWork.Charts.Delete Application.DisplayAlerts = False
Excel con VBA
Aplicar formato al gráfico
El siguiente ejemplo aplica diferentes tipos de formato al gráfico activo: Sub ChartMod1() with ActiveChart .Type = xlArea .ChartArea.Font.Name = “Arial” .ChartArea.FontStyle = “Regular” .PlotArea.Interior.ColorIndex = xlNone .Axes(xlValue).TickLabels.Font.Bold = True .Axes(xlCategory).TickLabels.Font.Bold = True .HasLegend = True .Legend.Position = xlBottom End with End Sub
185
Marcela Genero Bocco – Noviembre del 2002
Aplicar formato al gráfico
El siguiente ejemplo funciona en un gráfico concreto: el contenido en un ChartObject llamado Gráfico 1, ubicado en la Hoja1. Nótese que el gráfico nunca se activa. Sub ChartMod2()
with Sheets(“Hoja1”).ChartObjects(Gráfico 1”).Chart .Type = xlArea .ChartArea.Font.Name = “Arial” .ChartArea.FontStyle = “Regular” .PlotArea.Interior.ColorIndex = xlNone .Axes(xlValue).TickLabels.Font.Bold = True .Axes(xlCategory).TickLabels.Font.Bold = True .HasLegend = True .Legend.Position = xlBottom End with End Sub
Excel con VBA
Bucle por todos los gráficos
En algunos casos es necesario ejecutar una operación en todos los gráficos. El siguiente ejemplo cambia el tipo de gráfico para cada gráfico incrustado en una hoja activa. Sub Cambiar_Tipo_Grafico1()
For each cht In ActiveSheet.ChartObjects cht.Chart.Type = xlArea Next cht
End Sub
El siguiente procedimiento realiza la misma operación que el procedimiento anterior pero funciona en todas las hojas de gráfico de un libro de trabajo activo:
Sub Cambiar_Tipo_Grafico2()
For each cht In ActiveWorkBook.Charts cht.Type = xlArea
Next cht End Sub
187
Marcela Genero Bocco – Noviembre del 2002
Bucle por todos los gráficos
Sub Cambiar_Leyenda()
For each cht In ActiveSheet.ChartObjects With cht.hart.Legend.Font .Name = “Arial” .FontStyle = “Bold” .Size = 12 End With Next cht End Sub
Alinear y ajustar el tamaño de los ObjetosGráficos (ChartObjects)
Un objeto de clase ChartObject posee propiedades de posición y tamaño estándar, a las que se puede acceder con el código VBA. El siguiente ejemplo ajusta el tamaño de todos los objetos de la clase ChartObject en HOJA1, de forma que se ajusten a las dimensiones del ChartObject llamado Gráfico 1. También ordena los objetos de clase ChartObject de forma que aparezcan uno después del otro a lo largo de la izquierda de la hoja de cálculo:
Excel con VBA
Alinear y ajustar el tamaño de los ObjetosGráficos (ChartObjects)
Sub Tamaño_Posición_Gráficos
W = ActiveSheet.ChartObjects(“Gráfico 1”).Width H = ActiveSheet.ChartObjects(“Gráfico 1”).Height TopPos = 0
For each chtObj in ActiveSheet.ChartObjects with chtObj .Width = W .Height = H .Left = 0 .Top = TopPos End With TopPos = TopPos + H Next chtObj End Sub
189
Marcela Genero Bocco – Noviembre del 2002
Presentar un gráfico en un UserForm
Supongamos que tenemos un procedimiento grafico que genera un gráfico incrustado en la hoja1.
Sub ShowChart () grafico
UserForm1.Show End Sub
Private Sub UserForm1_Initialize()
Set CurrentChart = ActiveSheet .ChartObjects(1).Chart Fname = ThisWork.Path & "\temp.gif"
CurrentChart .Export FileName:=Fname, FilterName:="GIF" Sheets("Hoja1").ChartObjects1(1).Delete
Image1.Picture = LoadPicture(Fname) Application.ScreenUpdating = True Kill ThisWorkbook.Path & "\temp.gif" End Sub
Excel con VBA
Parte 10:
Rangos
191
Marcela Genero Bocco – Noviembre del 2002