LAMBDA 是 Excel 的新超级函数

目前,Microsoft Excel 有近五百个工作表函数可通过函数向导窗口 - 按钮 fx 在公式栏中。 这是一个非常不错的集合,但是,几乎每个用户迟早都会遇到此列表不包含他需要的功能的情况——仅仅是因为它不在 Excel 中。

到目前为止,解决这个问题的唯一方法是宏,即在 Visual Basic 中编写自己的用户定义函数(UDF = User Defined Function),这需要适当的编程技巧,而且有时一点也不容易。 然而,随着最新的 Office 365 更新,情况有所好转——Excel 中添加了一个特殊的“包装”功能 LAMBDA. 在它的帮助下,创建自己的函数的任务现在可以轻松而精美地解决。

下面我们来看看它的使用原理。

您很可能知道,Excel 具有多个日期解析函数,可让您确定给定日期的日、月、周和年的编号。 但是由于某种原因,没有确定季度数的函数,这也是经常需要的,对吧? 让我们解决这个缺点并创建 LAMBDA 自己的新功能来解决这个问题。

步骤 1. 写公式

让我们从一个事实开始,我们将以通常的方式手动在表格单元格中编写一个公式来计算我们需要的内容。 对于季度数字,可以这样做,例如,如下所示:

LAMBDA 是 Excels 新的超级函数

步骤 2. 结束 LAMBDA 并进行测试

现在是时候应用新的 LAMBDA 函数并将我们的公式包装在其中了。 函数语法如下:

=拉姆达(变量 1; 变量 2; ... 变量N ; 口语)

其中首先列出一个或多个变量的名称,最后一个参数始终是使用它们的公式或计算表达式。 变量名称不应看起来像单元格地址,并且不应包含点。

在我们的例子中,只有一个变量——我们计算季度数的日期。 让我们为它调用变量,比如说,d。 然后将我们的公式包装在一个函数中 LAMBDA 并用虚构的变量名替换原始单元格 A2 的地址,我们得到:

LAMBDA 是 Excels 新的超级函数

请注意,经过这样的转换,我们的公式(实际上是正确的!)开始产生错误,因为现在单元格 A2 中的原始日期没有转移到它。 为了测试和信心,您可以通过在函数后添加参数来传递参数 LAMBDA 在括号内:

LAMBDA 是 Excels 新的超级函数

步骤 3. 创建名称

现在是简单而有趣的部分。 我们开 名称管理员 标签 公式 (公式 - 名称管理器) 并使用按钮创建一个新名称 创建 (创建). 想出并输入我们未来函数的名称(例如, 诺姆克瓦尔塔拉),并在现场 链接 (参考) 仔细从公式栏中复制并粘贴我们的函数 LAMBDA,只有没有最后一个参数(A2):

LAMBDA 是 Excels 新的超级函数

一切。 点击后 OK 创建的函数可以在此工作簿的任何工作表上的任何单元格中使用:

LAMBDA 是 Excels 新的超级函数

在其他书籍中使用

因为创建于 LAMBDA 由于用户定义的函数实际上是命名范围,因此您可以轻松地使它们不仅在当前工作簿中可用。 使用该功能复制单元格并将其粘贴到另一个文件的工作表中的任何位置就足够了。

LAMBDA 和动态数组

使用函数创建的自定义函数 LAMBDA 成功支持使用新的动态数组及其函数(FILTER, K, GRADE) 于 2020 年添加到 Microsoft Excel。

假设我们要创建一个新的用户定义函数,该函数将比较两个列表并返回它们之间的差异——第一个列表中不在第二个列表中的元素。 生活的工作,不是吗? 以前,为此他们使用了任何一个函数 VPR (VLOOKUP)、数据透视表或 Power Query 查询。 现在您可以使用一个公式:

LAMBDA 是 Excels 新的超级函数

在英文版中,它将是:

=LAMBDA(a;b;ФИЛЬТР(a;СЧЁТЕСЛИ(b;a)=0))(A1:A6;C1:C10)

这里的功能 COUNTIF 计算第二个列表中第一个列表的每个元素出现的次数,然后函数 FILTER 只选择那些没有发生这些事件的人。 通过将这个结构包裹在 LAMBDA 并基于它创建一个带有名称的命名范围,例如, 搜索分布 – 我们将得到一个方便的函数,它以动态数组的形式返回比较两个列表的结果:

LAMBDA 是 Excels 新的超级函数

如果源数据不是普通的,而是“智能”表,我们的函数也可以毫无问题地处理:

LAMBDA 是 Excels 新的超级函数

另一个例子是通过将文本转换为 XML 来动态拆分文本,然后使用我们最近解析的 FILTER.XML 函数逐个单元格地解析它。 为了不用每次都手动重现这个复杂的公式,将其包裹在 LAMBDA 中并基于它创建动态范围会更容易,即一个新的紧凑且方便的函数,将其命名,例如 RAZDTEXT:

LAMBDA 是 Excels 新的超级函数

该函数的第一个参数是包含源文本的单元格,第二个参数是分隔符,它将以水平动态数组的形式返回结果。 功能代码如下:

