Excel VBA 函数名称解析,加载项与本地模块

Excel VBA function name resolution, add-in vs local module

考虑以下情况。我有一个名为 'X.xlam' 的 Excel 加载项文件,其中包含一个名为 'Y' 的模块,其中包含一个名为 'Z' 的函数。加载项文件 X.xlam 在 Excel 中通过文件 > 选项 > 加载项启用...

X.xlam     ; Excel add-in
`-- MODULES
    `-- Y
        `-- Z()

现在假设我打开一个启用宏的 Excel 工作簿 M.xlsm,其中包含一个名为 'A' 的模块,该模块包含其自己的名为 'Z' 的函数。 (我将其称为函数 'Z' 的 'local' 版本。)

M.xlsm     ; Excel macro-enabled workbook
`-- MODULES
    `-- A
        `-- Z()   ; local function Z()

问题 1) 在工作簿 M.xlsm 中,如果我从工作表单元格中调用“=Z()”,默认情况下 'Z' 会调用哪个函数 Excel? Excel 调用 X.xlam 中的函数 Z() 还是 M.xlsm 中的函数 Z()? (如果有人能给我指一个文档,该文档在 Excel VBA 中很好地描述了名称范围和名称解析,那将不胜感激。)

问题 2) 在工作表单元格中调用 VBA macro/function 时,例如“=Z()”,是否有范围解析语法可用于显式调用一个或另一个函数 'Z'(即“本地”Z 或加载项“Z”)?

问题 3) 在启用宏的工作簿 M.xlsm 中,当工作表单元格调用函数“=Z()”时 Excel 调用 'Z' 的加载项版本默认。在文件 M.xlsm 中,如果我“打破 link” 到加载项文件 X.xlam(Excel RIBBON 栏 > DATA 选项卡 > CONNECTIONS gallery > EDIT LINKS 按钮),这会破坏所有调用“=Z()”=>“#NAME?”的工作表单元格。有什么方法可以让 Excel 打破 link 以在 X.xlam 内调用 Z() ,而不是在 M.xlsm 内调用 Z() 而不会破坏所有调用的工作表单元格'=Z()'?

答案 2) 鉴于启用宏的工作表的文件名为 'k.xlsm',可以通过在函数调用“=Z()”前加上文件名(或启用宏的工作簿的完整路径:

='k.xlsm'!Z()

:: 编辑 2::

如果在同一个 Excel 文件的多个模块中定义了名为 Z() 的函数,则消除歧义的语法是

MODULE_NAME.FUNCTION_NAME
-or-
'FILE_NAME'!MODULE_NAME.FUNCTION_NAME    ; fully-qualified

示例

k.xlsm
`-- MODULES
    |-- A
    |   `-- Z()   ; returns "Hello"
    `-- B
        `-- Z()   ; returns "World"

在 k.xlsm 的工作表单元格中:

=A.Z()            ; returns "Hello"
=B.Z()            ; returns "World"
='k.xlsm'!A.Z()   ; returns "Hello"
='k.xlsm'!B.Z()   ; returns "World"

另请参阅:Avoiding naming conflicts (Microsoft)


:: 编辑 1::

要调用在启用宏的 Excel 加载项文件(例如 MyAddin.xlam)中定义的宏 routine_name,请确保添加了加载项文件并且启用(见注释 1.1),然后 see @RAK_da_Pira's answer to the question running a macro from an add-in 发布到 Stack Overflow。重要的一点是:在调用工作簿中,必须明确启用插件模块作为可用参考;否则,调用工作簿无法调用加载项模块中的例程。

Call MyAddin!routine_name(args)

注1.1。 Excel:文件 > 选项 > 加载项 > 管理:Excel 加载项 > 转到...