Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loop through all charts in a workbook with VBA

I am trying to loop through all charts in a workbook. Why is option 1 working, but option 2 not?

'OPTION 1

For Each sht In ActiveWorkbook.Worksheets
    For Each cht In sht.ChartObjects
        MsgBox (cht.Name)
    Next cht
Next sht

'OPTION2

Dim oChart As Chart
    For Each oChart In Application.Charts
        MsgBox (oChart.Name)
    Next oChart
End Sub
like image 828
basje123 Avatar asked Dec 04 '22 00:12

basje123


2 Answers

There are two flavors of charts:

  1. "big" charts - an entire chart sheet
  2. "little" charts - chart objects embedded in a worksheet

This code:

Sub dural()
    Dim oChart As Chart
    For Each oChart In Application.Charts
        MsgBox oChart.Parent.Name & vbCrLf & oChart.Name
    Next oChart
End Sub

will display information about the "big" variety.

and if you want information on the "little" charts:

Sub dural2()
    Dim sh As Worksheet, i As Long
    For Each sh In Worksheets
        If sh.ChartObjects.Count > 0 Then
            For i = 1 To sh.ChartObjects.Count
                MsgBox sh.ChartObjects(i).Chart.Name
            Next i
        End If
    Next sh
End Sub

Note that we need an explicit If statement to handle sheets with no charts and .Chart is used to access the Chart within each of the ChartObjects list.

like image 165
Gary's Student Avatar answered Dec 14 '22 11:12

Gary's Student


As the documentation states, Application.Charts returns a Sheets collection containg all chart sheets (not charts!). For Worksheet.ChartObjects, however, the documentation says that it returns a ChartObjects collection containing all charts on that sheet.

like image 21
Leviathan Avatar answered Dec 14 '22 11:12

Leviathan