循环浏览Word文档,从每个循环开始时的文件开头开始

时间:2014-10-28 19:07:29

标签: vba ms-word

我正在循环使用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

3 个答案:

答案 0 :(得分:2)

您将Find应用于当前选择。但是通过调用Execute对象上的Find来进行选择。结果是在第一次运行循环之后,选择是在第一个动词的最后一次出现时。这将是下一个Find.Execute的起点。一种可能的解决方案是将当前选择存储在循环开始的Range变量(range=oWord.Selection)中,并将选择设置回循环结束时的存储范围({{1} })。 (对于您的一般问题,确保有更优雅的解决方案,但它可以解决您的具体问题。)

答案 1 :(得分:0)

我不熟悉VBA所以我无法提供确切的代码,但您将能够实施以下策略: 如果您正在搜索单个单词,您可以一次只收集一个单词(或者一次用一个字母构建它们,用空格和标点符号分隔),并将该单词与您要查找的关键字列表进行比较。 因此,您可以多次遍历文档一次,而不是遍历文档一次,而是在遍历列表多次时浏览文档。

答案 2 :(得分:0)

要使用vba转到Word文档的开头,您可以使用:

Selection.HomeKey Unit:=wdStory

然后你必须在循环开始时这样做。我只是通过使用Word的宏录制器找到了这个。