当我恢复修订时锁定每个循环的 VBA

标签 vba foreach ms-word revision-history

我想从文档中获取修订文本和原始文本。我这样做:

Set wrdDoc = wrdApp.Documents.Open(fileName)

For each sent in wrdDoc.Sentences

    if sent.Revisions.Count >=0 then
        after=sent.text
        sent.Revisions.RejectAll 
        before=sent.text
        SaveRev(before,after)
    End if

next
现在就可以了,除了像这样格式错误的句子

This is one sentence.This is another.


会以一种奇怪的方式被解析。首先,会有这个:“ 这是一个句子。 ”,然后这个带有两个“ 这是一个句子。这是另一个。
当那里有修订时会发生什么?第一次迭代将恢复对第一句话的修订,然后第二次迭代将不会“看到”修改后的部分。
底线是,第一次迭代将获得第一个句子的两个版本,第二次迭代将仅获得第一个句子的原始版本(同时从第二个句子中获得两个版本)。
让我澄清一下:
假设我有原版

We started with this sentence.And this sentence.


它被修改为

We ended with this sentence.And this other sentence.


第一次迭代将导致

Before: We started with this sentence.

After: We ended with this sentence.


但第二次迭代将有

Before: We ended with this sentence.And this sentence.

After: We ended with this sentence.And this other sentence.


好吧,我所做的是改变逻辑,撤消修订版本:
Set wrdDoc = wrdApp.Documents.Open(fileName)

For each sent in wrdDoc.Sentences

    if sent.Revisions.Count >=0 then
        wrdDoc.Undo
        after=sent.text
        sent.Revisions.RejectAll 
        before=sent.text
        SaveRev(before,after)
    End if

next
我喜欢这个,因为我最终得到了一个未更改的文档(最后一句话除外)。
问题是,这样做会将宏置于一个特定句子的无限循环中。
我不知道每个的机制,我不知道是什么导致它挂起。显然改变集合会弄乱循环,但我不明白为什么。
我可以将 i=0 循环到 wrdDoc.Sentences.Count,但我认为这会让我跳过句子,原因与我现在重复一个的原因相同,而且我不能冒险(即使我测试没问题,我也必须肯定不会发生)。
所以问题是(是):
  • 谁能帮我弄清楚为什么它会锁定一个句子,
  • 有没有更好的方法来做到这一点?
  • 如何在确保不跳过句子的同时解决它。

  • 非常感谢!
    PS:我可以提供示例文档,如果需要,请告诉我(也许我做错了什么已经有人清楚了,我必须制作示例,因为我无法共享我正在处理的文档)。
    - 编辑 -
    好的,这就是它挂的地方,仅在第 32 个文件上。
    它不卡在一个句子上,它实际上在文档的开头做了一些,然后回到开头。
    我之前也遇到过同样的错误,但是循环了一个句子,没有回到开头。我认为这是同样的问题。我将尝试在此处复制原始版本和修订版本。
    原版
    MAIN TITLE
    
    Measurement of some variable
    
    1   REQUIRED TOOLS
    
    1.1 Special tools
    
    NOTe:
    
    Some note about the procedure (unaltered by revision)
    
    Equipment name (carrier returned line)
    (english) assemply with Equipment PN
    Kit
    
    Equipment name (carrier returned line)
    (english) assemply with (Another) Equipment PN
    Kit
    
    Document continues...
    
    在它重新启动循环之前有 2 个设备条目。
    修订包括插入文档编号、单词大写的一些首字母,以及更改设备 PN 和“套件”之间的顺序。
    经过修改的版本
    ducument number
    MAIN TITLE
    
    Measurement of Some Variable
    
    1   REQUIRED TOOLS
    
    1.1 Special Tools
    
    NOTe:
    
    Some note about the procedure (unaltered by revision)
    
    Equipment name (carrier returned line)
    (english) assemply with kit
    Equipment PN
    
    
    Equipment name (carrier returned line)
    (english) assemply with kit
    (Another) Equipment PN
    
    
    Document continues...
    
    记录的原始/修订对是:
    原件…………………………………………………………………………………………………………………………………………………………………………
    {空}......................................文件编号
    某些变量的测量…………某些变量的测量
    专用工具……………………………………………………………………………………………………………………
    (english) 组装.......(english) 组装成套件
    (english) 组装.......(english) 组装成套件
    然后它再次开始,记录相同的条目,直到我中断。
    我没有看到我谈到的句子重叠,但在修订版中插入了换行符。
    谢谢!

    最佳答案

    在枚举过程中不应更改可枚举对象,否则可能会发生不好的事情(这取决于集合的类型)。

    我的猜测是,修订/撤消过程与不稳定的句子相结合,导致可枚举的句子发生变化。

    您应该先准备自己的收藏,看看这是否有所作为。只需尝试 Set sents = New Collection: For Each sent in wrdDoc.Sentences: sents.Add sent: Next然后将发送用于您的主要 For Each 循环。

    关于当我恢复修订时锁定每个循环的 VBA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29908371/

    相关文章:

    vba - 在 Excel 中查找文本重复项

    vba - Excel VBA : Cannot delete multi columns by using if statement and for loop

    python - 使用 Itertools 的等效嵌套循环结构

    java - For-Each 循环 Java 错误 ArrayIndexOutOfBoundsException

    ms-word - Office URI 方案,来自模板(nft)的新文件未将文件保存在提供的位置

    vba - 在不同工作表中添加另一行时向表中添加新行

    vba - 如何在每个工作表中找到一个范围并将每个范围粘贴到一个工作表中

    php - 如何循环并回显此内容

    ms-word - 在任务 Pane 中单击后如何将MS Word光标集中发送回当前文档

    delphi - 在 TOleContainer 中嵌入多个 MS Word 实例