是的,不是的。在这种情况下,这并不太难;但是,它也没有常规 Excel 函数所具有的有用工具提示和说明。
您还应该知道,UDF 仅适用于包含其代码的工作簿。例外情况是 PERSONAL 文件(在第一次宏录制期间自动创建,并且始终在后台打开)和加载项。如果您是唯一使用此公式的人,则任何一个选项都可能有效,并且只需要将代码放在一个位置。如果您打算在其他人的工作簿中使用此公式,最简单的解决方案可能是将自定义 UDF 放入将使用它的每个工作簿中。但是,您也可以将 UDF 添加到新工作簿中,将其另存为加载项,然后将其分发给同样使用工作簿的每个人。当然,这两种解决方案都存在潜在的宏安全权限问题,因为 Excel 中的默认设置往往是“运行许可”或“从不运行”。
一般而言,使用 VBA,您通常可以在工作表函数名称前添加 Application.,以允许 VBA 像往常一样使用它们。如果您打开代码编辑器,您可以添加一个模块(不是类模块或用户窗体,只是一个普通的常规模块)并输入Function FunctionName。 VBA 将自动添加所需的End Function。您只需要在这两行之间添加所需的代码。
注意事项
如果您选择重命名您放入代码的模块,请不要将模块名称与函数名称匹配。它使 Excel 感到困惑。
在 VBA 中创建自定义函数时,新程序员有时会忘记如何让函数返回值。您可以通过在函数结束之前将要返回的值分配给函数来做到这一点(您将能够在附加的代码中看到这是如何完成的)。
对于您的特定方程式,当更改为 Application.Match 和 Application.Index 时,MATCH 和 INDEX 函数都会按预期工作。不幸的是,OFFSET 函数没有。在您的场景中,您正在使用 OFFSET 函数来调整大小。由于要传递的参数都是 Ranges,所以可以使用 range 的 .Resize 属性来做相当于原始 OFFSET 的事情。
我冒昧地将方程中的变量重命名为更具描述性(英文)的术语;如果需要,可以随意重命名它们(您必须执行查找/替换,因为如果变量的名称更改,VBA 编辑器不会自动更改对变量的引用)。使用 UDF 时,如果您在公式栏中输入 UDF 的名称后使用 Ctrl+Shift+A,参数名称将被填写(快捷方式由 JustinJDavies 提供)如果您想尝试为您的 UDF 获取工具提示,@987654322 @
代码
这可能不是编写此特定 UDF 的最佳或最有效的方式;但是,它应该是功能性的(请注意:您可能需要将 , 更改为 ;,我不确定 Excel 函数的语言特定方面是否会传递到 VBA 代码编辑器)。如果您确实想尝试找到更好的方法来编写此代码或任何其他功能代码,您应该尝试查看Code Review 论坛。
Function MYUDF(SearchArea As Range, RowMatch As Range, ColumnMatch As Range)
MYUDF = Application.Index(SearchArea, Application.Match(RowMatch, SearchArea.Resize(, 1), 0), Application.Match(ColumnMatch, SearchArea.Resize(1), 0))
End Function