如何从标准 Excel 表达式创建 Excel-UDF?

Posted

技术标签:

【中文标题】如何从标准 Excel 表达式创建 Excel-UDF?【英文标题】:How to create an Excel-UDF from a standard Excel expression? 【发布时间】:2019-04-09 19:56:58 【问题描述】:

希望您能帮助我解决以下 Excel 问题。我有一些 Excel 工作簿,其中包含许多以下类型的公式:

(英文:)

=INDEX("ARRAY1";MATCH("CELL1";OFFSET("ARRAY1";0;0;ROWS("ARRAY1");1);0);MATCH("CELL2";OFFSET("ARRAY1";0;0;1;COLUMNS("ARRAY1"));0))

(德语:)

=INDEX("ARRAY1";VERGLEICH("CELL1";BEREICH.VERSCHIEBEN("ARRAY1";0;0;ZEILEN("ARRAY1");1);0);VERGLEICH("CELL2";BEREICH.VERSCHIEBEN("ARRAY1";0;0;1;SPALTEN("ARRAY1"));0))

您会看到此公式仅包含 3 个参数“ARRAY1”、“CELL1”和“CELL2”。因此,我想用类似=MYUDF("ARRAY1";"CELL1","CELL2") 的表达式替换上面的公式,它的作用完全相同。

你能告诉我,是否有一种简单的方法来创建像 MYUDF 这样的 udf?

非常感谢!

【问题讨论】:

【参考方案1】:

是的,不是的。在这种情况下,这并不太难;但是,它也没有常规 Excel 函数所具有的有用工具提示和说明。

您还应该知道,UDF 仅适用于包含其代码的工作簿。例外情况是 PERSONAL 文件(在第一次宏录制期间自动创建,并且始终在后台打开)和加载项。如果您是唯一使用此公式的人,则任何一个选项都可能有效,并且只需要将代码放在一个位置。如果您打算在其他人的工作簿中使用此公式,最简单的解决方案可能是将自定义 UDF 放入将使用它的每个工作簿中。但是,您也可以将 UDF 添加到新工作簿中,将其另存为加载项,然后将其分发给同样使用工作簿的每个人。当然,这两种解决方案都存在潜在的宏安全权限问题,因为 Excel 中的默认设置往往是“运行许可”或“从不运行”。

一般而言,使用 VBA,您通常可以在工作表函数名称前添加 Application.,以允许 VBA 像往常一样使用它们。如果您打开代码编辑器,您可以添加一个模块(不是类模块或用户窗体,只是一个普通的常规模块)并输入Function FunctionName。 VBA 将自动添加所需的End Function。您只需要在这两行之间添加所需的代码。


注意事项

如果您选择重命名您放入代码的模块,请不要将模块名称与函数名称匹配。它使 Excel 感到困惑。

在 VBA 中创建自定义函数时,新程序员有时会忘记如何让函数返回值。您可以通过在函数结束之前将要返回的值分配给函数来做到这一点(您将能够在附加的代码中看到这是如何完成的)。

对于您的特定方程式,当更改为 Application.MatchApplication.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

【讨论】:

非常感谢,这很有帮助!

以上是关于如何从标准 Excel 表达式创建 Excel-UDF?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 .NET 标准格式字符串转换为 Excel 格式字符串

如何转置 Excel 数据透视表

具有自定义标准偏差的 Excel 图表

React Native:如何从代码创建 excel 文件?

如何使用 C# 从 DataSet 创建包含多个工作表的 excel 文件

excel如何拟合s形曲线