Dragon Drop - A Visual Basic Software Consultancy

Word Code

Go To Next Bookmark

A client wanted a VBA routine which would enable the user of the document to move to the next bookmrk in the same way that pressing F5 would do. However, there was a slight twist to the requirement; this was that this would only work for bookmarks beginning with a certain string. What the client wanted was for this to move between all bookmarks beginning with "temp".

Below is the code:


Option Explicit

  Const BOOKMARK_LABEL As String = "temp"
'



Sub FindNextBookmark()

  Dim oBookmark As Bookmark
  Dim nCurrentPosition As Long
  Dim nPosition As Long
  
  Dim nFirstPosition As Long
  Dim sFirstBookmark As String
  
  Dim nNextPosition As Long
  Dim sNextBookmark As String
  
  
  If Documents.Count > 0 Then
    nCurrentPosition = Selection.Range.Start
    
    nNextPosition = 0
    nFirstPosition = 0
    
    For Each oBookmark In ActiveDocument.Bookmarks
      If InStr(1, oBookmark.Name, BOOKMARK_LABEL, vbTextCompare) = 1 Then
      
        nPosition = oBookmark.Start
              
        ' Check for the first bookmark on the document in case
        ' the selection wraps around
        If nFirstPosition = 0 Or nPosition < nFirstPosition Then
          nFirstPosition = nPosition
          sFirstBookmark = oBookmark.Name
        End If
          
        ' Check for the next position ahead of the current position
        If nPosition > nCurrentPosition And (nPosition < nNextPosition Or nNextPosition = 0) Then
          nNextPosition = nPosition
          sNextBookmark = oBookmark.Name
        End If
      End If
    Next oBookmark
      
    If nNextPosition > 0 Then
      ActiveDocument.Bookmarks(sNextBookmark).Range.Select
    ElseIf nFirstPosition > 0 Then
      ActiveDocument.Bookmarks(sFirstBookmark).Range.Select
    End If
  
  End If

End Sub


As with most software projects the hard part is working out what the problem is and how to solve it. After a few moment's consideration I came up with this following solution. No doubt there are other solutions possible, some more elegant than this one. However, this is rather simple and straightforward.

The main component of this routine is a loop which goes through each bookmark in the document's collection (after making sure that there is at least one document open, of course) and then checking to see if the bookmark begins with the string of interest, in this case "temp".

If the user wanted to this to work without having the string and just to rattle through each bookmark in turn then the If Instr() Then...End If statements can be removed.

All that happens is then for each of these bookmarks the position of the bookmark (measured in characters) is recorded. If it is the first bookmark of the document or whether it's the next bookmark to the current position then the details are recorded.

After each bookmark is analysed then if there is a bookmark of interest after the current position the the next one is selected. Failing that, the first bookmark of interest in the document, if it exists, is selected so that the user wraps around the bookmarks in positional order. If there are no bookmarks of interest located then the user's selection is not altered.

So despite the rather complicated specification a rather simple piece of code was all that was required.

This code can be downloaded from here.

Updates or Comments

If there are any suggestions for updates or comments then please drop us a mail at malcolm.smith@dragondrop.com.