Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Еще…Меньше
Windows: 16.0.14729
Mac: 16.56 (сборка 211211)
Web: представлено 18 марта 2022 г.
iOS: 2.56 (сборка 211207)
Android: 16.0.14729
С помощью функции ЛЯМБДА можно создавать пользовательские функции для повторного использования и вызывать их по понятным именам. Новая функция доступна во всей книге и вызывается так же, как и основные функции Excel.
Вы можете создать функцию для часто используемой формулы, избавиться от необходимости копировать и вставлять эту формулу (что может приводить к ошибкам), а также эффективно добавлять собственные функции в основную библиотеку функций Excel. Кроме того, функция LAMBDA не требует VBA, макросов или JavaScript, поэтому ее могут использовать также пользователи, не являющиеся программистами.
Синтаксис
=LAMBDA([параметр1; параметр2; …;] вычисление)
Аргумент |
Описание |
---|---|
параметр |
Значение, которое вы хотите передать функции, например ссылку на ячейку, строку или число. Вы можете ввести до 253 параметров. Этот аргумент является необязательным. |
вычисление |
Формула, которую необходимо выполнить и вывести в качестве результата выполнения функции. Это должен быть последний аргумент и он должен возвращать результат. Это обязательный аргумент. |
Замечания
-
Имена и параметры функции LAMBDA соответствуют правилам синтаксиса Excel в отношении именования, за одним исключением: запрещено использовать точку (.) в имени параметра. Дополнительные сведения см. в статье Имена в формулах.
-
При создании функции LAMBDA, как и в случае с любой основной формулой Excel, необходимо придерживаться рекомендаций, например, передавать правильное количество и тип аргументов, следить за соответствием открывающих и закрывающих скобок и вводить числа в неформатированном виде. Кроме того, при использовании команды Вычислить Excel немедленно возвращает результат функции LAMBDA, и вы не сможете выполнить ее пошагово. Дополнительные сведения см. в статье Обнаружение ошибок в формулах.
Ошибки
-
В случае ввода более 253 параметров Excel возвращает ошибку «#ЗНАЧ!».
-
В случае передачи функции LAMBDA неправильного количества аргументов Excel возвращает ошибку «#ЗНАЧ!».
-
Если вы вызываете функцию LAMBDA из самой себя, и вызов является циклическим, Excel может вернуть #NUM! ошибка, если слишком много рекурсивных вызовов.
-
Если создать функцию LAMBDA в ячейке, не вызвав ее также из самой ячейки, Excel возвращает ошибку «#ВЫЧИС!».
Создание функции LAMBDA
Ниже описана пошаговая процедура, выполнив которую, вы обеспечите правильную работу функции LAMBDA, которая будет выполняться аналогично основной функции Excel.
Убедитесь в правильности работы формулы, используемой вами при вычислении аргумента. Это крайне важно, так как при создании функции LAMBDA вам необходимо обеспечить, чтобы формула работала надлежащим образом, и в случае возникновения ошибок или непредвиденного поведения вы могли быть уверены, что не формула является тому причиной. Дополнительные сведения см. в статье Полные сведения о формулах в Excelи Создание простой формулы в Excel.
Рекомендуется создавать и испытывать свою функцию LAMBDA в ячейке, чтобы убедиться в правильности ее работы, включая определение и передачу параметров. Чтобы избежать ошибки #CALC!, добавьте вызов функции LAMBDA, чтобы немедленно вернуть результат:
=функция LAMBDA ([параметр1; параметр2; …];вычисление) (вызов функции)
В приведенном ниже примере возвращается значение 2.
=LAMBDA(number, number + 1)(1)
Завершив создание функции LAMBDA, переместите ее в диспетчер имен для окончательного определения. Таким образом вы сможете присвоить функции LAMBDA понятное имя, добавить описание и обеспечить возможность ее повторного использования в любой ячейке книги. Вы также можете управлять функцией LAMBDA точно так же, как и любым именем, например, строковой константы, диапазона ячеек или таблицы.
Последовательность действий
-
Выполните одно из указанных ниже действий.
-
В Excel для Windows выберите Формулы > Диспетчер имен.
-
В Excel для Mac выберите Формулы > Задать имя.
-
-
Выберите Новое, а затем введите необходимые данные в диалоговом окне Новое имя:
Имя:
Введите имя функции LAMBDA.
Область:
Книга указывается по умолчанию. Также можно выбрать отдельные листы.
Примечание:
Необязательно, но настоятельно рекомендуется. Введите до 255 знаков. Кратко опишите назначение функции, укажите правильное количество и тип аргументов.
Отображается в диалоговом окне Вставить функцию и в виде подсказки (вместе с аргументом Вычисление ) при вводе формулы и использовании функции Автозаполнение формул (Intellisense).
Объект ссылки:
Введите функцию LAMBDA.
Например:
-
Чтобы создать функцию LAMBDA, нажмите ОК.
-
Чтобы закрыть диалоговое окно Диспетчер имен, нажмите Закрыть.
Дополнительные сведения см. в статье Использование Диспетчера имен.
Примеры
Определите в Диспетчере имен следующие данные:
Имя: |
ToCelsius |
Область: |
Книга |
Примечание: |
Преобразование градусов по Фаренгейту в градусы Цельсия |
Объект ссылки: |
=LAMBDA(temp; (5/9) * (Temp-32)) |
Скопируйте данные примера из таблицы ниже и вставьте их в ячейку A1 нового листа Excel. При необходимости измените ширину столбцов, чтобы видеть все данные.
Данные |
|
104 |
|
86 |
|
68 |
|
50 |
|
32 |
|
Формула |
Результат |
=TOCELSIUS(A2) |
40 |
=TOCELSIUS(A3) |
30 |
=TOCELSIUS(A4) |
20 |
=TOCELSIUS(A5) |
10 |
=TOCELSIUS(A6) |
0 |
Определите в Диспетчере имен следующие данные:
Имя: |
Гипотенуза |
Область: |
Книга |
Примечание: |
Возвращает длину гипотенузы прямоугольного треугольника |
Объект ссылки: |
=LAMBDA(a; b; КОРЕНЬ((a^2+b^2))) |
Скопируйте данные примера из таблицы ниже и вставьте их в ячейку A1 нового листа Excel. При необходимости измените ширину столбцов, чтобы видеть все данные.
Данные |
|
3 |
4 |
5 |
12 |
7 |
24 |
9 |
40 |
Формула |
Результат |
=HYPOTENUSE(A2,B2) |
5 |
=HYPOTENUSE(A3,B3) |
13 |
=HYPOTENUSE(A4,B4) |
25 |
=HYPOTENUSE(A5,B5) |
41 |
Определите в Диспетчере имен следующие данные:
Имя: |
CountWords |
Область: |
Книга |
Примечание: |
Возвращает количество слов в текстовой строке |
Объект ссылки: |
=LAMBDA(текст; ДЛСТР(СЖПРОБЕЛЫ(текст)) — ДЛСТР(ПОДСТАВИТЬ(СЖПРОБЕЛЫ(текст); » «; «»)) + 1) |
Скопируйте данные примера из таблицы ниже и вставьте их в ячейку A1 нового листа Excel. При необходимости измените ширину столбцов, чтобы видеть все данные.
Данные |
|
Что-то злое к нам спешит. |
|
Пришел, увидел, победил. |
|
Съешь же еще этих мягких французских булок, да выпей чаю. |
|
Используй Силу, Люк! |
|
Формула |
Результат |
=COUNTWORDS(A2) |
5 |
=COUNTWORDS(A3) |
6 |
=COUNTWORDS(A4) |
9 |
=COUNTWORDS(A5) |
4 |
Определите в Диспетчере имен следующие данные:
Имя: |
ThanksgivingDate |
Область: |
Книга |
Примечание: |
Возвращает дату Дня Благодарения в США в текущем году |
Объект ссылки: |
=LAMBDA(год; ТЕКСТ(ДАТА(год; 11; ВЫБОР(ДЕНЬНЕД(ДАТА(год; 11; 1)); 26; 25; 24; 23; 22; 28; 27)); «mm/dd/yyyy»)) |
Скопируйте данные примера из таблицы ниже и вставьте их в ячейку A1 нового листа Excel. При необходимости измените ширину столбцов, чтобы видеть все данные.
Данные |
|
2020 |
|
2021 |
|
2022 |
|
2023 |
|
2024 |
|
Формула |
Результат |
=THANKSGIVINGDATE(A2) |
11/26/2020 |
=THANKSGIVINGDATE(A3) |
11/25/2021 |
=THANKSGIVINGDATE(A4) |
11/24/2022 |
=THANKSGIVINGDATE(A5) |
11/23/2023 |
=THANKSGIVINGDATE(A6) |
11/28/2024 |
Дополнительные сведения
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
См. также
Функция «LET»
Создание пользовательских функций в Excel
Нужна дополнительная помощь?
На данный момент в Microsoft Excel имеется почти пять сотен функций рабочего листа, доступных через окно Мастера функций — кнопка fx в строке формул. Это весьма приличный набор, но, тем не менее, почти каждый пользователь рано или поздно сталкивается с ситуацией, когда в этом списке не оказывается нужной ему функции — просто потому, что её нет в Excel.
До сих пор единственным способом решить эту проблему были макросы, т.е. написание своей пользовательской функции (UDF = User Defined Function) на Visual Basic, что требует соответствующей программистской квалификации и бывает, порой, совсем непросто. Однако, с последними обновлениями Office 365 ситуация изменилась в лучшую сторону — в Excel была добавлена специальная «обёрточная» функция LAMBDA. С её помощью задача по созданию собственных функций теперь решается легко и красиво.
Давайте рассмотрим принцип её использования на следующем примере.
Как вы, скорее всего, знаете в Excel есть несколько функции для разборки даты позволяющие определить номер дня, месяца, недели и года для указанной даты. Но почему-то нет функции, определяющий номер квартала, который тоже часто нужен, правда? Давайте исправим этот недостаток и создадим с помощью LAMBDA собственную новую функцию для решения этой задачи.
Шаг 1. Пишем формулу
Начём с того, что вручную привычным образом напишем формулу в ячейке листа, которая вычисляет то, что нам нужно. В случае с номером квартала это можно сделать, например, так:
Шаг 2. Заворачиваем в LAMBDA и тестируем
Теперь пришло время применить новую функцию LAMBDA и завернуть в неё нашу формулу. Синтаксис у функции следующий:
=LAMBDA(Переменная1; Переменная2; … ПеременнаяN ; Выражение)
где сначала перечисляются имена одной или нескольких переменных, а последним аргументом всегда идёт формула или вычисляемое выражение, которое их использует. Имена переменных не должны быть похожи на адреса ячеек и не должны содержать точки.
В нашем случае переменная будет только одна — дата, для которой мы считаем номер квартала. Переменную для неё давайте назовем, допустим, d. Тогда завернув нашу формулу в функцию LAMBDA и подменив адрес исходной ячейки A2 на придуманное имя переменной, мы получим:
Обратите внимание, что после такого преобразования наша формула (по сути — правильная!) стала выдавать ошибку, т.к. теперь в неё не передается исходная дата из ячейки А2. Для тестирования и уверенности, можно передать ей аргументы, дописав их после функции LAMBDA в круглых скобках:
Шаг 3. Создаем имя
Теперь самая легкая и приятная часть. Открываем Диспетчер имен на вкладке Формулы (Formulas — Name Manager) и создаём новое имя кнопкой Создать (Create). Придумываем и вводим имя для нашей будущей функции (например, НОМКВАРТАЛА), а в поле Ссылка (Reference) аккуратно копируем из строки формул и вставляем нашу функцию LAMBDA, только без последнего аргумента (А2):
Всё. После нажатия на ОК созданную функцию можно использовать в любой ячейке на любом листе этой книги:
Использование в других книгах
Поскольку созданные с помощью LAMBDA пользовательские функции представляет из себя, по сути, именованные диапазоны, то можно легко сделать их доступными не только в текущей книге. Достаточно будет скопировать ячейку с функцией и вставить в любое место листа другого файла.
LAMBDA и динамические массивы
Пользовательские функции, создаваемые с помощью функции LAMBDA успешно поддерживают работу с новыми динамическими массивами и их функциями (ФИЛЬТР, УНИК, СОРТ), добавленными в Microsoft Excel в 2020 году.
Допустим, мы хотим создать новую пользовательскую функцию, которая сравнивала бы два списка и выдавала разницу между ними — те элементы из первого списка, которые отсутствуют во втором. Жизненная задача, не правда ли? Раньше для такого использовали либо функции а-ля ВПР (VLOOKUP), либо сводные таблицы, либо запросы Power Query. Теперь же можно обойтись одной формулой:
В английской версии это будет:
=LAMBDA(a;b;ФИЛЬТР(a;СЧЁТЕСЛИ(b;a)=0))(A1:A6;C1:C10)
Здесь функция СЧЁТЕСЛИ подсчитывает количество вхождений каждого элемента первого списка во второй, а затем функция ФИЛЬТР отбирает только те из них, у кого этих вхождений не оказалось. Завернув эту конструкцию в LAMBDA и создав на её основе именованный диапазон с названием, например, ПОИСКОТЛИЧ — мы получим удобную функцию, выдающую результат сравнения двух списков в виде динамического массива:
Если в качестве исходных данных будут не обычные, а «умные» таблицы — наша функция тоже справится без проблем:
Другой пример — динамическое разделение текста путём превращения его в XML и последующего разбора по ячейкам с помощью функции ФИЛЬТР.XML, которое мы недавно разбирали. Чтобы не воспроизводить эту сложную формулу каждый раз вручную, проще будет завернуть её в LAMBDA и создать на её основе динамический диапазон, т.е. новую компактную и удобную функцию, назвав её, например, РАЗДТЕКСТ:
Первым аргументом этой функции будет ячейка с исходным текстом, а вторым — символ-разделитель, в возвращать результат она будет в виде горизонтального динамического массива. Код функции при этом будет следующим:
=LAMBDA(t;d; ТРАНСП(ФИЛЬТР.XML(«<x><y>»&ПОДСТАВИТЬ(t;d;»</y><y>»)&»</y></x>»;»//y»)))
Список примеров можно продолжать бесконечно — в любой ситуации, где вам часто приходится вводить одну и ту же длинную и громоздкую формулу функция LAMBDA сделает жизнь ощутимо проще.
Рекурсивный перебор символов
Все предыдущие примеры демонстрировали только одну, наиболее очевидную, сторону функции LAMBDA — её применение в качестве «обёртки» для заворачивания в неё длинных формул и упрощения их ввода. На самом деле, у LAMBDA есть ещё одна, гораздо более глубокая, сторона, превращающая её почти что в полноценный язык программирования.
Дело в том, что принципиально важной особенностью LAMBDA-функций является возможность реализации в них рекурсии — логики вычислений, когда в процессе расчета функция вызывает сама себя. С непривычки, возможно, звучит жутковато, но в программировании рекурсия — обычное дело. Даже в макросах на Visual Basic можно её реализовать, а теперь, вот, как видите, дошло и до Excel. Давайте попробуем разобраться в этой технике на практическом примере.
Предположим, нам требуется создать пользовательскую функцию, которая удаляла бы из исходного текста все заданные символы. Полезность такой функции, думаю, доказывать вам не нужно — с её помощью было бы очень удобно очищать замусоренные входные данные, правда?
Однако, по сравнению с предыдущими, нерекурсивными примерами, нас ожидают две сложности.
- Нам придётся придумать название для нашей функции до того, как мы начнём писать её код, т.к. в нём это название уже будет использоваться для вызова функцией самой себя.
- Ввести такую рекурсивную функцию в ячейку и отлаживать её, указав после LAMBDA аргументы в скобках (как мы делали ранее) не получится. Придётся создавать функцию сразу «с нуля» в Диспетчере Имен (Name Manager).
Назовём нашу функцию, допустим, ОЧИСТКА и хотелось бы, чтобы у неё было два аргумента — текст, который нужно почистить и список исключаемых символов в виде текстовой строки:
Создадим, как делали ранее, на вкладке Формулы в Диспетчере имён именованный диапазон, назовём его ОЧИСТКА и введём в поле Диапазон следующую конструкцию:
=LAMBDA(t;d;ЕСЛИ(d=»»;t;ОЧИСТКА(ПОДСТАВИТЬ(t;ЛЕВСИМВ(d);»»);ПСТР(d;2;255))))
Здесь переменная t — это исходный очищаемый текст, а d — список символов на удаление.
Работает всё это следующим образом:
Итерация 1
Фрагмент ПОДСТАВИТЬ(t;ЛЕВСИМВ(d);»»), как легко догадаться, заменяет в исходном тексте t первый слева символ из удаляемого набора d на пустую текстовую строку, т.е. удаляет букву «А». В качестве промежуточного результата получаем:
Вш зкз н 125 руб.
Итерация 2
Затем функция вызывает сама себя и в качестве входных данных (первый аргумент) получает уже то, что осталось после очистки на предыдущем шаге, а вторым аргументом задавая строку исключаемых символов начиная не с первого, а со второго символа, т.е. «БВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ.,» без начальной «А» — это делает функция ПСТР. Как и до этого, функция берет первый слева символ из оставшихся (Б) и заменяет его в данном ей тексте (Зкз н 125 руб.) на пустую строку — получаем в качестве промежуточного результата:
Вш зкз н 125 ру.
Итерация 3
Функция опять вызывает сама себя, получая в качестве первого аргумента то, что осталось от зачищаемого текста на предыдущей итерации (Вш зкз н 125 ру.), а в качестве второго — урезанный слева ещё на один символ набор исключаемых знаков, т.е. «ВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ.,» без начальной «Б». Затем опять берёт из этого набора первый символ слева (В) и удаляет его из текста — получаем:
ш зкз н 125 ру.
И так далее — надеюсь, вы ухватили идею. С каждой итерацией список удаляемых символов будет обрезаться слева и мы будем искать и заменять на пустоту очередной символ из набора.
Когда все символы закончатся нам необходимо будет выйти из цикла — эту роль как раз и выполняет функция ЕСЛИ (IF), в которую завернута наша конструкция. Если символов для удаления не осталось (d=»»), то функция не должна больше вызывать саму себя, а просто должна вернуть зачищаемый текст (переменная t) в его финальном виде.
Рекурсивный перебор ячеек
Похожим образом можно реализовать и рекурсивный перебор ячеек в заданном диапазоне. Предположим, что мы хотим создать лямбда-функцию с именем ЗАМЕНАПОСПИСКУ для оптовой замены фрагментов в исходном тексте по заданному списку-справочнику. Выглядеть всё это в результате должно так:
Т.е. у нашей функции ЗАМЕНАПОСПИСКУ будет три аргумента:
- ячейка с текстом для обработки (исходный адрес)
- первая ячейка столбца со значениями для поиска из справочника
- первая ячейка столбца со значениями на замену из справочника
Функция должна проходить сверху-вниз по справочнику и заменять последовательно все варианты из левого столбца Найти на соответствующие варианты из правого столбца Заменить. Реализовать такое можно следующей рекурсивной лямбда-функцией:
Здесь в переменной t хранится исходный текст из очередной ячейки столбца Адрес, а переменные n и z указывают на первые ячейки в столбцах Найти и Заменить, соответственно.
Как и в предыдущем примере, сначала эта функция заменяет в исходном тексте с помощью функции ПОДСТАВИТЬ (SUBSTITUTE) данные по первой строке справочника (т.е. СПб на Санкт-Петербург), а затем вызывает сама-себя, но со сдвигом по справочнику вниз на следующую строку (т.е. заменяет С-Пб на Санкт-Петербург). Затем вызывает себя ещё раз со сдвигом вниз — и заменяет уже Питер на Санкт-Петербург и т.д.
Сдвиг вниз на каждой итериации реализован стандартной экселевской функцией СМЕЩ (OFFSET), у которой в данном случае три аргумента — исходный диапазон, сдвиг по строкам (1) и сдвиг по столбцам (0).
Ну, и как только мы достигаем конца справочника (n=»»), то должны закончить рекурсию — прекращаем вызывать сами себя и выводим то, что накопилось после всех выполненных замен в переменной исходного текста t.
Вот и всё. Никаких хитрых макросов или запросов Power Query — вся задача решается одной функцией.
Ссылки по теме
- Как использовать новые функции динамических массивов Excel: ФИЛЬТР, СОРТ, УНИК
- Замена и зачистка текста функцией ПОДСТАВИТЬ
- Создание макросов и пользовательских функций (UDF) на VBA
Время на прочтение
2 мин
Количество просмотров 16K
Microsoft теперь называет электронные таблицы Excel языком программирования, а с добавлением лямбд он стал полным по Тьюрингу.
Язык программирования считается полным по Тьюрингу, если на нём можно реализовать любой возможный алгоритм. Именно эту возможность реализуют лямбды.
Проект разработала научно-исследовательская группа Calc Intelligence в Кембриджском университете. Они давно поставили задачу превратить формулы Excel в полноценный язык программирования.
LAMBDA могут ссылаться на другие функции лямбды, с любой глубиной вложенных ссылок, даже рекурсивно. Именно это даёт возможность выразить на языке программирования Excel любое вычисление.
В данный момент лямбды доступны участникам программы бета-тестирования Excel.
Изначально исследователи из Укембриджа скептически отнеслись к идее выкатить лямбды на массовую аудиторию. Они считали, что это слишком сложная функция для среднего пользователя Excel. Но потом получили массу восторженных отзывов от тестеров — и изменили своё мнение. Оказалось, что пользователи нашли массу интересных применений для LAMBDA, причём многие из них исследователи даже не могли себе представить.
Кроме того, особые навыки требуются для написания лямбд, а не для их использования. Таким образом, программисты могут расширить сферу применения приложений Excel, не вызывая дополнительных неудобств у конечных пользователей, которые просто воспользуются результатом.
«Интересно посмотреть, как пользователи будут экспериментировать не только с лямбдами, но с типами данных и динамическими массивами. Мы считаем, что эти новые функции функционального программирования изменят подход к работе в Excel», — написал в корпоративном блоге Энди Гордон, старший научный руководитель Microsoft Research.
По мнению создателей, это открывает богатые возможности для программирования в Excel, потому что аудитория Excel «на порядок больше, чем количество всех программистов в мире на C, C++, C#, Java и Python, вместе взятых».
«В ближайшей перспективе будут реализованы полностью вложенные массивы и эффективные комбинаторы обработки массивов, такие как MAP и REDUCE, которые принимают лямбда-функции в качестве аргументов, — говорят исследователи. — Кроме того, мы надеемся определять функции не только по одной формуле, но и по целому листу с электронной таблицей, это так называемые функции листа (sheet-defined functions) или даже эластичные функции листа (elastic sheet-defined functions). С практической точки зрения, функции листа идут в ногу с потоком типичного проектирования электронных таблиц, позволяя пользователям определять более крупную функцию с помощью нескольких формул, распределённых по нескольким ячейкам».
В посте Microsoft Research от 25 января приводится больше технических деталей, которые могут быть интересны любителям математики и программистам. Есть также видео:
В декабре 2020 года Microsoft анонсировал функцию LAMBDA, которая позволяет определять пользовательские функции, написанные на языке формул Excel. Я недавно привел примеры того, как работает LAMBDA. Но Microsoft на этом не остановился, и в июле 2021 г. объявил о создании новых функций, основанных на LAMBDA:
MAP: принимает в качестве аргумента массив, и возвращает массив того же размера, обработав каждый элемент с помощью функции LAMBDA.
REDUCE: реализует цикл обработки элементов массива, применяя функцию LAMBDA к каждому значению и возвращает одно накопленное значение.
SCAN: реализует цикл обработки элементов массива, применяя функцию LAMBDA к каждому значению и возвращает массив того же размера, содержащий все промежуточные значения.
MAKEARRAY: возвращает массив с заданным числом строк и столбцов, применяя функцию LAMBDA для вычисления элементов массива.
BYCOL: возвращает массив в виде строки, один результат для каждого столбца массива.
BYROW: возвращает массив в виде столбца, один результат для каждой строки массива.
ISOMITTED: проверяет, отсутствует ли значение, и возвращает ИСТИНА, в противном случае – ЛОЖЬ.
Скачать заметку в формате Word или pdf, примеры в формате Excel
Функция MAP
Цель – создать массив того же размера, что и исходный, преобразовав каждый элемент с помощью функции LAMBDA. Синтаксис:
=MAP(массив1; [массив2]; [массив#]; LAMBDA) |
массив1 – массив который нужно сопоставить (обязательный);
массив2 – еще один массив для сопоставления (необязательный);
массив# – еще массивы для сопоставления (необязательный);
LAMBDA – функция LAMBDA, которая должна быть последним аргументом и включать столько параметров, сколько передано массивов (обязательный).
Рис. 1. Синтаксис функции MAP
Квадраты целых чисел, превышающих определенное значение
Следующая формула принимает массив А1:С2 и возвращает массив D4:F5. Если элемент в исходном массиве не больше 4, возвращается его значение, если более – квадрат значения:
=MAP(A1#;LAMBDA(a;ЕСЛИ(a>4;a^2;+a))) |
Рис. 2. Квадраты целых чисел, превышающих определенное значение
По поводу использования +a в качестве третьего аргумента функции ЕСЛИ() на сайте Microsoft и в Инете сказано, что обозначение +a используется для принудительного преобразования из ссылки на диапазон в массив значений. Без знака + функция MAP может вернуть ошибку #ВЫЧИСЛ! Этот шаг иногда необходим при работе с формулами массива, которые разливаются в диапазон. Я поэкспериментировал, но мне не удалось получить ошибку #ВЫЧИСЛ!. Так что запись
=MAP(A1#;LAMBDA(a;ЕСЛИ(a>4;a^2;a))) |
… тоже работает. Возможно, ошибка существовала в более ранних версиях, а сейчас устранена.
Применение логического И к двум массивам
Следующая формула в качестве аргументов принимает два массива – столбцы Элемент1 и Элемент2, и возвращает ИСТИНА, только если оба значения в одной строке = ИСТИНА:
=MAP(Таблица1[Элемент1];Таблица1[Элемент2];LAMBDA(a;b;И(a;b))) |
Рис. 3. Массив, основанный на логическом И
Фильтрация строк, отвечающих нескольким условиям
Рис. 4. Вывод элементов массива по критериям
Следующая формула фильтрует таблицу А1:В11, оставляя только строки, которые соответствуют критериям отбора:
=ФИЛЬТР( Таблица3; MAP( Таблица3[Размер]; Таблица3[Цвет]; LAMBDA( разм; цвет; И(разм=E2;цвет=E3) ) ) ) |
Удаление не цифр
В ячейке А2 я создал случайный массив из цифр, прописных и строчных букв английского алфавита и некоторых специальных символов:
Рис. 5. Массив случайных символов
Проанализируем формулу
=СИМВОЛ(СЛМАССИВ(12;6;48;122;ИСТИНА)) |
Функция СЛМАССИВ() создает массив из 12 строк и 6 столбцов целых чисел (аргумент ИСТИНА) в диапазоне от 48 до 122.
Рис. 6. Таблица ASCII кодов
Функция СИМВОЛ() выводит символ по его ASCII коду. Функция СЛМАССИВ() волатильна, т.е. её значения меняются с любым изменением на листе Excel. Можно принудительно запускать пересчет, нажимая кнопку F9.
Создадим новый массив, который вернет только цифры:
Рис. 7. Функция MAP возвращает массив чисел
Несколько слов о формуле
=MAP(ЗНАЧЕН(A2#);LAMBDA(a;ЕСЛИ(ЕЧИСЛО(a);+a;»»))) |
Функция MAP() принимает массив А2#, обернутый в функцию ЗНАЧЕН(). Функция СИМВОЛ() возвращает текст, даже, если это цифра. ЕЧИСЛО() проверяет является символ числом. Если да, то возвращается сам символ +а, если нет – пустая строка «».
Когда использовать MAP
Механизм динамических массивов в Excel может выполнять ряд операций с массивами и без использования MAP. Например, следующие формулы возвращают один и тот же результат:
=MAP(массив; LAMBDA(a;a+1)) |
В таких кейсах использование MAP не оправдано. Однако есть случаи, когда MAP может быть полезна:
- Для выполнения логических тестов с функциями И, ИЛИ.
- Для выполнения операций агрегирования нескольких массивов. Например,
=MAP(rng1;rng2;rng3; LAMBDA(a;b;c;МАКС(a;b;c))) |
- Чтобы заставить функцию разлиться, чего в противном случае не будет.
Функция MAP возвращает массив результатов. Если вы хотите обрабатывать каждый элемент в массиве по отдельности, но получить единый агрегированный результат, вам нужна функция REDUCE.
Рис. 8. Максимальные значения трех массивов
Фильтрация таблицы по условию, рассчитываемому налету
Пусть у нас есть данные многолетних наблюдений температуры в Москве:
Рис. 9. Среднемесячные температуры в Москве по годам
Наша цель – оставить только те строки таблицы, которые соответствуют среднегодовой температуре > 6°C… и представить все данные по шкале Фаренгейта (извините за некоторую искусственность примера). С этим преобразованием справится следующая формула:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
=MAP( ФИЛЬТР( Таблица4; BYROW( Таблица4; LAMBDA( год; СРЗНАЧ(год)>S2) ); «нет данных» ); LAMBDA( темп; ЕСЛИ( ЕЧИСЛО(темп); ПРЕОБР(темп;«C»;«F»); Темп ) ) ) |
Чтобы номера годов не участвовали в вычислениях среднего значения по строке я предварительно преобразовал их в текст с помощью формулы ТЕКСТ(год;»0000″).
Рис. 10. В правом массиве отфильтрованы строки, соответствующие среднегодовой температуре > 6°C; температура указана по шкале Фаренгейта
Проанализируем формулу. Функция MAP() имеет два аргумента: массив (рис. 11а) и LAMBDA (рис. 11б).
Рис. 11. Два аргумента функции MAP
Первый аргумент фильтрует исходную таблицу, т.е., оставляет только строки с годами, соответствующими условию, второй – преобразует значения элементов отфильтрованного массива.
Рис. 12. Три аргумента функции ФИЛЬТР
Функция ФИЛЬТР() имеет три аргумента: массив – ссылается на таблицу без строки заголовка (Таблица4); включить – какие строки таблицы оставить (функция BYROW); если_пусто – что вывести, если строк после фильтрации не осталось.
Функция BYROW() подробнее будет рассмотрена ниже. Она принимает в качестве первого аргумента массив (Таблица4), и обрабатывает его с помощью функции LAMBDA(год;СРЗНАЧ(год)>S2). BYROW() возвращает массив в виде одного столбца с количеством строк, равным числу строк в Таблица4. Массив, возвращаемый BYROW(), содержит значения ИСТИНА, если СРЗНАЧ(год)>S2, или ЛОЖЬ, если условие не выполнено.
Второй аргумент функции MAP преобразует значения элементов отфильтрованного массива. Преобразование выполняется внутри функции LAMBDA.
Рис. 13. Два аргумента функции LAMBDA
Первый аргумент функции LAMBDA – параметр (темп). Этот параметр кодирует (ссылается на) массив, возвращаемый функции ФИЛЬТР(). Параметр темп обрабатывается функцией ЕСЛИ.
Рис. 14. Три аргумента функции ЕСЛИ
Первый аргумент функции ЕСЛИ() – лог_выражение – проверяет, является ли элемент массива (отфильтрованной Таблица4) числом. Если да, то возвращается значение_если_истина – ПРЕОБР(темп;»C»;»F»). Именно здесь происходит преобразование градусов Цельсия в Фаренгейта. Если проверяемый элемент массива не является числом (а в Таблица4 таковыми будут только года), то возвращается сам элемент.
Вуаля))
Функция REDUCE
Смысл функции – обработать массив, чтобы вернуть одно число. Синтаксис:
=REDUCE([начальное_значение]; массив; LAMBDA(а; b; вычисление)) |
[начальное_значение] – задает начальное значение для аккумулятора (необязательный аргумент);
массив – массив, каждый элемент которого нужно обработать с помощью функции LAMBDA;
LAMBDA – функция обработки элементов массива. Поскольку функция REDUCE имеет два параметра – начальное_значение и массив, функция LAMBDA также включает два параметра, ссылающиеся на начальное_значение и массив:
- а – аккумулятор, накапливает значение, возвращаемое в качестве конечного результата функцией REDUCE; сначала аккумулятор получает начальное_значение, а затем изменяется с каждым циклом обработки массива.
- b – ссылается на массив (другими словами – на каждый элемент массива).
Третий аргумент функции LAMBDA – вычисление – задает порядок обработки элементов массива.
Суммирование квадратов значений
Рис. 15. Суммирование квадратов элементов массива
Разберем формулу
=REDUCE(;A1#;LAMBDA(a;b;a+b^2)) |
Функция REDUCE имеет три аргумента. Первый – initial_value – необязательный (рис. 16а). Иногда его можно опустить, иногда следует явно указать ноль (см. пример 3). Иногда нужно присвоить значение, отличное от нуля, чтобы избежать деления или умножения на ноль. Второй аргумент – array – обязательный (рис. 16б). Это массив, вычисления по которому вернет одно значение. В нашем примере аргумент задается динамическим массивом А1#, который разлит в диапазоне А1:С2. Третий аргумент – function – обязательный. Он задает функцию обработки массива. По определению здесь может использоваться только функция LAMBDA. Параметр a соответствует начальному значению (равному нулю), b – массиву А1#. В третьем аргументе функции LAMBDA происходит суммирование квадратов всех элементов массива А1#.
Если вы немного программируете, то воспринимайте аргумент a+b^2, как выражение внутри цикла: a = a + b^2.
Рис. 16. Три аргумента функции REDUCE
Произведение значений, превышающих критерий
Задача – найти произведение всех элементов массива, значение которых превышает 50. Используем формулу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
=ЕСЛИ( REDUCE(1;A2#;LAMBDA(a;b;ЕСЛИ(b>50;a*b;a)))=1; «нет значений более 50»; REDUCE( 1; A2#; LAMBDA( a; b; ЕСЛИ( b>50; a*b; a ) ) ) ) |
Рис. 17. Произведение значений, превышающих критерий
Основное действие происходит в этом фрагменте:
REDUCE( 1; A2#; LAMBDA( a; b; ЕСЛИ( b>50; a*b; a ) ) ) |
Функция REDUCE имеет три аргумента: initial_value = 1, array – A2#, function – LAMBDA(a;b;ЕСЛИ(b>50;a*b;a)). LAMBDA принимает два параметра: а = 1 и b = массив A2#. Третий аргумент функции LAMBDA – расчет = ЕСЛИ(b>50;a*b;a). Если элемент массива A2# > 50, умножаем значение элемента на произведение, полученное на предыдущем шаге. Иначе, оставляем произведение, полученное на предыдущем шаге без изменения. Переходим к следующему элементу.
Функция REDUCE() обёрнута во внешнее ЕСЛИ(). Здесь проверяется: если REDUCE = 1, значит не нашлось ни одного элемента > 50. Возвращается текст «нет значений более 50». Иначе возвращается значение REDUCE().
Сумма четных и нечетных значений
Рис. 18. Сумма четных и нечетных значений
С кодом формулы предлагаю вам разобраться самостоятельно:
=REDUCE(0;A2#;LAMBDA(a;b;ЕСЛИ(ЕЧЁТН(b);a+b;a))) |
Подсчет числа значений, удовлетворяющих критерию
Продолжим примеру со среднемесячными температурами в Москве. Подсчитаем, сколько месяцев за последовательные 10-летние периоды имели среднюю температуру ≥ 18°С:
Рис. 19. Число месяцев в десятилетии, начинающемся с указанного года, с температурой ≥ 18°С
=REDUCE( 0; ДВССЫЛ(«B»&(O5—1879)&«:M»&(O5—1870)); LAMBDA( a; b; ЕСЛИ(b>=$O$2;a+1;a) ) ) |
Функция REDUCE имеет три аргумента: initial_value = 0, array – ДВССЫЛ(«B»&(O5-1879)&»:M»&(O5-1870)), function – LAMBDA(a;b;ЕСЛИ(b>=$O$2;a+1;a)). Функция ДВССЫЛ() возвращает диапазон (массив), соответствующий году в столбце О. Например, в ячейке Р5 функция ДВССЫЛ() возвращает диапазон В2:М11. (Подробнее о ДВССЫЛ см. Примеры использования функции ДВССЫЛ.) LAMBDA принимает два параметра: а = 0 и b = массив, сформированный ДВССЫЛ(). Третий аргумент функции LAMBDA – расчет = ЕСЛИ(b>=$O$2;a+1;a). Если элемент массива ≥ $O$2, накопитель – а – увеличивается на 1, если нет, то а остается без изменения.
Справедливости ради отметим, что «старые» формулы Excel справятся с задачей даже лучше. Например, введите в ячейке Q5 формулу (см. рис. 19):
=СЧЁТЕСЛИ(ДВССЫЛ(«B»&(O5—1879)&«:M»&(O5—1870));«>=»&$O$2) |
Функция SCAN
Функция сканирует массив и возвращает промежуточные результаты. Синтаксис:
=SCAN([начальное_значение]; массив; LAMBDA(а; b; вычисление)) |
[начальное_значение] – задает начальное значение для аккумулятора (необязательный аргумент); если вы работаете с текстом, установите начальное значение «».
массив – массив, который нужно просканировать;
LAMBDA – функция сканирования массива; включает два параметра, ссылающиеся на начальное_значение и массив:
- а – сканируемое значение, возвращаемое в качестве конечного результата функцией SCAN; сначала аккумулятор получает начальное_значение, а затем изменяется с каждым циклом обработки массива.
- b – ссылается на массив (другими словами – на каждый элемент массива).
Третий аргумент функции LAMBDA – вычисление – задает порядок обработки элементов массива.
Вычисление факториала
=SCAN( 1; A1#; LAMBDA( a; b; a*b ) ) |
Рис. 20. Вычисление факториала
Сцепление символов в массиве
=SCAN( «»; A1:C2; LAMBDA( a; b; a&b ) ) |
Рис. 21. Сцепление символов в массиве
На этом примере видно, как работает накопитель – параметр а функции LAMBDA.
Специфика SCAN, REDUCE и MAP
Функция SCAN возвращает массив, содержащий промежуточные значения, созданные во время сканирования. SCAN можно использовать для вычислений, которые показывают промежуточные результаты. Функция SCAN возвращает массив того же размера, что и исходный. Подобно функции REDUCE, SCAN реализует цикл по всем элементам массива, выполняя вычисления для каждого элемента. Отличие в том, что REDUCE возвращает одно – финальное – значение, а SCAN возвращает все промежуточные значения. Ранее изученная функция MAP также сканирует массив, и возвращает массив того же размера, что и исходный. Отличие в том, что MAP обрабатывает каждый элемент массива как независимый, а SCAN последовательно накапливает результат.
Накопительный итог в Умной Таблице
Допустим, у нас есть продажи за 6 месяцев:
Рис. 22. Таблица продаж
… и вы хотите показать продажи накопительным итогом. Можно использовать следующую неуклюжую формулу:
Рис. 23. Сумма продаж накопительным итогом
В этой формуле смешаны ссылка на ячейку (C1) и структурированная ссылка ([@Sales]). А функция Ч() добавлена, чтобы текстовое значение вернуло 0, а не ошибку #ЗНАЧ!
Формула работает, если добавляются значения, но ломается при вставке значений:
Рис. 24. Формула ломается при вставке строк
Вот тут-то и приходит на помощь функция SCAN:
=SCAN( 0; Sales[Продажи]; LAMBDA( a; b; a+b ) ) |
Рис. 25. Накопительный итог
SCAN сканирует массив – столбец Продажи таблицы Sales (диапазон А1:В10), последовательно суммируя значения на основе LAMBDA. Затем SCAN возвращает массив результатов (диапазон D2:D10), который подстраивается под размер столбца Продажи. И дополнительные строки Таблицы, и вставка новых строк, отражаются корректно.
Функция MAKEARRAY
Функция возвращает массив с заданным числом строк и столбцов на основе пользовательского вычисления LAMBDA. MAKEARRAY можно использовать для создания массивов с переменными размерами и значениями, вычисляемыми внутри функции. Синтаксис:
=MAKEARRAY(строки; столбцы; LAMBDA(r; c; вычисление)) |
строки – количество строк в массиве; должно быть больше нуля;
столбцы – количество столбцов в массиве; должно быть больше нуля;
LAMBDA – функция, используемая при создании значений массива; общее количество значений в массиве будет равно числу строк, умноженному на число столбцов. Функция LAMBDA включает два параметра, ссылающиеся на строки и столбцы:
- r – ссылается на число строк;
- с – ссылается на число столбцов.
Третий аргумент функции LAMBDA – вычисление – задает значения возвращаемого массива.
Таблица умножения
=MAKEARRAY( 9; 9; LAMBDA( r; c; r*c ) ) |
Рис. 26. Таблица умножения
Массивы фиксированных и случайных значений
Элементы массива могут быть жестко заданными. Например…
=MAKEARRAY(2;3;LAMBDA(r;c;0)) |
… вернет прямоугольник 2х3 с шестью нулями.
Массив может состоять из букв. Например…
=MAKEARRAY(2;3;LAMBDA(r;c;«x»)) |
Более интересен вариант со случайными элементами массива. Например…
=MAKEARRAY(6;6;LAMBDA(r;c;СИМВОЛ(СЛУЧМЕЖДУ(65;90)))) |
… вернет массив 6х6 со случайно отобранными прописными английскими буквами:
Рис. 27. Массив случайных букв
Визуализация адресов ячеек
=MAKEARRAY( 10; 10; LAMBDA( a; b; ОБЪЕДИНИТЬ( ; ; СИМВОЛ(b+64); a ) ) ) |
Рис. 28. Адреса ячеек
Функция BICOL
Функция возвращает массив в виде строки, один результат для каждого столбца массива. Например, если исходный массив включает 3 столбцами, BYCOL вернет строку из 3 элементов. Синтаксис:
= BYCOL(массив; LAMBDA(а; вычисление)) |
массив – исходный массив;
LAMBDA – функция обработки массива; включает один параметр а, ссылающиеся на массив. Второй аргумент функции LAMBDA – вычисление – задает способ агрегирования столбцов массива.
Возврат максимального значения в каждом столбце
=BYCOL(A1#;LAMBDA(a;МАКС(a))) |
Рис. 29. Максимальное значение в каждом столбце массива
Сумма квадратов элементов массива отдельно по каждому столбцу
=BYCOL(A1#;LAMBDA(a;СУММКВ(a))) |
Рис. 30. Сумма квадратов по столбцу
Функция BIROW
Функция возвращает массив в виде столбца, один результат для каждой строки массива. Например, если исходный массив включает 3 строки, BYROW вернет столбец из 3 элементов.
Рис. 31. Примеры использования функции BYROW
Для расчета суммы по строке в ячейки I2 используется формула:
=BYROW(B2#;LAMBDA(a;СУММ(a))) |
Для нахождения числа вхождений со значениями более 90 по строке в ячейке J2 используется формула:
=BYROW(B2#;LAMBDA(a;СЧЁТЕСЛИ(a;»>»&90))) |
Еще один метод использования функции BYROW был показан выше.
Функция ISOMITTED на момент написания заметки отсутствовала в моей версии Excel.
Использованные материалы
New LAMBDA functions available in Excel https://insider.office.com/es-es/blog/new-lambda-functions-available-in-excel
Excel MAP Function https://exceljet.net/excel-functions/excel-map-function
Excel REDUCE Function https://exceljet.net/excel-functions/excel-reduce-function
Excel SCAN Function https://exceljet.net/excel-functions/excel-scan-function
Excel MAKEARRAY Function https://exceljet.net/excel-functions/excel-makearray-function
Excel BYCOL Function https://exceljet.net/excel-functions/excel-bycol-function
Excel BYROW Function https://exceljet.net/excel-functions/excel-byrow-function
Liam Bastick and Chris Gross. Not Just Mary Can Have a Little LAMBDA / Excel Hits 500 https://www.sumproduct.com/news/article/not-just-mary-can-have-a-little-lambda-excel-hits-500
Hello, Office Insiders! My name is Chris Gross, and I am a Program Manager on the Excel team. I am happy to announce a new function in Excel: LAMBDA. It allows you to take a formula and turn it into your own named custom function.
LAMBDA
Do you make use of repeated calculations you wish you could define once and reuse? Have you ever looked for a function, but couldn’t find one that fits your specific needs? Or, maybe, you’ve run into this type of issue before and investigated creating VBA User Defined Functions (UDF) or JavaScript custom functions, only to discover that you need to learn a new language.
All that changes today with the release of the LAMBDA function.
For example, let’s say you want to calculate the result of the Pythagorean theorem or get a count of words in a text string. These are custom functions you can make yourself and re-use as LAMBDAs.
How it works
To see how this function works, lets first go over the function syntax, and then we will walk through the steps needed to author your own.
=LAMBDA([parameter1, parameter2, …,] calculation)
[parameter1]-[parameter253] (optional):
A value that you want to pass to the function, such as a cell reference, string, or number. You can enter up to 253 parameters.
calculation:
The formula you want to execute and return as the result of the function. It must be the last argument and it must return a result. This argument is required.
Inspecting the individual arguments, there are two things to make note of:
- The first set of arguments, parameter1 – parameter253, like LET, are names for the inputs into your function. Since these are optional, you don’t have to include any inputs if you don’t want to. You can, however, make use of these names within your calculation.
- The final argument, calculation, must return a value. In most cases, this will be the formula you want to turn into a reusable function.
With the definition out of the way, we’re going to go over the steps necessary to build a LAMBDA like the ones above.
- LAMBDA function components.
- Calling a LAMBDA function.
- Naming a LAMBDA function.
LAMBDA function components
Let’s look at an example which puts the two earlier concepts together and creates a basic LAMBDA function.
Suppose we have the following formula:
=LAMBDA(x, x+122)
Deconstructing this example and mapping it to the syntax definition, let’s look at x:
=LAMBDA(x, x+122)
The first occurrence of x is defining the first and only parameter input to LAMBDA.
Now let’s look at x+122:
=LAMBDA(x, x+122)
The second parameter to LAMBDA, x+122, is the calculation, which makes use of the x name and will be substituted for the input value when the lambda function is called.
For example, suppose you called the lambda function and input the value 1 for x, Excel would substitute x for 1 and do the following calculation:
1 + 122
Which, as we all know:
1 + 122 = 123=
It’s almost as easy as… 1… 2… 3…
If you’ve been pasting the example above into Excel, you may have noticed some #CALC! errors. To resolve those, you’ll need to learn and perform the next step.
Calling a LAMBDA function
To put it simply, you call a LAMBDA function the same way you call native functions in Excel.
To illustrate this, let’s revisit the previous example and show how to call it with a value.
Uncalled
=LAMBDA(x, x+122)
Called with the value 1
=LAMBDA(x, x+122)(1)
Returns
123
When should you call the LAMBDA function?
- You will want to return an uncalled LAMBDA function when you initially store and name it, or for passing into other LAMBDA functions which may subsequently call it.
- And you should call the LAMBDA function when you are making use of it during authoring and later re-use.
Naming a LAMBDA function
Once you have authored a LAMBDA function and are happy with the results, you should give it a name and store it for re-use.
To do this, you will want to make use of the Name Manager, so let’s dive in!
Name Manager Usage
To open Name Manager, click Formulas > Name Manager.
In the Name Manager dialog box, click the New button.
In the New Name dialog box, enter the requested information, and then click OK.
- Name: The name of your function.
- Comment: A description and associated tooltip which will be shown when calling your function.
- Refers to: Your LAMBDA function definition.
And that’s it! Now you can make use of your newly crafted custom function in the workbook by calling it by its name.
For example, we could call this LAMBDA function by authoring a formula which calls MYLAMBDA
=MYLAMBDA(122)
Which would return the value
123
Tips and tricks
- Check out our Tech Community post for more examples of LAMBDAs.
- Read our Help article to learn even more about LAMBDA functions.
Availability
LAMBDA function is rolling out to users running the following Insider Beta Channel builds:
- Windows: Version 2012 (Build 13519.20000) or higher
- Mac: Version 16.45 (Build 1201.0) or higher
We typically release features over some time to ensure that things are working smoothly. This is true for Insiders as well. We highlight features that you may not have because they’re slowly releasing to larger numbers of Insiders. Sometimes we remove elements to further improve them based on your feedback. Though this is rare, we also reserve the option to pull a feature entirely out of the product, even if you, as Insiders, have had the opportunity to try them.
Feedback
To give feedback and suggestions, click Help > Feedback, and add #LAMBDA in your feedback so that we can easily find input about the feature.
Learn more about what other information you should include in your feedback to ensure it’s actionable and reaches the right people. We’re excited to hear from you!
With the Office Insider newsletter, you can get the latest information about Insider features in your inbox once a month.
Recursive function is a term for describing behavior of a function that calls itself from within its own code. This is necessary for solving a problem where the solution relies on the results from multiple instances of the same problem. In this guide, we’re going to show you how to create recursive functions in Excel.
Download Workbook
LAMBDA Function
Before the LAMBDA function, the only option for creating recursive calculations in Excel was using VBA. VBA allows you to create your own user defined functions. However, VBA requires some coding knowledge.
With the new LAMBDA function, you can create your own functions using only Excel formulas. Briefly, the LAMBDA function is a special function that you can use in a named range, and it allows you to use that named range as a function. It also supports recursive calculations.
To create a user defined function with LAMBDA, follow the steps below:
- Open the New Name dialog by following Formulas > Define Name path in the Ribbon.
- Type in a friendly name for your formula. To call the formula recursively, you should use this name inside your formula. For example, “MyFormula”.
- Enter the LAMBDA formula e.g., =LAMDBA(x,y,x+y)
- Click the OK button to create your user defined function.
- Once the named range is saved, you can use it just like any other formula.
Let us briefly explain how the LAMBDA function works. The LAMBDA function’s last argument should always be the formula itself. The arguments before the formula are the arguments which will be used in the formula.
For example, the x+y function needs 2 arguments: x and y. Thus, the first arguments in the LAMBDA function are x and y. The last argument is the formula that uses these arguments.
As of writing this article, the LAMBDA function is only available to Office 365 users.
Creating recursive functions with LAMBDA
Fibonacci sequence
Let’s see the LAMBDA function on an example. Our first example is about the Fibonacci sequence, which is a sequence of numbers where each number is the sum of the two preceding values, starting from 0 and 1.
0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 |
The function below returns the nth number in a Fibonacci sequence.
The function of n depends on same function’s instances for n-1 and n-2. Thus, the function needs to be recalculated until n is equal to 2, and F(0) and F(1) return 0 and 1 respectively.
With the help of the LAMBDA function we can create this function like this:
=LAMBDA(n,IF(n<=1,n,Fib(n-1)+Fib(n-2)))
Note that we have named our function “Fib”. As a result, the function can be recalled as Fib(n-1) and Fib(n-2) in the same function. Remember to change this if your formula has a different name.
Ackermann Function and recursion
The Ackermann function, named after Wilhelm Ackermann, is a multi-variable function from natural numbers to natural numbers with a very fast rate of growth. It is accepted one of the simplest examples of a function that is computable but not primitive recursive.
Here is the equation:
If m and n values are not equal to 0 (third line), the function calls itself to calculate its second argument. The called function will call another, until the conditions in the first two rows are met.
The following is the Excel version of the Ackermann Function. We named it “Ack”.
=LAMBDA(m,n,IF(m=0,n+1,IF(n=0,Ack(m-1,1),Ack(m-1,Ack(m,n-1)))))
Remove unwanted characters with a recursive function
The LAMBDA function can also be used to remove a set characters from strings. You can use functions like SUBSTITUTE and REPLACE to do this, but both functions can work with an entire string value, and not specific characters.
=LAMBDA(string,characters,IF(characters=»»,string,RemoveCharacters(SUBSTITUTE(string,LEFT(characters,1),»»),RIGHT(characters,LEN(characters)-1))))
The RemoveCharacters function replaces each character with a an empty string (“”) starting from the left. It sends the lastly calculated character set without the first character each time it runs, until there are no characters left in the set.