以下陈述包括来自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调用正确的函数而不是其他?
答案 0 :(得分:0)
您可以确保调用项目引用所有适用的项目。这样可以更简单地引用每个项目的对象,并增加优先级每个项目的能力。
normal.dotm
模板应该已经显示在项目浏览器树中了:
我们可以使用向上/向下箭头设置我们添加的每个项目的优先级。这指定了VBA在查找命名过程时检查引用的顺序。 注意 我们无法将 .DOCX
项目移至 Normal
模板的“上方” ...
然而,我们稍后会有一个解决方法,这是必要的,所以我们可以参考有问题的外部程序[来自我们的工具栏] 没有 明确地调用它。
我有4个名为mySub()
的子程序:两个在单独的docx
档Module1
中,一个在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
的模块级声明。在“参考”对话框中引用了所有相关项目后,还会提供内联定义提示,作为正确语法的提示:
我想如果我使用了一个不内置的项目,那将是一个更好的例子......但是你明白了!