2

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

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

Sub Main() 
Module1.MyProcedure 
End Sub

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

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

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

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

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

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

4

1 回答 1

0

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

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

      <img src="https://i.stack.imgur.com/CI5Vo.png" alt="img">

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

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

    图像

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

但是,我们稍后会有一个解决方法,这是必要的,这样我们就可以 [从我们的工具栏] 引用有问题的外部过程,而无需 显式调用它。


显式外部调用

我有 4 个名为的子例程mySub():两个在单独的docx文件Module1中,一个在Module1of 中Normal,一个在ThisWorkbookof 中Normal

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

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

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


(点击图片放大)


笔记:

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

  • 不得将它们标记为Private Sub(或Private Function),并且,
  • 不能Option Private. _

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

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


更多信息和相关链接:

于 2018-05-20T10:41:26.613 回答