在VBA宏中打开/激活Word文档

时间:2009-04-01 17:10:55

标签: ms-word word-vba

我希望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,但我在.Activate上收到4160'错误的文件名'错误呼叫。如果我注释掉对.Activate的调用,则ActiveDocument似乎设置为origDoc文档,即使已经打开了其他文档(我不确定如何管理文档集合,以及如果以编程方式关闭当前的ActiveDocument,Word将如何确定下一个ActiveDocument的内容。

那么,在文档上调用.Open是否明确将Document设置为ActiveDocument?此外,在已经激活的文档上调用.Activate会导致错误吗?

我真的没能找到很多关于此的文档,所以提前感谢任何建议和见解!

4 个答案:

答案 0 :(得分:5)

简单的答案是肯定的。通过使用您的代码打开文档,您可以将其作为活动文档,然后在下一行中关闭并尝试在下一行中激活,这会因文档不再打开而失败。 VBA一般似乎都是这样工作的。

小心使用ActiveDocument很重要,因为在代码或其他地方,哪些操作会使文档“活动”并不总是不言而喻(我没有证据,但即使是自动保存也可以这样做)。如果有任何疑问,最好通过Documents集合引用文档,但如果文档不再打开,这也可能导致错误,并且您可能不得不求助于遍历集合以确保文档是,事实上,开放。我使用excel VBA遇到了很多,而Word VBA似乎在这方面具有相同的功能。

此外,VBA在发布应用程序对象方面很不稳定。如果你不小心,你最终会得到多个WINWORD进程,可以在任务管理器中查看,无论你是否在代码中关闭或退出它们。我发现解决这个问题的代码相当于模拟在任务管理器中选择END PROCESS的过程。它有效,但应该有一个更好的解决方案。

答案 1 :(得分:2)

请注意可能遇到的各种问题:

  1. 如果要在关闭文档后重新打开文档 曾经.... Word / Windows没有     '释放'文件名,你得到一个' 文件忙'消息或有关'创建的消息      临时副本'。     为了解决这个问题,我必须开发一个精心设计的创建/保存系统     整理我在Word应用程序中打开/操作的任何其他文档的多个版本     因为Office Open / Close / Save方法存在这种设计缺陷。

  2. 使用ReadOnlyRecommended属性集False .Open方法

  3. 引用文档对象(上面命名为doc)可以导致 如果你不保证会出现严重错误     在尝试操作它之前,doc对象仍然存在。永远记住,那     Word是一个开放的'应用程序平台....用户可以做你不重要的事情     在......最后一毫秒左右。此建议适用于您可能的任何其他对象或财产     希望在Word中操纵。

  4. 如果您没有操作Documents集合(或任何其他集合) 确保文档或其他对象仍在那里 在删除或移动它之前有效 得到' 堆栈溢出'错误。特别是如果你尝试和 从.item(1)开始关闭/删除集合中的对象。您 必须从最后一个中删除集合中的项目,并记住 每当你的时候,集合的idicies和指针都会改变 .add / .remove / .close来自他们的项目。

答案 2 :(得分:1)

您在此处有错误:

Document(origDoc).Activate

应该是文件 s

是的,您可以激活活动文档。什么都没发生。

是的,打开的文档变为活动状态。 如果您不确定,请使用Documents.Open(origDoc).Activate

答案 3 :(得分:1)

除非绝对必要,否则您不应该首先使用ActiveDocument对象,因为它非常不可靠。首选方法是:

Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges

Dim doc as Document
Set doc = Documents.Open(origDoc)        
With doc
    'Do work
End With