Dragon Drop
Dragon Drop - A Software Consultancy
Home      Our Products      Consultancy      Web Page Development      Services      Coding      Windows      External Resources     
Links      Newsletter      News And Issues      Books etc.      About Us     
CODING:   Exchange      Visual Basic      VBA      HomeSite     |     Coding Tools      Software Clinic     

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.