Sub vbax_52434_ChartSeriesSourceDataAllChartsWB()
Dim wbNamedRanges()
Dim cht As ChartObject, ws As Worksheet
Dim SeriesFormula As String, SeriesAddress As String, SeriesRange As String
Dim i As Long, j As Long
With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
With ThisWorkbook
Select Case .Names.Count
Case Is = 0
MsgBox "There no named ranges in this workbook!"
Case Else
ReDim wbNamedRanges(1 To .Names.Count)
For i = 1 To .Names.Count
wbNamedRanges(i) = .Names(i).Name
Next i
End Select
End With
On Error Resume Next
Worksheets("Chart_Info").Delete
On Error GoTo 0
Worksheets.Add(Before:=Worksheets(1)).Name = "Chart_Info"
Worksheets("Chart_Info").Range("A1:E1").Value = Array("Worksheet_Name", "Chart_Name", "Series_Name", "Source_Data", "Named_Range")
j = 1
For Each ws In Worksheets
For Each cht In ws.ChartObjects
For i = 1 To cht.Chart.SeriesCollection.Count
j = j + 1
SeriesFormula = cht.Chart.SeriesCollection(i).Formula
SeriesAddress = Split(SeriesFormula, ",")(2) '3rd bit in series formula
SeriesRange = Mid(SeriesAddress, InStr(SeriesAddress, "!") + 1) 'remove wb/ws referenece
With Worksheets("Chart_Info")
.Range("A" & j).Value = ws.Name
.Range("B" & j).Value = cht.Name
.Range("C" & j).Value = cht.Chart.SeriesCollection(i).Name
If UBound(Filter(wbNamedRanges, SeriesRange)) > -1 Then
.Range("D" & j).Value = Filter(wbNamedRanges, SeriesRange)(0)
.Range("E" & j).Value = "Yes"
Else
.Range("D" & j).Value = SeriesAddress
.Range("E" & j).Value = "No"
End If
End With
Next i
Next cht
Next ws
Worksheets("Chart_Info").Columns.AutoFit
End Sub
Sub vbax_52434_ChartSeriesSourceDataSingleChart()
Dim wbNamedRanges()
Dim cht As ChartObject
Dim SeriesFormula As String, SeriesAddress As String, SeriesRange As String
Dim i As Long
With ThisWorkbook
Select Case .Names.Count
Case Is = 0
MsgBox "There no named ranges in this workbook!"
Case Else
ReDim wbNamedRanges(1 To .Names.Count)
For i = 1 To .Names.Count
wbNamedRanges(i) = .Names(i).Name
Next i
End Select
End With
Set cht = Worksheets("Sheet1").ChartObjects(1) 'named range
'Set cht = Worksheets("Sheet1").ChartObjects(2) 'not named range
For i = 1 To cht.Chart.SeriesCollection.Count
SeriesFormula = cht.Chart.SeriesCollection(i).Formula
SeriesAddress = Split(SeriesFormula, ",")(2) '3rd bit in series formula
SeriesRange = Mid(SeriesAddress, InStr(SeriesAddress, "!") + 1) 'remove wb/ws referenece
If UBound(Filter(wbNamedRanges, SeriesRange)) > -1 Then
MsgBox "Chart: " & cht.Name & " / Series: " & cht.Chart.SeriesCollection(i).Name & " / Source Data: " & Filter(wbNamedRanges, SeriesRange)(0) & " / Named Range"
Else
MsgBox "Chart: " & cht.Name & " / Series: " & cht.Chart.SeriesCollection(i).Name & " / Source Data: " & SeriesAddress & " / Not Named Range!"
End If
Next
End Sub