RSi*_*ara 8 foreach vba word-vba 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
Run Code Online (Sandbox Code Playgroud)
现在这样会很好,除了那些畸形的句子之外
这是一句话.这是另一个.
将以一种奇怪的方式解析.首先,会出现这样的一句:" 这是一句话. "然后这一句既有" 这是一句话.这是另一句话. "
当有修改时会发生什么?第一次迭代将恢复对第一个句子的修订,然后第二次迭代将不会"看到"该修订部分.
底线是,第一次迭代将获得第一个句子的两个版本,第二次迭代将只获得第一个句子的原始版本(同时从第二个句子获得两个版本).
让我澄清一下:
假设我有原版
我们从这句话开始.这句话.
它被修改为
我们以这句话结束了.还有这句话.
第一次迭代将导致
之前:我们从这句话开始.
之后:我们以这句话结束了.
但第二次迭代将有
之前:我们以这句话结束了.这句话.
之后:我们用这句话结束了.还有这句话.
好吧,我所做的是改变逻辑,撤消版本恢复:
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
Run Code Online (Sandbox Code Playgroud)
我喜欢这个,因为我最终得到了一个未经改动的文件(最后一句除外).
问题是,这样做会将宏放在一个特定句子的无限循环中.
我不知道每个人的机制,我不知道导致它挂起的原因.显然改变集合会搞乱循环,但我不明白为什么.
我可以将i = 0循环到wrdDoc.Sentences.Count,但我认为这会让我跳过句子的原因与我现在重复的一样,我不能冒险(即使我测试好了,我必须是确定它永远不会发生).
所以问题是(是):
非常感谢你!
PS:我可以提供样本文件,让我知道是否需要(也许我做错了已经让某人清楚了,我必须制作样本,因为我无法分享我正在处理的文件).
- 编辑 -
好的,这就是它挂起的地方,只在第32个文件上.
它不会挂在句子上,它实际上在文档的开头做了一些,然后回到开头.
我以前遇到过同样的错误,但它只用一句话循环,并没有回到开头.我认为这是同一个问题.我将尝试在此处复制原始版本和修订版本.
Originalversion
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...
Run Code Online (Sandbox Code Playgroud)
在重新启动循环之前有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...
Run Code Online (Sandbox Code Playgroud)
录制的原始/修改对是:
原..................................修订
{空} ...................................文件编号
某些变量的测量..............一些变量的测量
特殊工具............................特殊工具
(英语)与..................(英语)一起用小册子表示
(英语)与..................(英语)一起用小册子表示
然后它再次启动,记录相同的条目,直到我休息.我没有看到我所谈论的句子重叠,但是在修订版中插入了换行符.
谢谢!
在枚举过程中不应更改可枚举对象,否则可能会发生不好的事情(具体取决于集合的类型)。
我的猜测是,修订/撤消过程与不稳定的句子相结合,导致可枚举的句子发生变化。
您应该首先准备自己的收藏,看看这是否会有所不同。只需尝试Set sents = New Collection: For Each sent in wrdDoc.Sentences: sents.Add sent: Next然后将发送用于您的主 For Each 循环。