我有一个脚本,用于查找用户输入的文本。我们的想法是查看该文本的文档,找到该文本后,选择该段落并询问用户是否要将此段落添加到索引中。
出于某种原因,我无法让脚本移过第一个选定的段落。当我运行它,并在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。
答案 0 :(得分:1)
尝试在“案例1”行前添加rng.Collapse wdCollapseEnd
。
说明:使用Find
时,它会在给定的Range或Selection上执行。
如果成功,则范围/选择会更改为包含“已找到”字词。在这种情况下,您还可以再次更改分配(扩展以包括段落)。
当你的代码循环使用当前赋值为“Range”时 - 在这种情况下,Find只查看选定的段落Range。所以你需要重置Range才能让Find继续。
要绝对准确,折叠后您还可以添加:
rng.End = ActiveDocument.Content.End
注意:使用ActiveDocument.Content
比ActiveDocument.Range
更正确。 ActiveDocument.Range
实际上是一种通过指定Start和End点来创建新Range的方法,而ActiveDocument.Content则将文档的整个主要故事(正文)作为Range对象返回。 VBA并不关心,它默认方法返回主要故事。但是,其他编程语言(.NET,尤其是C#)在Word的对象模型中不能直观地工作。因此,使用“始终”的工作是一个好习惯: - )