使用.Find将不会继续,停留在同一段落

问题描述:

我有一个脚本,它查找用户输入的一些文本。这个想法是通过文档查看这个文本,当它找到时,选择段落并询问用户是否想将这个段落添加到索引。使用.Find将不会继续,停留在同一段落

出于某种原因,我无法让脚本移过第一个选定的段落。当我运行它并单击用户窗体中的“是”(相当于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),那么它确实移动到下一个实例。嗯。

+1

尝试在“情况1”行之前添加rng.Collapse wdCollapseEnd。说明:当您使用查找时,它会在给定的范围或选择上执行。如果成功,则范围/选择将更改为包含“找到”的术语。在这种情况下,您还需要再次更改作业(扩大以包含段落)。当你的代码循环使用当前分配到“范围”。所以你需要重置范围。要绝对准确,在Collapse之后,您还可以添加:rng.End = ActiveDocument.Content.End(注意:使用ActiveDocument.Content比ActiveDocument.Range更正确)。 –

+0

@CindyMeister - 感谢您的信息和您的帮助我的问题!我在其他地方发现了'ActiveDocument.Content'说明,所以改变了这一点。我已经添加了'Collapse'和'.Content.End',它似乎起作用了!在'.Collapse'和'.Content.End'之后,我还添加了'Set rng = Nothing',是否可以或者会导致一些问题呢? – BruceWayne

+1

将范围设置为Nothing是正确的,但并非绝对必要:VBA在其当前版本中对此非常宽容。 (在Word 97中它不是,但是它很快就修好了!) –

尝试在“情况1”行之前添加rng.Collapse wdCollapseEnd

说明:当您使用Find时,它会在给定范围或选择上执行。

如果成功,范围/选择将更改为包含“找到”一词。在这种情况下,您还需要再次更改作业(扩大以包含段落)。

当您的代码循环使用“Range”的当前分配时 - 在这种情况下,Find只会查看选定的段落Range。所以你需要重置范围才能继续查找。

要绝对准确,崩溃后,你还可以添加:

rng.End = ActiveDocument.Content.End 

注:这是更正确使用ActiveDocument.ContentActiveDocument.RangeActiveDocument.Range实际上是一种通过指定开始点和结束点来创建新范围的方法,而ActiveDocument.Content则以Range对象的形式返回文档的整个主要故事(正文)。 VBA不关心,它默认返回主要故事的方法。但是,其他编程语言(.NET,尤其是C#)不能像Word的对象模型那样直观地工作。因此,使用“始终”工作的良好习惯:-)