【发布时间】:2018-02-16 21:27:43
【问题描述】:
我有一个应用程序,我需要合并几个几乎相同的文档,这些文档已发送给多个用户并收到了一些细微的更改和 cmets。文档相当大(500K - 1M),可以包含表格和嵌入的图形。这样做的目的是将来自不同用户的更改和 cmet 合并到一个文档中,跟踪谁做了什么或说了什么。
核心是以下使用Application.Merge的过程。
Public Sub runMerge(files As String)
Dim i As Integer
Dim v() As String
v = Split(files, vbCr)
Word.Application.ScreenUpdating = False
Word.Documents.Open fileName:=v(0), ReadOnly:=False, addtorecentfiles:=False
For i = 1 To UBound(v)
ActiveDocument.Merge fileName:=v(i), _
MergeTarget:=wdMergeTargetCurrent, _
DetectFormatChanges:=True, _
UseFormattingFrom:=wdFormattingFromCurrent, _
addtorecentfiles:=False
DoEvents
Next i
Word.Application.ScreenUpdating = True
Word.Application.ScreenRefresh
ActiveDocument.SaveAs2 "Merge " & Replace(Now, ":", "."), , , , False
End Sub
代码显式打开第一个文件,然后循环合并其余文档。除了有点脆弱之外,只要第一个文档被显式打开,它就可以正常工作。
合并后,我使用 SaveAs2 和一个新的非限定文件名(即没有明确的目录)。这很好用。
但是,如果我尝试使用SaveAs2 将文件放在不同的目录中,如
ActiveDocument.SaveAs2 "C:\.....\Merge " & Replace(Now, ":", "."), , , , False
合并后生成的文档不会重新出现在屏幕上。此外,当稍后明确打开时,该文档似乎以某种方式损坏,格式奇怪,在一种情况下,某些文本以橙色显示。此行为已在 Word 2013 和 2016 中看到。
除了将文档保存在任何默认目录(在我的情况下为“我的文档”),然后使用copy 和Kill 在VBA 中显式移动文件之外,如果没有额外的步骤,如何保存它?
【问题讨论】:
-
我有点迷茫,到底存不存?你是说它可以保存但格式很奇怪吗?如果路径是有效和无效代码之间的唯一区别,请尝试不同的路径。您的路径是否正确且位置是否可写?
-
@Andy G 它确实保存了,但生成的文档似乎已“损坏”
-
如果您完全注释掉 SaveAs,以便在代码完成时查看生成的文档,然后将其作为用户保存到不同的目录 - 那么结果是什么?我的怀疑是,不知何故,当您的代码执行 SaveAs 时,Merge 过程还没有完全完成 - 在后台正在进行异步操作。但是,如果您的手动 SaveAs 显示同样的问题,那就是另外一回事了……
-
@CindyMeister 这听起来很有希望,因为当文档最终在合并后重新出现时,所有更改都需要一些时间(一两分钟)才能完全出现。在第一页可见后,Word 仍在处理它(很长时间)。
-
@CindyMeister 手动保存到其他目录按预期工作。