I need to link my in-text citations to their corresponding entries in the bibliography list (IEEE style, e.g. [1], [2], [3], etc.).
Surprisingly, this is not something that is automated when exporting to PDF (as with footnotes and endnotes) when using the bibliography tool in Word.
So, I'm trying out macros/VBA to automate this for me, as I work with documents with 50+ references that need hyperlinks.
I'm a total newbie, but I'm trying to learn.
First, I have a macro that turns the in-text citation labels ([1], [2], etc.) to static text. This works fine, and enables me to edit the in-text citations before exporting to PDF. However, the most time consuming work is to link up the citations one by one.
So, after making the citations static text, I want a macro that does the following:
Then, I want the macro (or another macro) to
Could anyone give me some guidance (or correct my code) to help with what I want to achieve?
This is my VBA code as of now, and I cannot get it to function. I run it, but nothing happens - it seems like it won't run, but I get no errors:
Sub CreateBookmarksAndHyperlinks()
' Set the range to bibliography section (section 4)
Dim biblioRange As Range
Set biblioRange = ActiveDocument.Sections(4).Range
' Search for numbers in brackets and create bookmarks
With biblioRange.Find
.ClearFormatting
.Text = "\[[0-9]+\]" ' Search for [1], [2], etc.
.MatchWildcards = True
.Wrap = wdFindStop
Do While .Execute
Dim foundTextBiblio As String
foundTextBiblio = Mid(biblioRange.Text, 2, Len(biblioRange.Text) - 2) ' Extract number between brackets
biblioRange.Bookmarks.Add "Reference" & foundTextBiblio, biblioRange
Loop
End With
' Set the range to main document text (sections 2 and 3)
Dim mainRange As Range
Set mainRange = ActiveDocument.Range(Start:=ActiveDocument.Sections(2).Range.Start, End:=ActiveDocument.Sections(3).Range.End)
' Search for numbers in brackets and insert hyperlinks
With mainRange.Find
.ClearFormatting
.Text = "\[[0-9]+\]" ' Search for [1], [2], etc.
.MatchWildcards = True
.Wrap = wdFindStop
Do While .Execute
Dim foundTextMain As String
foundTextMain = Mid(mainRange.Text, 2, Len(mainRange.Text) - 2) ' Extract number between brackets
If mainRange.Bookmarks.Exists("Reference" & foundTextMain) Then
' Insert hyperlink using the corresponding bookmark
ActiveDocument.Hyperlinks.Add Anchor:=mainRange, Address:="", SubAddress:="Reference" & foundTextMain, TextToDisplay:=mainRange.Text
End If
Loop
End With
End Sub
@
stands for one or more chars in Word searching (@jonsson comments it before my answer)mainRange.Bookmarks.Exists
should be ActiveDocument.Bookmarks.Exists
Hyperlinks.Add
collapses mainRange
to its start, adding mainRange.Move
to move the range.Option Explicit
Sub CreateBookmarksAndHyperlinks()
' Set the range to bibliography section (section 4)
Dim biblioRange As Range
Set biblioRange = ActiveDocument.Sections(4).Range
' Search for numbers in brackets and create bookmarks
With biblioRange.Find
.ClearFormatting
.Text = "\[[0-9]@\]" ' Search for [1], [2], etc.
.MatchWildcards = True
.Wrap = wdFindStop
Do While .Execute
Dim foundTextBiblio As String
foundTextBiblio = Mid(biblioRange.Text, 2, Len(biblioRange.Text) - 2) ' Extract number between brackets
biblioRange.Bookmarks.Add "Reference" & foundTextBiblio, biblioRange
Loop
End With
' Set the range to main document text (sections 2 and 3)
Dim mainRange As Range, iEnd As Long
iEnd = ActiveDocument.Sections(3).Range.End
Set mainRange = ActiveDocument.Range(Start:=ActiveDocument.Sections(2).Range.Start, End:=iEnd)
' Search for numbers in brackets and insert hyperlinks
With mainRange.Find
.ClearFormatting
.Text = "\[[0-9]@\]" ' Search for [1], [2], etc.
.MatchWildcards = True
.Forward = True
.Wrap = wdFindStop
Do While .Execute
If mainRange.Start > iEnd Then Exit Do
Dim foundTextMain As String, iLen As Long
iLen = Len(mainRange.Text)
foundTextMain = Mid(mainRange.Text, 2, iLen - 2) ' Extract number between brackets
If ActiveDocument.Bookmarks.Exists("Reference" & foundTextMain) Then
' Insert hyperlink using the corresponding bookmark
ActiveDocument.Hyperlinks.Add Anchor:=mainRange, Address:="", SubAddress:="Reference" & foundTextMain, TextToDisplay:=mainRange.Text
End If
mainRange.Move Unit:=Word.wdCharacter, Count:=iLen
Loop
End With
End Sub