I need to insert a cross reference to a particular numbered item (from a simple numbered list) given the text of the numbered item. The user selects the list item they want to cross reference as well as the location to insert the cross reference as shown below:
1. This is item 1
2. This is item 2 <-- user selects this line
3. This is item 3
------------------
[2] This is a reference to item 2 <-- user ctrl selects this line too
^ macro will insert the 2 as a cross reference to the selected list item
However, there can be many numbered items with the same text so I need a way to determine which of the items is the selected one. I plan on selecting each of the items that have the correct text, checking to see it if is at the correct location in the document and if it is I now know its "ReferenceItem:" number so I can insert a cross reference to it. I loop through the results of:
ActiveDocument.GetCrossReferenceItems(wdRefTypeNumberedItem)
to get reference numbers for the numbered items with the correct text but I can't figure out how to select each of the candidates so I can test its location. Something like:
ActiveDocument.Goto.CrossReferenceItem(81)
This is in Word 2010.
Code example (all error checking removed):
'Create a temporary character style
ActiveDocument.Styles.Add "_TEMP_STYLE_", wdStyleTypeCharacter
'Apply the temporary style to the discontiguous selection
Selection.Style = ActiveDocument.Styles("_TEMP_STYLE_")
Set olRange = ActiveDocument.Range
With olRange.Find
.ClearAllFuzzyOptions
.ClearFormatting
.ClearHitHighlight
.Style = ActiveDocument.Styles("_TEMP_STYLE_")
.Text = ""
.Wrap = wdFindStop
'llNumberedParaStart is used in the check of a numbered item to see if it is
'the right one
llNumberedParaStart = -1
llChildParaStart = -1
Do While .Execute
If .Found Then
If olRange.Paragraphs(1).Range.ListFormat.ListType = wdListSimpleNumbering Then
llNumberedParaStart = olRange.Characters(1).Start
' Do some work before this to get the text to check for
slNumberedParaText = Selection.Text
Else
llChildParaStart = olRange.Characters(1).Start
End If
Loop
End With
slaNumItems = ActiveDocument.GetCrossReferenceItems(wdRefTypeNumberedItem)
'Loop through all the numbered items and find the correct one
For ilRefItem = 0 To UBound(slaNumItems)
If InStr(slNumberedParaText, slaNumItems(ilRefItem)) = 0 Then
'Check to make sure the reference is the correct one
********** select the numbered item and check its position **********
'Insert the cross reference after selecting the correct location
Selection.InsertCrossReference ReferenceType:="Numbered item", _
ReferenceKind:=wdNumberRelativeContext, ReferenceItem:=ilRefItem, _
InsertAsHyperlink:=True, IncludePosition:=False, SeparateNumbers:=False, _
SeparatorString:=" "
Exit For
End If
Next ilRefItem