【问题标题】:Opening/Activating Word Documents in a VBA macro在 VBA 宏中打开/激活 Word 文档
【发布时间】:2010-10-16 22:20:39
【问题描述】:

我希望 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 文档,即使已经打开了其他文档(我不太确定如何管理文档集合,以及Word 如何确定如果您以编程方式关闭当前的 ActiveDocument,接下来的 ActiveDocument 会是什么)

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

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

【问题讨论】:

  • 大概您一直在将文档的流式副本作为代码中的 ActiveDocument 处理。最好在代码开头将该文档对象分配给一个变量,然后在其余代码中使用您的变量。正如其他人指出的那样,您可能在第二行代码中关闭了错误版本的文档。此外,在打开“原始”文档对象时将其分配给变量也是明智之举。

标签: vba ms-word


【解决方案1】:

简单的答案是肯定的。通过使用您的代码打开文档,您可以将其设置为活动文档,然后您在下一行关闭它并尝试在下一行激活,但由于文档不再打开而失败。 VBA 似乎通常以这种方式工作。

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

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

【讨论】:

  • VBA?片状?为什么我从来没有听到过这样的指责!
【解决方案2】:

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

  1. 如果您想在关闭文档后重新打开它 一次....Word/Windows 不会 'release' 文件名,你会得到一个 'file busy' 消息,或关于 ' 创建的消息 临时副本'。 为了解决这个问题,我不得不开发一个精心制作/保存的系统和 整理我在 Word 应用程序中打开/操作的任何其他文档的多个版本 因为 Office Open/Close/Save 方法中的这个设计缺陷。

  2. 使用设置为 FalseReadOnlyRecommended 属性和 .Open方法

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

  4. 如果您操作 Documents 集合(或任何其他集合)而不 确保文件或其他物体仍然存在,并且 在您可以在集合中删除或移动它之前有效
    得到“堆栈溢出”错误。特别是如果你尝试 关闭/删除从 .item(1) 开始的集合中的对象。你 必须从最后一个中删除集合中的项目,并记住 集合 idicies 和指针在你改变时 .add/.remove/.close 项目。

【讨论】:

    【解决方案3】:

    这里有错误:

    Document(origDoc).Activate
    

    应该是文档s

    是的,您可以激活活动文档。然后什么都不会发生。

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

    【讨论】:

    • 感谢您发现错字,不幸的是它只是在我的帖子中,而不是实际代码。如果允许您激活打开的文档,那我怎么会在 .Activate 调用中收到 4160 错误?
    • origDoc 究竟包含什么?
    【解决方案4】:

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

    Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges
    
    Dim doc as Document
    Set doc = Documents.Open(origDoc)        
    With doc
        'Do work
    End With
    

    【讨论】:

    • 我显然在这里遗漏了一些东西。你说不要使用ActiveDocument,但你继续在你的代码示例中使用它?
    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多