Menu

Функция LAMBDA в Excel (эксель): свои функции, MAP и BYROW

=LAMBDA(price;price*1,2)(B2) задаёт маленькую функцию с одним входом, price, и вызывает её для B2. Сохраните LAMBDA в диспетчере имён, чтобы пользоваться ею как встроенной функцией, или передайте её в MAP, BYROW, SCAN и REDUCE.

Каждая таблица на этой странице живая: измените число или формулу, и она пересчитается.

=LAMBDA(price;price*1,2)(B2) задаёт маленькую функцию с одним входом, price, и сразу вызывает её для B2: 2.5 за ручку превращаются в 3. Функции LAMBDA, MAP, BYROW, BYCOL, SCAN и REDUCE и в русском Excel называются по-английски. Сама по себе такая формула это просто более длинная =B2*1,2. Смысл LAMBDA в том, чтобы дать функции имя в диспетчере имён, и тогда длинная формула превращается в =ADDVAT(B2), а ещё в том, чтобы передавать её в MAP, BYROW и другие функции ниже. В таблицах формулы записаны по-английски, но их можно вводить и по-русски, с точкой с запятой и десятичной запятой, как здесь.

Функция, вызванная для каждой цены
C2
ABC
1ItemPriceWith VAT
2Pen2.53
3Bag120144
4Lamp3542
5Mug89.6
6Desk150180
Нажмите на ячейку, чтобы увидеть её формулу. Измените число или формулу, и таблица пересчитается.В русском Excel: =LAMBDA(price;price*1,2)(B2)

Синтаксис LAMBDA

=LAMBDA([parameter1, parameter2, ...], calculation)
  • Каждый parameter (параметр) это имя входа, как имена в LET. Допускается до 253 параметров.
  • Последний аргумент это calculation (вычисление), которое использует параметры.
  • Значения параметров пишутся в скобках сразу после закрывающей скобки: =LAMBDA(x;y;x*y)(3;4) возвращает 12.

LAMBDA, MAP, BYROW, BYCOL, SCAN, REDUCE и MAKEARRAY требуют Microsoft 365, Excel 2024 или Excel в браузере. В Excel 2021 есть LET, но нет этих функций. В Google Таблицах LAMBDA тоже есть, а под именем её сохраняют через Данные > Именованные функции.

Сохранить LAMBDA как свою функцию

LAMBDA можно использовать повторно, когда у неё есть имя. Для этого не нужны ни VBA, ни надстройки:

  1. Откройте Формулы > Диспетчер имён и нажмите «Создать» (или Формулы > Присвоить имя).
  2. В поле «Имя» введите имя функции, например ADDVAT.
  3. В поле «Диапазон» введите LAMBDA без входов: =LAMBDA(price;price*1,2).
  4. Нажмите «ОК». Теперь введите =ADDVAT(B2) в любой ячейке книги.
Name:        ADDVAT
Refers to:   =LAMBDA(price,price*1.2)
In a cell:   =ADDVAT(B2)        returns 3 when B2 is 2.5

Функция живёт только в этой книге. Если скопировать лист, который её использует, в другую книгу, имя перенесётся вместе с ним. Измените LAMBDA один раз в диспетчере имён, и обновятся все ячейки, которые её вызывают. Перед сохранением проверьте LAMBDA в ячейке со входами в скобках; там ошибку легче заметить.

MAP: применить LAMBDA к каждой ячейке

MAP вызывает LAMBDA один раз для каждой ячейки диапазона и возвращает диапазон той же формы. Здесь каждая цена больше 100 получает скидку 10%:

Скидка 10% на цены больше 100
C2
ABC
1ItemPricePrice to pay
2Pen2.52.5
3Bag120108
4Lamp3535
5Mug88
6Desk150135
Нажмите на ячейку, чтобы увидеть её формулу. Измените число или формулу, и таблица пересчитается.В русском Excel: =MAP(B2:B6;LAMBDA(p;ЕСЛИ(p>100;p*0,9;p)))

Сумка (120) превращается в 108, стол (150) в 135; остальные цены проходят без изменений. Одна формула в C2 покрывает весь столбец. MAP может идти и по двум диапазонам одного размера параллельно: если количества стоят в D2:D6, =MAP(B2:B6;D2:D6;LAMBDA(p;q;p*q)) умножает каждую цену на её количество.

BYROW: один результат на строку

BYROW передаёт LAMBDA целую строку за раз, поэтому LAMBDA может применить к ней МАКС, СУММ или СРЗНАЧ. Лучший и средний балл каждого ученика:

Лучший и средний балл ученика
E2
ABCDEF
1StudentTest 1Test 2Test 3BestAverage
2Ann7285909082.3
3Ben6470587064
4Cara8892959591.7
5Dan7560818172
Нажмите на ячейку, чтобы увидеть её формулу. Измените число или формулу, и таблица пересчитается.В русском Excel: =BYROW(B2:D5;LAMBDA(r;МАКС(r)))

E2 возвращает 90, 70, 95 и 81; F2 возвращает 82.3, 64, 91.7 и 72. Простая =МАКС(B2:D5) дала бы одно число на всю таблицу; именно BYROW разделяет строки в одной формуле. BYCOL делает то же по столбцам: =BYCOL(B2:D5;LAMBDA(c;СРЗНАЧ(c))) возвращает средний балл по каждому тесту.

