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 加载项 > 转到...
考虑以下情况。我有一个名为 '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 加载项 > 转到...