【问题标题】:Excel cell formula scope rules for selecting VBA modules用于选择 VBA 模块的 Excel 单元格公式范围规则
【发布时间】:2017-10-12 21:22:18
【问题描述】:

假设我有一个启用宏的 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 函数名称的范围规则是什么)? p>

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

【问题讨论】:

  • 据我所知,VBA 中没有官方的重载函数的方法。在您的第一种情况下,您可能会收到一条错误消息,而在第二种情况下,将调用同一工作簿中的宏,或者您收到一条错误消息。无论如何,使用同名函数是一种非常糟糕的做法。
  • 为什么同一个xyz()用不同的函数
  • 问题的重点是学习作用域规则和语言语法,而不是争论拥有多个名为 'xyz()' 的函数是否合理。在某些情况下(例如,在使用 3rd 方加载项时)确实会发生名称冲突,并且无法重新命名已发布的函数。

标签: worksheet-function vba


【解决方案1】:

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) 我在工作表单元格公式 [in workbook 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:\Temp\Workbook1.xlsx]Scores'!$B$10
'[Workbook2.xlsx]Roster'!Teams

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

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多