View Single Post
 
Old 03-23-2024, 07:39 AM
gmaxey gmaxey is offline Windows 10 Office 2019
Expert
 
Join Date: May 2010
Location: Brasstown, NC
Posts: 1,437
gmaxey is a jewel in the roughgmaxey is a jewel in the roughgmaxey is a jewel in the roughgmaxey is a jewel in the rough
Default Method A or Method B

A few days ago there was a post in this forum regarding jumping from the current selection to the next REF field. Not wanting to give away another fish, I suggested the OP revise their existing code to set the starting range at the end of the current selection range.

A simple test proved that would achieve the basic goal.

However, after giving it more thought, I realized that a process to jump to a specific field type should have a few escapes and consider A) The absence of any REF fields in a document and B) what to do (if anything) when the selection is already at last REF field in the document. Then I thought maybe using the BuiltIn Selection GoTo method might work as well or better. Here are the two variations I came up with:


Code:
Sub Find_JumpToNextCrossReference()
'Method A
Dim oRng As Range
Dim oFld As Field
  Set oRng = Selection.Range.Duplicate
  oRng.End = ActiveDocument.Range.End
  If ActiveDocument.Fields.Count > 0 Then
LoopToStart:
  If oRng.Fields.Count > 0 Then
    If oRng.Fields.Count = 1 And oRng.Fields(1).Result.Start = oRng.Start Then
      oRng.Start = oRng.Fields(1).Result.End + 1
      If MsgBox("This is the last REF field. Do you want to loop to the beginning of the document?,", vbQuestion + vbYesNo, "LOOP") = vbYes Then
        oRng.Start = ActiveDocument.Range.Start
      End If
    End If
    For Each oFld In oRng.Fields
      If oFld.Type = wdFieldRef Then
        If oFld.Result.Start > oRng.Start Then
          oFld.Result.Select
          Exit For
        End If
      End If
    Next oFld
    If oRng.Start = Selection.Range.Start Then
      MsgBox "There are no REF fields in the document.", vbInformation + vbOKOnly, "NO CROSS REFERENCES FOUND"
    End If
  Else
    If MsgBox("There is no subsequent REF field in this document. Do you want to loop to the beginning of the document?", vbQuestion + vbYesNo, "LOOP FROM START") = vbYes Then
      oRng.Start = ActiveDocument.Range.Start
      GoTo LoopToStart
    End If
  End If
  Else
     MsgBox "There are no REF fields in this document.", vbInformation + vbOKOnly, "NO CROSS REFERENCES FOUND"
  End If
lbl_Exit:
  Exit Sub
End Sub

Sub GoToNextREFField()
'Method B
Dim lngStart As Long
Dim lngCount As Long
Dim lngFldCount As Long
Dim oRngRef As Range, oRng As Range
  Application.ScreenUpdating = False
  Set oRngRef = Selection.Range.Duplicate
  lngFldCount = ActiveDocument.Fields.Count
LoopToStart:
  lngCount = 0
  Do
    Set oRng = Selection.Range.Duplicate
    lngStart = Selection.Range.Start
    Selection.GoToNext (wdGoToField)
    'Get field in selection
    Selection.MoveEnd , 1
    lngCount = lngCount + 1
    If Selection.Start = oRng.Start Then Exit Do
  Loop Until Selection.Fields(1).Type = wdFieldRef
  Select Case True
    Case lngCount > lngFldCount And Selection.Fields.Count = 0
      MsgBox "There are no REF fields in the document.", vbInformation + vbOKOnly, "NOTHING TO GOTO"
    Case lngCount > lngFldCount And Selection.Fields(1).Type <> wdFieldRef
      MsgBox "There are no REF fields in the document.", vbInformation + vbOKOnly, "NOTHING TO GOTO"
      oRngRef.Select
    Case Selection.Fields(1).Type <> wdFieldRef Or (Selection.Start = oRngRef.Start And Selection.Fields(1).Type = wdFieldRef)
     If MsgBox("There is no subsequent REF field in this document." & vbCr + vbCr _
         & "Do you want to loop to the start of the document?", vbInformation + vbYesNo, "LOOP") = vbYes Then
         ActiveDocument.Range(0, 0).Select
         GoTo LoopToStart
      Else
        oRngRef.Select
      End If
  End Select
Application.ScreenUpdating = True
lbl_Exit:
  Exit Sub
End Sub

Interested in any critical, constructive comments on either method.
__________________
Greg Maxey
Please visit my web site at http://www.gregmaxey.com/
Reply With Quote