我想从文档中获取修订文本和原始文本。我这样做:
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/