Excel 用于选择 VBA 模块的单元格公式范围规则

Excel cell formula scope rules for selecting VBA modules

假设我有一个启用了宏的 Excel 工作簿 Q.xlsm,其中包含两个用户定义的模块 AB,并且每个模块都有一个 public 名为 xyz() 的函数,其中 A::xyz() returns 一个 STRING 对象,B::xyz() returns 一个 INTEGER 值。

Q.xlsm
`-- Modules
    |-- A
    |   `-- Public Function xyz() As String
    `-- B
        `-- Public Function xyz() As Integer

Q1) 允许我调用 A::xyz()B::xyz() 的工作表单元格公式范围语法是什么?

另一种情况是两个启用宏的工作簿 P.xlsmQ.xlsm,每个工作簿都有一个用户定义的模块 A,具有 public 函数 xyz().假设工作簿 P 保存为加载项模块 P.xlam,并且该加载项实际上是 "added in" 到 Excel(例如,文件 > 选项... > 加载项 > ...)。现在,当我打开工作簿 Q.xlsm 时,我有两个 public 函数 P.xlam::A::xyz()Q::A::xyz(),

P.xlam (add-in)
|-- Modules
|   `-- A
|       `-- Public Function xyz() As String
Q.xlsm
`-- Modules
    `-- A
        `-- Public Function xyz() As Integer

Q2) 如果我在工作表单元格中输入 =xyz(),我如何知道调用了哪个函数(即,VBA 函数名称的作用域规则是什么?工作表单元格)?

Q3) 我在工作表单元格公式中使用什么语法来调用 P.xlam::A::xyz()Q.xlsm::A::xyz()

Q1) What is the worksheet cell formula scoping syntax that allows me to invoke either A::xyz() or B::xyz()?

A1) 工作表单元格公式范围语法似乎是 MODULE_NAME.FUNCTION_NAME(),例如

=A.xyz()   // Returns the String object
=B.xyz()   // Returns the Integer value


Q2) If I enter =xyz() into a worksheet cell [in workbook Q.xlsm] , how do I know which function is invoked (i.e., what are the scope rules for VBA function names within worksheet cells)?

A2) 在使用 Excel 2016 进行一些测试后,在工作簿 Q.xlsm 的工作表单元格内调用 =xyz() 会调用加载项版本 P.xlam!A.xyz() 而不是 Q.xlsm!A.xyz().


Q3) What syntax do I use in the worksheet cell formula [in workbook Q.xlsm] to invoke either P.xlam::A::xyz() or Q.xlsm::A::xyz()?

A3) 范围语法似乎是 WORKBOOK_FILE_NAME!MODULE_NAME.FUNCTION_NAME(),

=P.xlam!A.xyz()     // returns STRING, becomes `=A.xyz()`
=Q.xlsm!A.xyz()     // returns INTEGER

如果函数 xyz() 未在工作簿 Q.xlsm 的任何其他模块中重载,则 shorthand 作用域语法 WORKBOOK_FILE_NAME!FUNCTION_NAME() 也有效,例如,

=P.xlam!xyz()       // returns STRING, becomes `=xyz()`
=Q.xlsm!xyz()       // returns INTEGER

编辑 2017-11-27

可以在单元格公式中使用的另一个有用的范围语法:

'[workbook_file_path]worksheet_name'!range_within_worksheet_name

示例:

'[C:\Temp\Workbook1.xlsx]Scores'!$B
'[Workbook2.xlsx]Roster'!Teams

如果有人知道描述 "this workbook's full path" 并且适合用作“[workbook_file_path]”字段的内置快捷语法,请发表评论。 (n.b., 我不是在谈论创建一个使用 =CELL("filename",A1) 或其变体的 INDIRECT() 组合。)