=拉姆达(t;d; 转置(过滤器.XML(““&代替(t;d? “«)&»“;”//是)))

示例的列表是无穷无尽的——在您经常需要输入相同冗长而繁琐的公式的任何情况下,LAMBDA 函数将使生活变得更加轻松。

递归枚举字符

之前的所有示例都只展示了 LAMBDA 函数最明显的一个方面——它用作“包装器”,用于将长公式包装在其中并简化其输入。 事实上,LAMBDA 还有另一个更深层次的方面,可以将其变成几乎成熟的编程语言。

事实是 LAMBDA 函数的一个基本重要特征是能够在 递归 – 计算逻辑,在计算过程中函数调用自身。 从习惯上看,可能听起来很毛骨悚然,但在编程中,递归是很常见的事情。 即使在 Visual Basic 的宏中,您也可以实现它,而现在,正如您所看到的,它已经出现在 Excel 中。 让我们尝试通过一个实际示例来理解这种技术。

假设我们要创建一个用户定义的函数,该函数将从源文本中删除所有给定的字符。 这样一个功能的用处,我想,你不需要证明——在它的帮助下清除乱七八糟的输入数据会很方便,对吧?

然而,与前面的非递归示例相比,有两个困难等待着我们。

  1. 在开始编写代码之前,我们必须为函数取一个名字,因为在其中,这个名字已经被用来调用函数本身。
  2. 将这样的递归函数输入到单元格中并通过在 LAMBDA 之后的括号中指定参数来调试它(就像我们之前所做的那样)将不起作用。 您必须立即“从头开始”创建一个函数 名称管理员 (名称管理器).

让我们调用我们的函数,比如说,CLEAN,我们希望它有两个参数——要清理的文本和作为文本字符串的排除字符列表:

LAMBDA 是 Excels 新的超级函数

让我们像之前一样在选项卡上创建 公式 в 名字经理 命名范围,将其命名为 CLEAR 并在字段中输入 范围 以下构造:

=LAMBDA(t;d;IF(d=””;t;CLEAR(替代(t;LEFT(d);””);MID(d;2;255))))

这里变量t是要清除的原文,d是要删除的字符列表。

这一切都是这样工作的:

迭代1

正如您可能猜到的那样,片段 SUBSTITUTE(t;LEFT(d);””) 将源文本 t 中要删除的集合 d 左侧字符的第一个字符替换为空文本字符串,即删除“一个”。 作为中间结果,我们得到:

Vsh zkz n 125 卢布。

迭代2

然后函数调用自身,作为输入(第一个参数)接收上一步清理后剩下的内容,第二个参数是排除字符的字符串,不是从第一个字符开始,而是从第二个字符开始,即“BVGDEEGZIKLMNOPRSTUFHTSCHSHSHCHYYYYA. ,” 没有初始的“A”——这是由 MID 函数完成的。 和以前一样,该函数从其余字符 (B) 的左侧开始获取第一个字符,并将其在给它的文本 (Zkz n 125 卢布) 中替换为一个空字符串——我们得到一个中间结果:

125 卢比。

迭代3

该函数再次调用自身,作为第一个参数接收要在前一次迭代中清除的文本(Bsh zkz n 125 ru。),作为第二个参数,排除的字符集被一个字符截断为左边,即“VGDEEGZIKLMNOPRSTUFHTSCHSHSHCHYYYYUYA.”,没有首字母“B”。 然后它再次从该集合中获取左侧的第一个字符 (B) 并将其从文本中删除——我们得到:

sh zkz n 125 ru。

等等——我希望你能明白。 在每次迭代中,要删除的字符列表将在左侧截断,我们将搜索集合中的下一个字符并将其替换为 void。

当所有字符用完时,我们需要退出循环——这个角色只是由函数执行 IF (如果),我们的设计被包裹在其中。 如果没有剩余的字符要删除(d=””),则函数不应再调用自身,而应简单地以最终形式返回要清除的文本(变量 t)。

单元格的递归迭代

同样,您可以在给定范围内实现单元格的递归枚举。 假设我们要创建一个名为 替换清单 根据给定的参考列表批量替换源文本中的片段。 结果应如下所示:

LAMBDA 是 Excels 新的超级函数

那些。 在我们的功能 替换清单 将有三个论点:

  1. 带有要处理的文本的单元格(源地址)
  2. 具有要从查找中搜索的值的列的第一个单元格
  3. 查找中具有替换值的列的第一个单元格

该函数应在目录中从上到下依次替换左列中的所有选项 找到 到右栏中的相应选项 替代. 您可以使用以下递归 lambda 函数来实现这一点:

LAMBDA 是 Excels 新的超级函数

这里,变量 t 存储来自下一列单元格的原始文本 地址,变量 n 和 z 指向列中的第一个单元格 找到 и 替代
和前面的例子一样,这个函数首先用函数替换原来的文本 替代 (代替) 目录第一行的数据(即 bon 圣彼得堡),然后调用自身,但在目录中向下移动到下一行(即替换 圣彼得堡 on 圣彼得堡)。 然后通过降档再次调用自身 - 并替换已经 彼得 on 圣彼得堡 等等

每次迭代时的下移由标准的 excel 函数实现 处置 (抵消),在这种情况下,它具有三个参数——原始范围、行移位 (1) 和列移位 (0)。

好吧,一旦我们到达目录的末尾(n = “”),我们就必须结束递归——我们停止调用自己并显示在源文本变量 t 中所有替换后累积的内容。

就这样。 没有棘手的宏或 Power Query 查询——整个任务由一个函数解决。

  • 如何使用 Excel 新增的动态数组函数:FILTER、SORT、UNIC
  • 使用 SUBSTITUTE 函数替换和清理文本
  • 在 VBA 中创建宏和用户定义函数 (UDF)

发表评论