我希望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
会导致错误吗?
我真的没能找到很多关于此的文档,所以提前感谢任何建议和见解!
答案 0 :(得分:5)
简单的答案是肯定的。通过使用您的代码打开文档,您可以将其作为活动文档,然后在下一行中关闭并尝试在下一行中激活,这会因文档不再打开而失败。 VBA一般似乎都是这样工作的。
小心使用ActiveDocument很重要,因为在代码或其他地方,哪些操作会使文档“活动”并不总是不言而喻(我没有证据,但即使是自动保存也可以这样做)。如果有任何疑问,最好通过Documents集合引用文档,但如果文档不再打开,这也可能导致错误,并且您可能不得不求助于遍历集合以确保文档是,事实上,开放。我使用excel VBA遇到了很多,而Word VBA似乎在这方面具有相同的功能。
此外,VBA在发布应用程序对象方面很不稳定。如果你不小心,你最终会得到多个WINWORD进程,可以在任务管理器中查看,无论你是否在代码中关闭或退出它们。我发现解决这个问题的代码相当于模拟在任务管理器中选择END PROCESS的过程。它有效,但应该有一个更好的解决方案。
答案 1 :(得分:2)
请注意可能遇到的各种问题:
如果要在关闭文档后重新打开文档
曾经.... Word / Windows没有
'释放'文件名,你得到一个' 文件忙'消息或有关'创建的消息
临时副本'。
为了解决这个问题,我必须开发一个精心设计的创建/保存系统
整理我在Word应用程序中打开/操作的任何其他文档的多个版本
因为Office Open
/ Close
/ Save
方法存在这种设计缺陷。
使用ReadOnlyRecommended
属性集False
.Open
方法
引用文档对象(上面命名为doc)可以导致
如果你不保证会出现严重错误
在尝试操作它之前,doc
对象仍然存在。永远记住,那
Word是一个开放的'应用程序平台....用户可以做你不重要的事情
在......最后一毫秒左右。此建议适用于您可能的任何其他对象或财产
希望在Word中操纵。
如果您没有操作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