【问题标题】:Loop through Word document, starting from beginning of file at start of each loop循环遍历 Word 文档,从每个循环开始处的文件开头开始
【发布时间】:2014-10-28 19:07:29
【问题描述】:

我在 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,我会收到错误“值超出范围”,并且我看不出 .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

【问题讨论】:

  • 你要做什么?你不能使用查找和替换方法吗?如果有帮助,我可以给你一个样品。
  • 不是查找和替换。我试图给这个程序一个单词数组,如果该单词存在于文档中,它会向另一个文档写入多少次,以及该单词在哪个页面上。

标签: vba ms-word


【解决方案1】:

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

【讨论】:

  • 感谢您的意见。我认为这是我想尝试和使用的方法。我添加了 Edit 2 以展示我如何尝试实现您提到的内容。我已经查找了一些方法来做到这一点,但没有任何成功。即使在循环结束时设置 Range.Select 之后,在第一个关键字之后,程序仍然从文档末尾开始。有什么想法吗?
  • Edit 3 将是基于您建议的工作代码。感谢您的帮助。
【解决方案2】:

我不熟悉 VBA,所以无法给出确切的代码,但您可以实现以下策略: 如果您正在搜索单个单词,您可以一次只收集一个单词(或一次用一个字母构建它们,用空格和标点符号分隔),然后将该单词与您要查找的关键字列表进行比较. 因此,与其循环遍历文档多次并遍历列表一次,不如遍历文档一次并遍历列表多次。

【讨论】:

  • 感谢您的意见。我正在使用 RegExp 方法,因为它非常快,所以在我真正遍历文件一次之前,我将拥有一个完整的单词数组,我正在尝试查找。此外,由于 Find 方法采用 .Text 字段(我将其设置为数组),因此我不确定除此之外是否还有其他方法可以循环并查找单个单词而不会大大降低效率。我并不是说你的想法行不通,但我正在做的(根据我的想法和阅读的内容)非常有效,所以我不想改变太多。不确定我是否可以一次搜索所有单词。
【解决方案3】:

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

Selection.HomeKey Unit:=wdStory

然后你必须在循环开始时执行它。我只是通过使用 Word 的宏记录器发现了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多