vbams-wordbibliography

MS Word: Macro that creates bibliography bookmarks and then links corresponding text citations to them


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

Solution

  • 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