使用.Find将不会继续,保持在同一段

时间:2016-03-02 22:34:52

标签: vba ms-word word-vba

我有一个脚本,用于查找用户输入的文本。我们的想法是查看该文本的文档,找到该文本后,选择该段落并询问用户是否要将此段落添加到索引中。

出于某种原因,我无法让脚本移过第一个选定的段落。当我运行它,并在UserForm中单击“是”(相当于myForm.Tag = 2)时,它会添加到索引,但是当.Find查找文本的下一个实例时,它会选择我突然强调了一段。 ......它不会继续。

以下是代码:

Sub find_Definitions()
Dim defText As String, findText$
Dim oRng    As Word.Range, rng As Word.Range
Dim myForm As frmAddDefinition
Set myForm = New frmAddDefinition

Dim addDefinition$, expandParagraph&
' expandParagraph = 1

Set oRng = ActiveDocument.Range
findText = InputBox("What text would you like to search for?")

With oRng.Find
    .Text = findText
    While .Execute

    Set rng = oRng.Paragraphs(1).Range
        rng.Select
        defText = oRng.Paragraphs(1).Range
        myForm.Show
        Select Case myForm.Tag
            Case 0 ' Expand the paragraph selection

                Do While CLng(expandParagraph) < 1
                    expandParagraph = InputBox("How many paragraphs to extend selection?")
                    If expandParagraph = 0 Then Exit Do
                Loop

                    rng.MoveEnd unit:=wdParagraph, Count:=expandParagraph
                    rng.Select
                    defText = rng

                ActiveDocument.Indexes.MarkEntry Range:=rng, entry:=defText, entryautotext:=defText
            Case 1 ' No, do not add to the index
                ' do nothing
            Case 2 ' Yes, add to index
                ActiveDocument.Indexes.MarkEntry Range:=rng, entry:=defText, entryautotext:=defText
            Case 3 ' Cancel, exit the sub
                MsgBox ("Exiting macro")
                GoTo lbl_Exit
        End Select
    Wend
End With

lbl_Exit:
Unload myForm
Set myForm = Nothing
End Sub

(FWIW,我对Word VBA很新,但对Excel VBA非常熟悉)。谢谢你的任何想法。

请注意,如果我点击“否”(相当于myForm.Tag = 1),那么继续下一个实例。 HMM。

1 个答案:

答案 0 :(得分:1)

尝试在“案例1”行前添加rng.Collapse wdCollapseEnd

说明:使用Find时,它会在给定的Range或Selection上执行。

如果成功,则范围/选择会更改为包含“已找到”字词。在这种情况下,您还可以再次更改分配(扩展以包括段落)。

当你的代码循环使用当前赋值为“Range”时 - 在这种情况下,Find只查看选定的段落Range。所以你需要重置Range才能让Find继续。

要绝对准确,折叠后您还可以添加:

rng.End = ActiveDocument.Content.End

注意:使用ActiveDocument.ContentActiveDocument.Range更正确。 ActiveDocument.Range实际上是一种通过指定Start和End点来创建新Range的方法,而ActiveDocument.Content则将文档的整个主要故事(正文)作为Range对象返回。 VBA并不关心,它默认方法返回主要故事。但是,其他编程语言(.NET,尤其是C#)在Word的对象模型中不能直观地工作。因此,使用“始终”的工作是一个好习惯: - )