【问题标题】:Can a quick access toolbar button call a macro from a specific project?快速访问工具栏按钮可以从特定项目调用宏吗?
【发布时间】:2018-05-20 21:24:50
【问题描述】:

以下陈述包含来自MSDN 的信息。

在 VBA 中调用过程时,必须确保项目中的另一个模块没有同名的过程。如果是这种情况,您必须指定模块以确保调用正确的过程,就像这样。

Sub Main() 
Module1.MyProcedure 
End Sub

现在,如果您处理具有相同名称过程的多个项目,您不仅必须指定模块,还必须指定项目 - 即使模块具有唯一名称。

Sub Main() 
    [MyProject.dotm].[MyModule].Main 
End Sub

我有以下具体情况。在我的 normal.dotm 中,我在模块 mod_x 中有一个过程 main。我在快速访问工具栏中创建了一个按钮来直接调用此过程。它工作正常。

在我的 myTemplate.dotm 中,模块mod_y 中还有一个名为main 的过程。因此,当我基于此模板创建文档时,我可以访问此模板以及 normal.dotm 中的宏。

不幸的是,现在按下工具栏中的按钮时,它总是调用mod_y 中的主函数,而不是使用 normal.dotm 中的正确主函数。

是否可以将此快速访问工具栏按钮更改为始终从 normal.dotm 调用正确的函数而不是其他函数?

【问题讨论】:

    标签: vba word-2016


    【解决方案1】:

    您可以确保调用项目引用所有适用项目。这将使引用每个项目的对象变得更简单,并增加了优先化每个项目的能力。

    normal.dotm 模板应该已经显示在 项目浏览器 树中:

          

    • 单击 ToolsReferences 我们应该会发现 Normal 已经列出 - 并且“永久”选中(启用)。

    • 单击浏览...并将文件类型下拉菜单更改为Word文档,以从外部文档中明确引用一个或多个项目。

    我们可以使用向上/向下箭头设置我们添加的每个项目的优先级。这指定了 VBA 在查找命名过程时检查引用的顺序。 注意 我们不能将一个 .DOCX 项目移到 Normal 模板“上方”.. .

    不过,我们稍后会有一个解决方法,这是必要的,这样我们就可以[从我们的工具栏] 参考有问题的外部过程没有 明确地调用它。


    显式外部调用

    我有 4 个名为 mySub() 的子例程:两个位于单独的 docx 文件 Module1 中,一个位于 NormalModule1 中,一个位于 ThisWorkbookNormal 中。

    它们中的每一个都可以被显式调用:

    Project_in_Document1.Module1.mySub
    Project_in_Document2.Module1.mySub
    Normal.ThisDocument.mySub
    Normal.Module1.mySub
    

    解决方法:像调用内部一样调用外部子

    对于您的工具栏,我们需要它来调用一个 sub,例如:

    Project_in_Document2.Module1.mySub
    

    ...但我们只能使用 local 过程名称来引用它(希望“最接近”的过程名称——在 normal.dot 中。)

    ? 所以我们作弊,通过添加另一个同名的过程,只是“更接近” - 作为当前模块中的本地过程强>:

    Sub mySub()
        Project_in_Document2.Module1.mySub
    End Sub
    

    现在,当我们(或工具栏)调用 mySub 时,Excel 将被定向到预期的过程。


    (点击图片放大)


    注意事项:

    我们可以从外部位置引用任何私有程序,因此:

    • 他们必须被标记为Private Sub(或Private Function),并且,
    • 必须Option Private 的模块级声明。

    在“参考”对话框中引用了所有相关项目后,内联定义提示还有一个额外的好处,以提醒正确的语法:

    我想如果我使用一个不是内置的项目会是一个更好的例子......但你明白了!


    更多信息和相关链接:

    【讨论】:

    • 非常感谢您抽出宝贵时间撰写如此详尽的回复,但我仍然难以确定这是否是实际答案。在您回答的第一部分中,您描述了当我试图实现相反的效果时如何覆盖 normal.dotm 。当我的确切问题是他们没有时,您继续描述 normal.dotm 中的 subs 有偏好。最后,您展示了如何使用 VBA 从其他项目中调用 subs,尽管这已经是我的问题的前提。
    • 我不排除对我或你的误解。所以我要回顾一下:normal.dotm 和 myTemplate.dotm 都有一个名为“mySub”的 sub。为了争论,我们假设我也不能重命名。我希望快速启动按钮始终从 normal.dotm 调用“mySub”,即使我刚刚从 myTemplate.dotm 创建了一个新文档。这可能吗?
    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多