When a document is saved in PDF format, endnote & footnote references cease to act as hyperlinks. The following macro replicates the endnote & footnote references (which become hidden text) with bookmarked hyperlinks. The second macro (KillEndNoteFootNoteHyperLinks) reverses the process.
Furthermore, Word's Note References always point to the reference in the body of the document, not to the endnote or footnote itself. The HyperlinkEndNotesFootNotes macro doesn't change that behaviour. To have the Note References hyperlink to the actual endnote or footnote you could use the third macro (HLnkNoteRefs). The fourth macro (KillHLnkNoteRefs) reverses that process.
Sub HyperlinkEndNotesFootNotes()
Dim SBar As Boolean ' Status Bar flag
Dim TrkStatus As Boolean ' Track Changes flag
Dim Rng1 As Range, Rng2 As Range, StrRef As String, i As Long
' Store current Status Bar status, then switch on
SBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
' Store current Track Changes status, then switch off
With ActiveDocument
TrkStatus = .TrackRevisions
.TrackRevisions = False
End With
' Turn Off Screen Updating
Application.ScreenUpdating = False
With ActiveDocument
'Process all endnotes
For i = 1 To .Endnotes.Count
'Update the statusbar
StatusBar = "Processing Endnote " & i
'Define two ranges: one to the endnote reference the other to the endnote content
Set Rng1 = .Endnotes(i).Reference
Set Rng2 = .Endnotes(i).Range.Paragraphs.First.Range
With Rng1
'Format the endnote reference as hidden text
.Font.Hidden = True
'Insert a number before the endnote reference and bookmark it
.Collapse wdCollapseStart
'To get the actual reference text, we need to cross-reference it!
.InsertCrossReference wdRefTypeEndnote, wdEndnoteNumber, i, False, False
.End = .End + 1
StrRef = .Fields(1).Result
.Fields(1).Delete
.Text = StrRef
.Style = wdStyleEndnoteReference
.Bookmarks.Add Name:="_ERef" & i, Range:=Rng1
End With
'Insert a number before the endnote content and bookmark it
With Rng2
'Format the endnote reference as hidden text
With .Words.First
If .Characters.Last Like "[ " & vbTab & "]" Then .End = .End - 1
.Font.Hidden = True
End With
'Insert a number before the endnote reference and bookmark it
.Collapse wdCollapseStart
.Text = StrRef
.Style = " Endnote Reference"
.Bookmarks.Add Name:="_ENum" & i, Range:=Rng2
End With
'Insert hyperlinks between the endnote references
.Hyperlinks.Add Anchor:=Rng1, SubAddress:="_ENum" & i
.Hyperlinks.Add Anchor:=Rng2, SubAddress:="_ERef" & i
'Restore the Rng1 endnote reference bookmark
.Bookmarks.Add Name:="_ERef" & i, Range:=Rng1
Next
'Give Word a chance to do its housekeeping
DoEvents
'Process all footnotes
For i = 1 To .Footnotes.Count
'Update the statusbar
StatusBar = "Processing Footnote " & i
'Define two ranges: one to the footnote reference the other to the footnote content
Set Rng1 = .Footnotes(i).Reference
Set Rng2 = .Footnotes(i).Range.Paragraphs.First.Range
With Rng1
'Format the footnote reference as hidden text
.Font.Hidden = True
'Insert a number before the footnote reference and bookmark it
.Collapse wdCollapseStart
'To get the actual reference text, we need to cross-reference it!
.InsertCrossReference wdRefTypeFootnote, wdFootnoteNumber, i, False, False
.End = .End + 1
StrRef = .Fields(1).Result
.Fields(1).Delete
.Text = StrRef
.Text = i
.Style = wdStyleFootnoteReference
.Bookmarks.Add Name:="_FRef" & i, Range:=Rng1
End With
'Insert a number before the footnote content and bookmark it
With Rng2
'Format the footnote reference as hidden text
With .Words.First
If .Characters.Last Like "[ " & vbTab & "]" Then .End = .End - 1
.Font.Hidden = True
End With
'Insert a number before the footnote reference and bookmark it
.Collapse wdCollapseStart
.Text = StrRef
.Style = " Footnote Reference"
.Bookmarks.Add Name:="_FNum" & i, Range:=Rng2
End With
'Insert hyperlinks between the footnote references
.Hyperlinks.Add Anchor:=Rng1, SubAddress:="_FNum" & i
.Hyperlinks.Add Anchor:=Rng2, SubAddress:="_FRef" & i
'Restore the Rng1 footnote reference bookmark
.Bookmarks.Add Name:="_FRef" & i, Range:=Rng1
Next
'Update the statusbar
StatusBar = "Finished Processing " & .Endnotes.Count & " Endnotes" & .Footnotes.Count & " Footnotes"
End With
Set Rng1 = Nothing: Set Rng2 = Nothing
' Restore original Status Bar status
Application.DisplayStatusBar = SBar
' Restore original Track Changes status
ActiveDocument.TrackRevisions = TrkStatus
' Restore Screen Updating
Application.ScreenUpdating = True
End Sub
Sub KillEndNoteFootNoteHyperLinks()
Dim SBar As Boolean ' Status Bar flag
Dim TrkStatus As Boolean ' Track Changes flag
Dim Rng1 As Range, Rng2 As Range, i As Long
' Store current Status Bar status, then switch on
SBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
' Store current Track Changes status, then switch off
With ActiveDocument
TrkStatus = .TrackRevisions
.TrackRevisions = False
End With
' Turn Off Screen Updating
Application.ScreenUpdating = False
With ActiveDocument
'Delete endnote/footnote hyperlinks from the MainStory
For i = .Hyperlinks.Count To 1 Step -1
With .Hyperlinks(i)
StatusBar = "Processing Hyperlink " & i
If .SubAddress Like "_ENum*" Then
.Range.Delete
ElseIf .SubAddress Like "_FNum*" Then
.Range.Delete
End If
End With
Next i
'Delete endnote hyperlinks from the EndnotesStory
If .Endnotes.Count > 0 Then
With .StoryRanges(wdEndnotesStory)
For i = .Hyperlinks.Count To 1 Step -1
StatusBar = "Processing Endnote Hyperlink " & i
With .Hyperlinks(i)
If .SubAddress Like "_ERef*" Then .Range.Delete
End With
Next i
End With
End If
'Delete footnote hyperlinks from the FootnotesStory
If .Footnotes.Count > 0 Then
With .StoryRanges(wdFootnotesStory)
For i = .Hyperlinks.Count To 1 Step -1
StatusBar = "Processing Footnote Hyperlink " & i
With .Hyperlinks(i)
If .SubAddress Like "_FRef*" Then .Range.Delete
End With
Next i
End With
End If
'Process all endnotes
For i = 1 To .Endnotes.Count
'Update the statusbar
StatusBar = "Processing Endnote " & i
'Define two ranges: one to the endnote reference the other to the endnote content
Set Rng1 = .Endnotes(i).Reference
Set Rng2 = .Endnotes(i).Range.Paragraphs.First.Range
'Format the endnote reference as visible text
Rng1.Font.Hidden = False
Rng2.Words.First.Font.Hidden = False
Next
'Process all footnotes
For i = 1 To .Footnotes.Count
'Update the statusbar
StatusBar = "Processing Footnote " & i
'Define two ranges: one to the footnote reference the other to the footnote content
Set Rng1 = .Footnotes(i).Reference
Set Rng2 = .Footnotes(i).Range.Paragraphs.First.Range
'Format the footnote reference as visible text
Rng1.Font.Hidden = False
Rng2.Words.First.Font.Hidden = False
Next
'Update the statusbar
StatusBar = "Finished Processing " & .Endnotes.Count & " Endnotes" & .Footnotes.Count & " Footnotes"
End With
Set Rng1 = Nothing: Set Rng2 = Nothing
' Restore original Status Bar status
Application.DisplayStatusBar = SBar
' Restore original Track Changes status
ActiveDocument.TrackRevisions = TrkStatus
' Restore Screen Updating
Application.ScreenUpdating = True
End Sub
Sub HLnkNoteRefs()
Dim Fld As Field, StrTgt As String, Rng As Range, StrRef As String
ActiveDocument.ActiveWindow.View.ShowFieldCodes = True
For Each Fld In ActiveDocument.Fields
With Fld
If .Type = wdFieldNoteRef Then
StrTgt = ActiveDocument.Bookmarks(Split(Trim(.Code), " ")(1)).Range.Characters.First.Hyperlinks(1).SubAddress
StrRef = .Result
Set Rng = .Code
With Rng
While .Fields.Count = 0
.Start = .Start - 1
Wend
.Collapse wdCollapseStart
.Hyperlinks.Add Anchor:=Rng, SubAddress:=StrTgt, TextToDisplay:=StrRef
.End = .End + 1
.Hyperlinks(1).Range.Font.Superscript = True
End With
.Result.Font.Hidden = True
End If
End With
Next
ActiveDocument.ActiveWindow.View.ShowFieldCodes = False
End Sub
To make this process automatic, you could insert:
Call HLnkNoteRefs
after the final:
End With
in the HyperLinkEndNoteFootNotes macro.
Sub KillHLnkNoteRefs()
Dim Fld As Field
For Each Fld In ActiveDocument.Fields
With Fld
If .Type = wdFieldNoteRef Then
.Result.Font.Hidden = False
End If
End With
Next
End Sub
To make this process automatic, you could insert:
Call KillHLnkNoteRefs
after the final:
End With
in the KillEndNoteFootNoteHyperLinks macro.
For PC macro installation & usage instructions, see:
http://www.gmayor.com/installing_macro.htm
For Mac macro installation & usage instructions, see:
http://word.mvps.org/Mac/InstallMacro.html