我正在循环使用VBA中的Word文档。通过每次传递,我想搜索不同的单词,因此每个传递都需要从文件的开头开始。我正在使用的当前方法是这样,但它似乎搜索第一个单词,当它到达文件的末尾时,移动到第二个单词,并仅搜索文件的末尾,依此类推其余的话。
'my array of words is called myKeywords
For x = LBound(myKeywords) To UBound(myKeywords)
PageNumbers(x) = ""
'start from start of file here somehow.
With oWord.Selection.Find
.ClearFormatting()
.Text = myKeywords(x)
.Wrap = False
.Forward = True
Do While .Execute = True
If PageNumbers(x) = "" Then
PageNumbers(x) = oWord.Selection.Information(Word.WdInformation.wdActiveEndAdjustedPageNumber)
Else
PageNumbers(x) = PageNumbers(x) & ", " & oWord.Selection.Information(Word.WdInformation.wdActiveEndAdjustedPageNumber)
End If
Loop
End With
Next
感谢任何见解。
修改1
我已阅读this,但我没有看到任何可以帮助我的内容。 Wrap看起来会有所帮助,但是如果我设置wrap = True,我会收到错误“Value out of range”,而且我看不到.wrap如何设置超出范围的任何内容。
修改2
我尝试设置一个范围并在循环结束时重置它,但到目前为止没有成功。
'my array of words is called myKeywords
Range = oWord.Selection
For x = LBound(myKeywords) To UBound(myKeywords)
PageNumbers(x) = ""
'start from start of file here somehow.
With Range.Find
.ClearFormatting()
.Text = myKeywords(x)
.Wrap = False
.Forward = True
Do While .Execute = True
If PageNumbers(x) = "" Then
PageNumbers(x) = oWord.Selection.Information(Word.WdInformation.wdActiveEndAdjustedPageNumber)
Else
PageNumbers(x) = PageNumbers(x) & ", " & oWord.Selection.Information(Word.WdInformation.wdActiveEndAdjustedPageNumber)
End If
Loop
'I've also tried several other variations of Range = other things to get this to work.
Range = Range.Select
End With
Next
编辑3
'my array of words is called myKeywords
Range = oWord.ActiveDocument.Range(Start:=oWord.Selection.Start, [End]:=oWord.Selection.End)
For x = LBound(myKeywords) To UBound(myKeywords)
'start from start of file here somehow.
With oWord.Selection.Find
PageNumbers(x) = ""
.ClearFormatting()
.Text = myKeywords(x)
.Wrap = False
.Forward = True
Do While .Execute = True
If PageNumbers(x) = "" Then
PageNumbers(x) = oWord.Selection.Information(Word.WdInformation.wdActiveEndAdjustedPageNumber)
Else
PageNumbers(x) = PageNumbers(x) & ", " & oWord.Selection.Information(Word.WdInformation.wdActiveEndAdjustedPageNumber)
End If
Loop
Range.Select()
End With
Next
答案 0 :(得分:2)
您将Find
应用于当前选择。但是通过调用Execute
对象上的Find
来进行选择。结果是在第一次运行循环之后,选择是在第一个动词的最后一次出现时。这将是下一个Find.Execute
的起点。一种可能的解决方案是将当前选择存储在循环开始的Range
变量(range=oWord.Selection
)中,并将选择设置回循环结束时的存储范围({{1} })。 (对于您的一般问题,确保有更优雅的解决方案,但它可以解决您的具体问题。)
答案 1 :(得分:0)
我不熟悉VBA所以我无法提供确切的代码,但您将能够实施以下策略: 如果您正在搜索单个单词,您可以一次只收集一个单词(或者一次用一个字母构建它们,用空格和标点符号分隔),并将该单词与您要查找的关键字列表进行比较。 因此,您可以多次遍历文档一次,而不是遍历文档一次,而是在遍历列表多次时浏览文档。
答案 2 :(得分:0)
要使用vba转到Word文档的开头,您可以使用:
Selection.HomeKey Unit:=wdStory
然后你必须在循环开始时这样做。我只是通过使用Word的宏录制器找到了这个。