View Single Post
 
Old 06-13-2012, 05:13 PM
macropod's Avatar
macropod macropod is offline Windows 7 64bit Office 2010 32bit
Administrator
 
Join Date: Dec 2010
Location: Canberra, Australia
Posts: 21,963
macropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond repute
Default

Hi Walt,

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.

Word's Note References always point to the reference in the body of the document, not to the endnote or footnote itself. Likewise, Note References don’t display the corresponding endnote/footnote text as a screen tip. The HyperlinkEndNotesFootNotes macro doesn't change that behaviour. To have the Note References hyperlink to the actual endnote or footnote – and display the corresponding endnote/footnote text as a screen tip – you could use the third macro (HLnkNoteRefs). The fourth macro (KillHLnkNoteRefs) reverses the process.

Macro 1:
Code:
Sub HyperlinkEndNotesFootNotes()
' Turn Off Screen Updating
Application.ScreenUpdating = False
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

  'Process all endnotes
  For i = 1 To .Endnotes.Count
    'Give the OS a chance to do any background processing
    DoEvents
    '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
      .Text = i
      .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 = i
      .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, ScreenTip:=.Endnotes(i).Range.Text
    .Hyperlinks.Add Anchor:=Rng2, SubAddress:="_ERef" & i
    'Restore the Rng1 endnote reference bookmark
    .Bookmarks.Add Name:="_ERef" & i, Range:=Rng1
  Next
 
  'Process all footnotes
  For i = 1 To .Footnotes.Count
    'Give the OS a chance to do any background processing
    DoEvents
    '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
      .Text = i
      .Style = "Footnote Reference"
      .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 = i
      .Style = wdStyleFootnoteReference
      .Bookmarks.Add Name:="_FNum" & i, Range:=Rng2
    End With
    'Insert hyperlinks between the footnote references
    .Hyperlinks.Add Anchor:=Rng1, SubAddress:="_FNum" & i, ScreenTip:=.Footnotes(i).Range.Text
    .Hyperlinks.Add Anchor:=Rng2, SubAddress:="_FRef" & i
    'Restore the Rng1 footnote reference bookmark
    .Bookmarks.Add Name:="_FRef" & i, Range:=Rng1
  Next

  ' Restore original Track Changes status
  .TrackRevisions = TrkStatus
  '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 Screen Updating
Application.ScreenUpdating = True
End Sub
Note:To display the footnote/endnote cross-references as hyperlinks without the screentip, simply delete:
, ScreenTip:=.Endnotes(i).Range.Text
and
, ScreenTip:=.Footnotes(i).Range.Text

Macro 2:
Code:
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
Macro 3:
Code:
Sub HLnkNoteRefs()
Dim Fld As Field, StrTgt As String, Rng As Range, StrRef As String, StrTxt As String
For Each Fld In ActiveDocument.Fields
  With Fld
    If .Type = wdFieldNoteRef Then
      StrTgt = Split(Trim(.Code), " ")(1)
      With ActiveDocument.Bookmarks(Split(Trim(.Code), " ")(1)).Range
        If .Footnotes.Count = 1 Then
          StrTxt = .Footnotes(1).Range.Text
        Else
          StrTxt = .Endnotes(1).Range.Text
        End If
      End With
      Set Rng = Fld.Result.Characters.First.Previous: StrRef = Fld.Result.Text
      With Rng
        .Start = .Start + 1
        .Collapse wdCollapseStart
        .Hyperlinks.Add Anchor:=Rng, SubAddress:=StrTgt, TextToDisplay:=StrRef, ScreenTip:=StrTxt
        .End = .End + 1
        .Hyperlinks(1).Range.Font.Superscript = True
      End With
      .Result.Font.Hidden = True
    End If
  End With
Next
End Sub
To make this process automatic, you could insert:
Call HLnkNoteRefs
after the final:
Next
in the HyperLinkEndNoteFootNotes macro.

Note:To display the footnote/endnote cross-references as hyperlinks without the screentip, simply delete:
, ScreenTip:=StrTxt

Macro 4:
Code:
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:
Next
in the KillEndNoteFootNoteHyperLinks macro.


PS: Macros 1 & 2 reports their progress on Word's status bar.
__________________
Cheers,
Paul Edstein
[Fmr MS MVP - Word]

Last edited by macropod; 07-30-2017 at 10:03 PM.
Reply With Quote