首页 > 解决方案 > Selection.Find 通过文档与它应该找到的文本不匹配

问题描述

我正在尝试遍历段落编号,将它们与文本中的引用匹配并自动创建交叉引用。我遇到的问题是,在我找到文本后,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

谢谢!

标签: vbams-word

解决方案


我没有要测试的东西,但是您的某些行似乎有问题。例如,您的第一次调用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

推荐阅读