假设我有一个启用宏的 Excel 工作簿Q.xlsm
包含两个用户定义的模块A
和B
,并且每个模块都有一个名为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.xlsm
和Q.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。