我试图通过将数据放入电子表格并链接到Word中的相应单元格,自动更新3个不同Word文档中的某些信息(例如名称,日期和数字)。电子表格中包含一些宏,可以在内部自动更新电子表格的各个部分。
除了更新Word文档中的链接外,一切正常。 通过右键单击Word并选择“更新链接”选项来尝试更新Word中的链接时,它会打开电子表格的宏警告对话框,询问我是否要激活宏。它不是只做一次,而是在20多岁左右不断更新过程(这对我来说似乎异常漫长)。因此更新链接有效,但前提是您愿意单击“激活宏”按钮几十次。
我尝试使用VBA自动更新Word中文档中的所有字段,但这也存在同样的问题,它还会持续显示Macros对话框半分钟。 这是我的代码:
Sub UpdateFields()
ActiveDocument.Fields.Update
End Sub
我还尝试直接从电子表格更新Word文档,但这也不起作用,因为当Excel尝试通过VBA打开Word文档时,程序停止执行并拖出此错误:
“Excel正在等待另一个应用程序完成OLE操作。”
单击“确定”并等待无效,因为错误消息会在几秒钟后重新出现,并且阻止它的唯一方法是手动终止Excel进程。
这是我的Excel宏代码:
Sub LoopThroughFiles()
Path = Application.ActiveWorkbook.Path
Dim WordFile As String
WordFile = Dir(Path & "\*.doc")
Do While Len(WordFile) > 0
Run Update(Path & "\" & WordFile)
WordFile = Dir
Loop
End Sub
Function Update(Filepath As String)
Dim WordDoc As Word.Document
Set WordApplication = CreateObject("Word.Application")
Set WordDoc = WordApplication.Documents.Open(Filepath) 'This produces the error
ActiveDocument.Fields.Update
End Function
请注意,文件夹中的唯一文件是3个文档和电子表格,程序确实找到了没有任何问题的文件。
我已经在网上搜索了解决方案,但我没有找到任何东西,我觉得这很奇怪,因为有人会对VBA做一件非常普遍的事情。 再说一遍,我对VBA的经验很少,所以我可能完全忽略了这一点,并且有一个我不知道的超级简单的解决方案。
答案 0 :(得分:2)
我想我看到了错误,这是一个无声的失败,因为文件包含链接,有一个打开的对话框等着你说“是”或“否”更新链接。
我们可以通过禁用自动链接更新(WordApplication.Options.UpdateLinksAtOpen = False
)来禁止此对话框。
Function Update(Filepath As String)
Dim WordApplication As Word.Application
Dim WordDoc As Word.Document
Dim updateLinks As Boolean
Set WordApplication = CreateObject("Word.Application")
updateLinks = WordApplication.Options.UpdateLinksAtOpen 'capture the original value
WordApplication.Options.UpdateLinksAtOpen = False 'temporarily disable
Set WordDoc = WordApplication.Documents.Open(Filepath)
WordDoc.Fields.Update
'MsgBox "Links updated in " & WordDoc.Name
'## Save and Close the Document
WordDoc.Save
WordDoc.Close
'## reset the previous value and Quit the Word Application
WordApplication.Options.UpdateLinksAtOpen = updateLinks '
WordApplication.Quit
End Function
另外,请记住保存并关闭文档,然后在函数内退出单词应用程序。
我做了另一个修改:
在您的函数中,ActiveDocument
不是Excel中的对象,因此您需要对其进行限定,否则该行也会引发错误。我只是简单地引用您已分配的WordApplication.ActiveDocument
,而不是引用WordDoc
。