SCAN и REDUCE: нарастающий итог

REDUCE проходит по диапазону, несёт с собой значение и возвращает только итоговый результат. SCAN делает то же, но возвращает каждый шаг, поэтому это нарастающий итог в одной формуле:

Нарастающий итог и общий итог
C2
ABCD
1ItemPriceRunning totalTotal
2Pen2.52.5315.5
3Bag120122.5
4Lamp35157.5
5Mug8165.5
6Desk150315.5
Нажмите на ячейку, чтобы увидеть её формулу. Измените число или формулу, и таблица пересчитается.В русском Excel: =SCAN(0;B2:B6;LAMBDA(total;x;total+x))

Первый аргумент, 0, это начальное значение. Для каждой цены LAMBDA получает накопленный итог и цену и возвращает новый итог. C2 идёт так: 2.5, 122.5, 157.5, 165.5, 315.5, а D2 показывает только итоговые 315.5. Для простой суммы СУММ проще, но REDUCE может нести что угодно, например растущий текст или счётчик, который увеличивается только на некоторых строках.

Назвать LAMBDA внутри одной формулы через LET

LAMBDA не нужен диспетчер имён, если её использует только одна формула. Назовите её через LET и передайте имя в MAP или BYROW:

Именованная LAMBDA, переданная в MAP
C2
ABC
1ItemPriceSale price
2Pen2.52.25
3Bag120108
4Lamp3531.5
5Mug87.2
6Desk150135
Нажмите на ячейку, чтобы увидеть её формулу. Измените число или формулу, и таблица пересчитается.В русском Excel: =LET(discount;LAMBDA(p;p*0,9);MAP(B2:B6;discount))

Каждая цена получает скидку 10%: 2.25, 108, 31.5, 7.2 и 135. В Excel именованную LAMBDA можно вызвать и прямо внутри LET: =LET(f;LAMBDA(x;x*2);f(5)) возвращает 10.

Практика: итог по строке с BYROW

Ваша очередь
E2
ABCDE
1StudentTest 1Test 2Test 3Total
2Ann728590
3Ben647058
4Cara889295
5Dan756081
Нажмите на ячейку, чтобы увидеть её формулу. Измените число или формулу, и таблица пересчитается.

Ваша очередь: В E2 одной формулой верните сумму трёх тестов для каждого ученика, по одному числу на строку.

Частые ошибки LAMBDA

=LAMBDA(x,x*2)          #CALC!   defined but never called
=LAMBDA(x,x*2)(5)       10
=LAMBDA(x,y,x*y)(3)     #VALUE!  two parameters, one value
=LAMBDA(x,x*2)(3,4)     #VALUE!  one parameter, two values

В русском Excel эти ошибки называются #ВЫЧИСЛ! и #ЗНАЧ!, а вторая формула записывается как =LAMBDA(x;x*2)(5).

  • #ВЫЧИСЛ! (по-английски #CALC!) означает, что LAMBDA стоит в ячейке, но её не вызвали. Добавьте входы в скобках или сохраните её в диспетчере имён и вызывайте по имени.
  • #ЗНАЧ! (по-английски #VALUE!) означает, что число значений не совпадает с числом параметров. Посчитайте их с обеих сторон.
  • #ИМЯ? (по-английски #NAME?) означает, что в этой версии Excel нет LAMBDA или сохранённое имя написано с ошибкой. Имя параметра подчиняется правилам LET: без пробелов и не похожее на адрес ячейки.
  • LAMBDA в BYROW, которая возвращает несколько значений на строку, даёт #ВЫЧИСЛ!. Каждая строка должна давать одно значение; чтобы вернуть строку результатов, используйте MAKEARRAY или обычную формулу массива.

Часто задаваемые вопросы

Что такое функция LAMBDA в Excel?

Она превращает формулу в функцию с именованными входами. =LAMBDA(price;price*1,2) принимает один вход с именем price и возвращает price, умноженное на 1,2. Чтобы вызвать её, добавьте вход в скобках, =LAMBDA(price;price*1,2)(B2), или сохраните её под именем в диспетчере имён.

Как создать свою функцию в Excel без VBA?

Откройте Формулы > Диспетчер имён > Создать, введите имя, например ADDVAT, и в поле «Диапазон» введите =LAMBDA(price;price*1,2). Нажмите «ОК», и =ADDVAT(B2) заработает в любой ячейке этой книги.

Почему моя LAMBDA возвращает #ВЫЧИСЛ!?

LAMBDA, введённая в ячейку без входов, например =LAMBDA(x;x*2), это функция, которую так и не вызвали, поэтому Excel показывает #ВЫЧИСЛ!. Добавьте вход в скобках после неё, =LAMBDA(x;x*2)(5), или сохраните её в диспетчере имён.

В каких версиях Excel есть LAMBDA?

В Microsoft 365, Excel 2024 и Excel в браузере, вместе с MAP, BYROW, BYCOL, SCAN, REDUCE и MAKEARRAY. В Excel 2021 есть LET, но нет LAMBDA.

Что делает BYROW в Excel?

Она выполняет LAMBDA один раз для каждой строки диапазона и возвращает по одному результату на строку: =BYROW(B2:D5;LAMBDA(r;МАКС(r))) возвращает наибольшее значение каждой строки, разливая результаты вниз.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