我希望VB/VBA专家可以帮助我.请考虑以下事项:用户在Word 2003中打开文档,在Normal.dot AutoOpen
宏中,我们查看当前文档,如果已通过单击网页上的链接打开它,并满足某些其他应用程序特定条件,关闭流式"复制"并打开源文档(在共享驱动器上找到我们可以假设用户有权访问):
Documents.Open origDoc Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges Documents(origDoc).Activate With ActiveDocument ''# Do work End With
我的想法是我需要打电话Activate
以确保原始文件是ActiveDocument
,但我在电话中收到4160'错误的文件名'错误.Activate
.如果我注释掉调用.Activate
,它似乎ActiveDocument
设置为origDoc文档,即使已经打开了其他文档(我不确定如何管理文档集合,以及Word如何确定下一步ActiveDocument
将是什么如果你以编程方式关闭当前的ActiveDocument)
那么,调用.Open
文档是否明确将Document设置为ActiveDocument
?另外,调用.Activate
已经存在的文档会导致错误吗?
我真的没有找到很多关于此的文档,所以提前感谢任何建议和见解!
简单的答案是肯定的.通过使用您的代码打开文档,您可以将其作为活动文档,然后在下一行中关闭并尝试在下一行中激活,这会因文档不再打开而失败.VBA一般似乎都是这样工作的.
重要的是要小心使用ActiveDocument,因为在代码或其他地方,哪些操作会使文档"活动"并不总是不言而喻(我没有证据,但即使是自动保存也可以这样做).如果有任何疑问,最好通过Documents集合引用文档,但如果文档不再打开,这也可能导致错误,并且您可能不得不求助于遍历集合以确保文档是,事实上,开放.我使用excel VBA遇到了很多,而Word VBA似乎在这方面具有相同的功能.
此外,VBA在释放应用程序对象方面很不稳定.如果你不小心,你最终会得到多个WINWORD进程,可以在任务管理器中查看,无论你是否在代码中关闭或退出它们.我发现解决这个问题的代码相当于模拟在任务管理器中选择END PROCESS的过程.它有效,但应该有一个更好的解决方案.