Я пытаюсь просмотреть номера абзацев, сопоставить их с их ссылками в тексте и автоматически создать перекрестные ссылки. Проблема, с которой я сталкиваюсь, заключается в том, что после того, как я нахожу текст, Selection.Text, похоже, не соответствует тому, что я передал ему в половине случаев (RefNum). Я подозреваю, что проблема в моей строке Do While Selection.Find.Execute = True, но я просто не могу понять это как новичок в VBA. Может ли кто-нибудь помочь мне взглянуть?
Sub cross_reference_generator()
Dim RefList As Variant
Dim Ref As String
Dim i As Integer
With ActiveDocument
Selection.HomeKey Unit:=wdStory
RefList = .GetCrossReferenceItems(wdRefTypeNumberedItem)
For i = UBound(RefList) To 1 Step -1
Selection.HomeKey Unit:=wdStory
Ref = Trim(RefList(i))
RefNum = Split(Ref, " ")(0)
With Selection.Find
Do While Selection.Find.Execute = True
.Forward = True
.Wrap = wdFindStop
.Text = RefNum
.Execute
Selection.InsertCrossReference ReferenceType: = "Numbered item", _
ReferenceKind:=wdNumberFullContext, _
ReferenceItem:=CStr(i), _
InsertAsHyperlink:=True, _
IncludePosition:=False, _
SeparateNumbers:=False, _
SeparatorString: = " "
Loop
End With
Next i
End With
End Sub
Спасибо!
У меня нет ничего, чтобы проверить, но кажется, что некоторые из ваших строк вышли из строя. Например, ваш первый вызов Execute
происходит до того, как вы установите свойство .Text
...
Sub cross_reference_generator()
Dim RefList As Variant
Dim Ref As String
Dim i As Integer
With ActiveDocument
Selection.HomeKey Unit:=wdStory
RefList = .GetCrossReferenceItems(wdRefTypeNumberedItem)
For i = UBound(RefList) To 1 Step -1
Selection.HomeKey Unit:=wdStory
Ref = Trim(RefList(i))
RefNum = Split(Ref, " ")(0)
With Selection.Find
.Forward = True
.Wrap = wdFindStop
.Text = RefNum 'set Text before calling execute
Do While .Execute
Selection.InsertCrossReference ReferenceType: = "Numbered item", _
ReferenceKind:=wdNumberFullContext, _
ReferenceItem:=CStr(i), _
InsertAsHyperlink:=True, _
IncludePosition:=False, _
SeparateNumbers:=False, _
SeparatorString: = " "
Loop
End With
Next i
End With
End Sub
Спасибо, Тим, это было правильно. Для запуска Do While потребуется Selection.Find.Execute, но проблема именно в этом!