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



假设我有一个启用宏的 Excel 工作簿Q.xlsm包含两个用户定义的模块AB,并且每个模块都有一个名为xyz()的公共函数,其中A::xyz()返回一个STRING对象,B::xyz()返回一个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有一个公共函数xyz()。假设工作簿P另存为加载项模块P.xlam,并且此加载项实际上已"添加到"Excel中(例如,文件>选项...>加载项>...)。现在,当我打开工作簿Q.xlsm我有两个公共函数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) 允许我调用A::xyz()B::xyz()的工作表单元格公式范围语法是什么?

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

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


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

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


Q3)我在工作表单元格公式[在工作簿Q.xlsm中]中使用什么语法来调用P.xlam::A::xyz()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的任何其他模块中没有重载,那么速记范围语法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:TempWorkbook1.xlsx]Scores'!$B$10
'[Workbook2.xlsx]Roster'!Teams

如果有人知道描述"此工作簿的完整路径"并适合用作"[workbook_file_path]"字段的内置快捷方式语法,请发表评论。(注意,我不是在谈论创建一个使用=CELL("filename",A1)或其某种变体的INDIRECT()kludge。

最新更新