【发布时间】:2015-12-15 02:26:15
【问题描述】:
我需要将 MS Word 文档提交给无法识别“跟踪更改”标记的第三方软件。但是我仍然需要保留划掉的文本和新添加的文本,以便我的同事们知道原来的版本是什么,有什么变化。
如果只有一个人编辑 Word 文档,则以下宏有效。
Sub Macro1()
Dim chgAdd As Word.Revision
If ActiveDocument.Revisions.Count = 0 Then
MsgBox "There are no revisions in this document", vbOKOnly
Else
ActiveDocument.TrackRevisions = False
For Each chgAdd In ActiveDocument.Revisions
If chgAdd.Type = wdRevisionDelete Then
chgAdd.Range.Font.StrikeThrough = True
chgAdd.Range.Font.Color = wdColorDarkBlue
chgAdd.Reject
ElseIf chgAdd.Type = wdRevisionInsert Then
chgAdd.Range.Font.Color = wdColorRed
chgAdd.Accept
Else
MsgBox ("Unexpected Change Type Found"), vbOKOnly + vbCritical
chgAdd.Range.Select ' move insertion point
End If
Next chgAdd
End If
End Sub
当另一个人编辑已编辑的文档时,问题就开始了。在这种情况下,第二作者可以删除第一作者(不是原文)的添加。上面的宏没有将其删除,而是将其转换为我的同事错误地认为原始文本中存在的划掉的文本。
我只想将已删除的原始文本转换为划掉的文本,而不是已删除的编辑(一位作者的编辑被另一位作者删除)。
这是一个示例,说明当文本由一位作者编辑时宏如何(正确)工作。
在“C”中可以看到,深蓝色划掉的文字是从原文中删除的,红色是添加的。
现在让我们看看当文本被两个(或理论上更多)不同的编辑器编辑时会发生什么,宏运行在最后(不是中间):
问题在“C”中变得很明显:“plantes”这个词变成了深蓝色划掉的文本,即使它不是原始文本的一部分。
如您所见,图 2-C 与图 1-C 不同。所以我希望更新后的宏能够正常工作,使图 2-C 与图 1-C 相同。
【问题讨论】:
-
我有点遵循你想要的,但在概念上很难应用逻辑。您当前的宏关闭曲目更改 - 什么时候再次打开?宏应该如何知道这种状态(已经编辑过一次)何时存在?宏会在由多个编辑器更改的文档上运行,还是一次仅由一个编辑器更改?这里涉及哪个版本的 Word?
-
@CindyMeister 跟踪更改不会再次打开。它将在多个编辑器更改的文档上运行(这也是我想要的)但问题是它不区分第二个是否编辑删除了第一个编辑的添加或原始文本。我希望它忽略后者(本质上不接受)
-
我仍然不确定我是否理解 100%,所以需要和你一起探索更多... 1. 有一个文档。 2. 有人用 TrackChanges 编辑它。 3. 您的代码运行并且跟踪更改已关闭。 4. 另一个人编辑但没有音轨变化。目标:您检测到 (4) 中所做的更改。问题 仅针对以前的更改,还是整个文档?如果不需要更改,为什么还要由另一个人进行编辑?保护整个文档或宏进行更改的位置是否有意义?或者更好地将 (3) 的副本与 (4) 的结果进行比较?
-
@CindyMeister 这些步骤实际上是按顺序排列的: 1. 有一个文档。 2. 有人用 TrackChanges 编辑它。 3. 另一个人编辑,但跟踪更改仍在进行中,并且在此更改期间之前的编辑的跟踪更改。 4. 代码运行并跟踪更改被关闭
-
所以这是一种情况,文档中不止一个“编辑器”处于活动状态,而您只想“转换”一个编辑器的更改,而放弃其余的更改?还是只丢弃对相同文本范围所做的更改?如果最后一个是真的,你的代码会以同样的方式处理任何编辑器的任何其他更改吗?这些信息确实对用于编码的方法产生了重要影响...