Chart Gallery
Video Tutorials
Trend Analysis
Using R
Data Visualization
 Global Warming
Map Excel Data with Google Earth
Chart Doctor
Advanced Chart Techniques
What's New
 Search Site RSS
   04/4/2008 4:30 PM




     Chart Object Information                      Chart List                 Freeze Chart Text Size          Size & Align Charts

Top Chart Object Information - The file path to Excel 2003's  Chart Help File is "C:\Program Files\Microsoft Office\OFFICE11\1033\VBAGR10.CHM".

I created a desktop link to this file and use it often to help me figure out some issue or other with the incredibly complicated Chart Object Model.

I read several books on VBA programming and was always confused about which sub objects belong to which object and how properties and methods fit into the picture. I really believe that I could have reduced my VBA - Chart learning curve if I had started with Excel's help file.

The file includes a hyperlinked Chart Object Model that you can use to navigate to specific chart elements to see how they relate to other chart elements and to view sample VBA code


 If you click on an object, say Plot Area, you get detailed information on the PlotArea Object as shown in the graphic below. If you press the Multiple Objects box, it lists the sub objects of the Plot Area. You can then hyperlink to the sub objects.

Top  Chart List

This procedure counts the number of chartobjects on the activesheet and then prepares a list of all charts, listing the chart name, index, top and left position as well as chart width and height.

Public Sub chart_list()
Dim chtobj As ChartObject
Dim Msg As String
Dim n As Integer
n = ActiveSheet.ChartObjects.Count
Msg = "Chart List for Sheet " & vbTab & ActiveSheet.Name & vbTab & "No charts = " & n & vbCrLf & vbCrLf
Msg = Msg & "Name " & vbTab & vbTab & "Index" & vbTab & "Top Pos" & vbTab & "Left Pos " & vbTab & "Width " & vbTab & "Height" & vbCrLf
For Each chtobj In ActiveSheet.ChartObjects
cht_width = chtobj.Width
cht_height = chtobj.Height
Top_Position = chtobj.Top
Left_Position = chtobj.Left
Msg = Msg & chtobj.Name & vbTab & vbTab & chtobj.Index & vbTab & Top_Position & vbTab & Left_Position & vbTab & cht_width & vbTab & cht_height & vbCrLf
Next chtobj
out = MsgBox(Msg, , "Chart List")
End Sub

Top Freeze Text Font Size

Excel's chart text format has a property to enable auto scaling so that the font is changed whenever the chart size changes. This can be a nuisance in cases where you have a nice chart format that you do not want adjusted when you tweak the chart size.

Jon Peltier has good discussion of this issue



Here is a simple VBA procedure to count the number of embedded charts on the  activesheet, cycle through each sheet and set autoscale to false.

  Public Sub Freeze_text()
  Dim chtobj As ChartObject
  Dim Msg As String
  Dim n As Integer
  n = ActiveSheet.ChartObjects.Count
  'Msg = "There are " & n & " charts " & vbNewLine
  For Each chtobj In ActiveSheet.ChartObjects
  With chtobj.Chart.ChartArea
      .AutoScaleFont = False
  End With
  Next chtobj
  End Sub

Top Size & Align Charts

Do you have several embedded charts on a worksheet? Do you want to line them up vertically or display them in a matrix 3 across by 4 down?

The Size_Align_Charts procedure counts the number of charts on your activesheet, freezes chart text font size,  asks User for number of charts across,  desired chart width and height in points and start cell for chart placement. Based on these User specifications, procedure sizes and aligns charts.

Chrt_size_align.xls includes an example of this procedure as well as the freeze font procedure.


Sub Size_align_charts()
'Procedure to size and align embedded charts on active worksheet
' Developed by D. Kelly O'Day, ProcessTrends.Com
' User specifies: Number of charts across (1 to max )
' Chart width - points
' Chart Height - points
' User selects start cell for charts
' Procedure automatically freezes text size to avoid distorting text as charts resized
Dim chrt_width As Single
Dim chrt_height As Single
Dim Chrts_across As Long
Dim Chrt_cnt As Long
Dim i As Integer
Dim Start_Top As Single
Dim Start_Left As Single
Chrt_cnt = ActiveSheet.ChartObjects.Count
'  Check to see if charts on sheet - terminate if no charts
If Chrt_cnt = 0 Then
     MsgBox ("No charts on sheet. Terminating.")
End If
Call Freeze_text ' Procedure to freeze text to for all charts on active sheet
Chrts_across = InputBox("How many charts across do you wants?", "Charts Across", , 0, 0)
chrt_width = InputBox("Enter Chart Width - Points?", "Chart Width - Points", , 0, 0)
chrt_height = InputBox("Enter Chart Height - Points", "Chart Height - Points", , 0, 0)
Set start_cell = Application.InputBox(prompt:="Select start celll for chart(s)", Type:=8)
On Error GoTo 0
If start_cell Is Nothing Then
     MsgBox "You did not select a cell. Exiting procedure."
End If
' Go to start_cell range
Application.Goto reference:=start_cell
     Start_Top = start_cell.Top
     Start_Left = start_cell.Left
' Loop through all charts on active sheet
For i = 1 To Chrt_cnt
      With ActiveSheet.ChartObjects(i)
        .Width = chrt_width
        .Height = chrt_height
         v = i - 1
        .Left = Start_Left + (v Mod Chrts_across) * chrt_width
       .Top = Start_Top + Int((i - 1) / Chrts_across) * chrt_height
    End With
End Sub