【问题标题】:Excel VBA function name resolution, add-in vs local moduleExcel VBA 函数名称解析,加载项与本地模块
【发布时间】:2017-03-31 08:35:54
【问题描述】:

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

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

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

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

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

问题 2) 在工作表单元格中调用 VBA 宏/函数时,例如“=Z()”,是否有一种范围解析语法可以用来显式调用一个或另一个函数“Z”(即、“本地”Z 还是外接程序“Z”)?

问题 3) 在启用宏的工作簿 M.xlsm 中,当工作表单元格调用函数“=Z()”时,Excel 默认调用加载项版本的“Z”。在文件 M.xlsm 中,如果我“断开链接”到加载项文件 X.xlam(Excel 功能区栏 > 数据选项卡 > 连接库 > 编辑链接按钮),这会破坏所有调用 '=Z 的工作表单元格()' => '#NAME?'。有没有办法让 Excel 在 X.xlam 中断开与函数 Z() 的链接,而在 M.xlsm 中调用 Z() 而不会破坏所有调用 '=Z()' 的工作表单元格?

【问题讨论】:

    标签: vba excel excel-addins


    【解决方案1】:

    答案 2) 假设启用宏的工作表的文件名为“k.xlsm”,则可以通过在函数调用“=Z()”前加上文件名(或完整路径)在工作表单元格中强制执行函数名称解析to) 的启用宏的工作簿:

    ='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(微软)


    :: 编辑 1 ::

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

    Call MyAddin!routine_name(args)
    

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

    【讨论】:

      猜你喜欢
      • 2020-11-13
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多