Links can also be found in charts, and not just the source data but even the titles! They can also be found on objects, e.g., a combobox whose ListFillRange property is a range in another workbook.
Here's some code I wrote to find all links. I hope you can copy-and-paste it OK! It creates a tab-delmited text file in the active workbook's folder with a list of all the links from formulas, names, charts and objects.
Const LinkRefPattern1$ = "*.xl??]*", LinkRefPattern2$ = "*.xl?]*"
Public Sub AllLinks()
Dim Rg As Range, Rg1 As Range, WS As Worksheet, Nm As Name, Ch As Chart, cs As ChartObject
Dim Obj As Object, Sh As Shape, F%, FN$, Flag As Boolean, TestStr$
Close
F% = FreeFile(): FN$ = ActiveWorkbook.FullName & " Links.txt": Open FN$ For Output As #F%
Print #F%, "Type"; vbTab; "Worksheet"; vbTab; "Source"; vbTab; "Target"
If Application.Workbooks.Count > 2 Then ' Including this workbook
MsgBox "Please close all but the one workbook in which to find links.", vbExclamation
Exit Sub
End If
For Each Nm In ActiveWorkbook.Names ' Name links
If Nm.RefersToLocal Like LinkRefPattern1$ Or Nm.RefersToLocal Like LinkRefPattern2$ Then
Flag = True: Print #F%, "Name"; vbTab;
If TypeName$(Nm.Parent) <> "Workbook" Then Print #F%, Nm.Parent.Name;
Print #F%, vbTab; Nm.Name; vbTab; "'"; Nm.RefersToLocal
End If
Next
For Each Ch In ActiveWorkbook.Charts ' Links in chart sheets
Flag = AllChartLinks(F%, Ch)
Next
For Each WS In ActiveWorkbook.Worksheets
' Formula links
Set Rg1 = WS.Cells.Find(LinkRefPattern1$, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not (Rg1 Is Nothing) Then
Set Rg = Rg1
Do
If Rg.HasFormula Then Print #F%, "Formula"; vbTab; WS.Name; vbTab; Rg.AddressLocal(False, False); vbTab; "'"; Rg.FormulaLocal
Set Rg = WS.Cells.FindNext(Rg)
If Rg Is Nothing Then Exit Do
Loop Until Rg.Address = Rg1.Address
End If
Set Rg1 = WS.Cells.Find(LinkRefPattern2$, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not (Rg1 Is Nothing) Then
Set Rg = Rg1
Do
If Rg.HasFormula Then Print #F%, "Formula"; vbTab; WS.Name; vbTab; Rg.AddressLocal(False, False); vbTab; "'"; Rg.FormulaLocal
Set Rg = WS.Cells.FindNext(Rg)
If Rg Is Nothing Then Exit Do
Loop Until Rg.Address = Rg1.Address
End If
For Each cs In WS.ChartObjects ' Links in chart objects on worksheets
Flag = AllChartLinks(F%, cs.Chart, WS)
Next
On Error Resume Next
For Each Sh In WS.Shapes ' Shape links
TestStr$ = "": TestStr$ = Sh.ControlFormat.LinkedCell
If TestStr$ Like LinkRefPattern1$ Or TestStr$ Like LinkRefPattern2$ _
Then Flag = True: Print #F%, "Shape CF Link"; vbTab; WS.Name; vbTab; Sh.Name; vbTab; "'"; Sh.ControlFormat.LinkedCell
TestStr$ = "": TestStr$ = Sh.ControlFormat.ListFillRange
If TestStr$ Like LinkRefPattern1$ Or TestStr$ Like LinkRefPattern2$ _
Then Flag = True: Print #F%, "Shape CF List"; vbTab; WS.Name; vbTab; Sh.Name; vbTab; "'"; Sh.ControlFormat.ListFillRange
TestStr$ = "": TestStr$ = Sh.DrawingObject.LinkedCell
If TestStr$ Like LinkRefPattern1$ Or TestStr$ Like LinkRefPattern2$ _
Then Flag = True: Print #F%, "Shape DO Link"; vbTab; WS.Name; vbTab; Sh.Name; vbTab; "'"; Sh.DrawingObject.LinkedCell
TestStr$ = "": TestStr$ = Sh.DrawingObject.ListFillRange
If TestStr$ Like LinkRefPattern1$ Or TestStr$ Like LinkRefPattern2$ _
Then Flag = True: Print #F%, "Shape DO List"; vbTab; WS.Name; vbTab; Sh.Name; vbTab; "'"; Sh.DrawingObject.ListFillRange
Next
For Each Obj In WS.OLEObjects ' Object links
TestStr$ = "": TestStr$ = Obj.LinkedCell
If TestStr$ Like LinkRefPattern1$ Or TestStr$ Like LinkRefPattern2$ _
Then Flag = True: Print #F%, "Object Link"; vbTab; WS.Name; vbTab; Obj.Name; vbTab; "'"; Obj.LinkedCell
TestStr$ = "": TestStr$ = Obj.ListFillRange
If TestStr$ Like LinkRefPattern1$ Or TestStr$ Like LinkRefPattern2$ _
Then Flag = True: Print #F%, "Object List"; vbTab; WS.Name; vbTab; Obj.Name; vbTab; "'"; Obj.ListFillRange
Next
On Error GoTo 0
Next
If Not Flag Then Print #F%, "None"
Close #F%
End Sub
Private Function AllChartLinks(F%, Ch As Chart, Optional WS As Worksheet = Nothing) As Boolean
Dim cs As Series, Ax As Axis, DL As DataLabel, FL$, WSname$, Flag As Boolean
If Not (WS Is Nothing) Then WSname$ = WS.Name
For Each cs In Ch.SeriesCollection
FL$ = ""
On Error Resume Next
FL$ = cs.FormulaLocal
On Error GoTo 0
If FL$ Like "=SERIES(*,*," & LinkRefPattern1$ & "!*,*)" Or FL$ Like "=SERIES(*,*," & LinkRefPattern2$ & "!*,*)" _
Then Flag = True: Print #F%, "Chart Series"; vbTab; WSname$; vbTab; Ch.Name; "/"; cs.Name; vbTab; "'"; FL$
If cs.HasDataLabels Then
For Each DL In cs.DataLabels
If DL.FormulaLocal Like LinkRefPattern1$ Or DL.FormulaLocal Like LinkRefPattern2$ _
Then Flag = True: Print #F%, "Chart Series Label"; vbTab; WSname$; vbTab; Ch.Name; "/"; cs.Name; "/"; DL.Name; vbTab; "'"; DL.FormulaLocal
Next
End If
Next
If Ch.HasTitle _
Then If Ch.ChartTitle.FormulaLocal Like LinkRefPattern1$ Or Ch.ChartTitle.FormulaLocal Like LinkRefPattern2$ _
Then Flag = True: Print #F%, "Chart Title"; vbTab; WSname$; vbTab; Ch.Name; vbTab; "'"; Ch.ChartTitle.FormulaLocal
For Each Ax In Ch.Axes
If Ax.HasTitle _
Then If Ax.AxisTitle.FormulaLocal Like LinkRefPattern1$ Or Ax.AxisTitle.FormulaLocal Like LinkRefPattern2$ _
Then Flag = True: Print #F%, "Axis Title"; vbTab; WSname$; vbTab; Ch.Name; " / "; AxisGroup$(Ax.AxisGroup); vbTab; "'"; Ax.AxisTitle.FormulaLocal
Next
AllChartLinks = Flag
End Function