快速访问工具栏按钮可以从特定项目调用宏吗?

时间:2018-05-20 08:59:46

标签: vba word-2016

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

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

Sub Main() 
Module1.MyProcedure 
End Sub

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以确保调用项目引用所有适用的项目。这样可以更简单地引用每个项目的对象,并增加优先级每个项目的能力。

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

img

  • 单击工具参考,我们应该找到已列出的Normal - 并“永久”选中(启用)。

  • 单击浏览... 并将文件类型下拉列表更改为 Word文档,以显式引用外部文档中的一个或多个项目。

    img

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

然而,我们稍后会有一个解决方法,这是必要的,所以我们可以参考有问题的外部程序[来自我们的工具栏] 没有 明确地调用它。

显式外部呼叫

我有4个名为mySub()的子程序:两个在单独的docxModule1中,一个在Module1 Normal中,一个在{{1} } ThisWorkbook

可以明确地调用它们中的每一个:

Normal

解决方法:调用外部子代码,就好像它是内部的

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

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

...但我们只能用本地程序名称(它想要“最接近”一个名称 - 在Project_in_Document2.Module1.mySub 中)来引用它。)

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

normal.dot

现在,当我们(或工具栏)调用 Sub mySub() Project_in_Document2.Module1.mySub End Sub 时,Excel会转到预期的过程。


(点击图片放大)

注意:

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

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

在“参考”对话框中引用了所有相关项目后,还会提供内联定义提示,作为正确语法的提示:

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

更多信息&相关链接: