Как найти лямбда в экселе

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

Синтаксис

=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 точно так же, как и любым именем, например, строковой константы, диапазона ячеек или таблицы.

Последовательность действий

  1. Выполните одно из указанных ниже действий.

    • В Excel для Windows выберите Формулы > Диспетчер имен.

    • В Excel для Mac выберите Формулы > Задать имя.

  2. Выберите Новое, а затем введите необходимые данные в диалоговом окне Новое имя
     

    Имя:

    Введите имя функции LAMBDA.

    Область:

    Книга указывается по умолчанию. Также можно выбрать отдельные листы.

    Примечание:

    Необязательно, но настоятельно рекомендуется. Введите до 255 знаков. Кратко опишите назначение функции, укажите правильное количество и тип аргументов.

    Отображается в диалоговом окне Вставить функцию и в виде подсказки (вместе с аргументом Вычисление ) при вводе формулы и использовании функции Автозаполнение формул (Intellisense).

    Объект ссылки:

    Введите функцию LAMBDA. 

    Например:

    Определение функции LAMBDA в диспетчере имен

  3. Чтобы создать функцию LAMBDA, нажмите ОК.

  4. Чтобы закрыть диалоговое окно Диспетчер имен, нажмите Закрыть.

Дополнительные сведения см. в статье Использование Диспетчера имен.

Примеры

Определите в Диспетчере имен следующие данные:

Имя:

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 на придуманное имя переменной, мы получим:

Заворачиваем в LAMBDA

Обратите внимание, что после такого преобразования наша формула (по сути — правильная!) стала выдавать ошибку, т.к. теперь в неё не передается исходная дата из ячейки А2. Для тестирования и уверенности, можно передать ей аргументы, дописав их после функции LAMBDA в круглых скобках:

Добавляем аргументы к LAMBDA

Шаг 3. Создаем имя

Теперь самая легкая и приятная часть. Открываем Диспетчер имен на вкладке Формулы (Formulas — Name Manager) и создаём новое имя кнопкой Создать (Create). Придумываем и вводим имя для нашей будущей функции (например, НОМКВАРТАЛА), а в поле Ссылка (Reference) аккуратно копируем из строки формул и вставляем нашу функцию LAMBDA, только без последнего аргумента (А2):

Создаем имя с функцией LAMBDA

Всё. После нажатия на ОК созданную функцию можно использовать в любой ячейке на любом листе этой книги:

Готовая функция в выпадающем списке

Использование в других книгах

Поскольку созданные с помощью LAMBDA пользовательские функции представляет из себя, по сути, именованные диапазоны, то можно легко сделать их доступными не только в текущей книге. Достаточно будет скопировать ячейку с функцией и вставить в любое место листа другого файла.

LAMBDA и динамические массивы

Пользовательские функции, создаваемые с помощью функции LAMBDA успешно поддерживают работу с новыми динамическими массивами и их функциями (ФИЛЬТР, УНИК, СОРТ), добавленными в Microsoft Excel в 2020 году.

Допустим, мы хотим создать новую пользовательскую функцию, которая сравнивала бы два списка и выдавала разницу между ними — те элементы из первого списка, которые отсутствуют во втором. Жизненная задача, не правда ли? Раньше для такого использовали либо функции а-ля ВПР (VLOOKUP), либо сводные таблицы, либо запросы Power Query. Теперь же можно обойтись одной формулой:

Сравнение списков

В английской версии это будет:


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

Здесь функция СЧЁТЕСЛИ подсчитывает количество вхождений каждого элемента первого списка во второй, а затем функция ФИЛЬТР отбирает только те из них, у кого этих вхождений не оказалось. Завернув эту конструкцию в LAMBDA и создав на её основе именованный диапазон с названием, например, ПОИСКОТЛИЧ — мы получим удобную функцию, выдающую результат сравнения двух списков в виде динамического массива:

Готовая функция ПОИСКОТЛИЧ

Если в качестве исходных данных будут не обычные, а «умные» таблицы — наша функция тоже справится без проблем:

Умные таблицы и функция LAMBDA

Другой пример — динамическое разделение текста путём превращения его в XML и последующего разбора по ячейкам с помощью функции ФИЛЬТР.XML, которое мы недавно разбирали. Чтобы не воспроизводить эту сложную формулу каждый раз вручную, проще будет завернуть её в LAMBDA и создать на её основе динамический диапазон, т.е. новую компактную и удобную функцию, назвав её, например, РАЗДТЕКСТ:

Функция разделения текста по ячейкам

Первым аргументом этой функции будет ячейка с исходным текстом, а вторым — символ-разделитель, в возвращать результат она будет в виде горизонтального динамического массива. Код функции при этом будет следующим:

=LAMBDA(t;d; ТРАНСП(ФИЛЬТР.XML(«<x><y>»&ПОДСТАВИТЬ(t;d;»</y><y>»)&»</y></x>»;»//y»)))

Список примеров можно продолжать бесконечно — в любой ситуации, где вам часто приходится вводить одну и ту же длинную и громоздкую формулу функция LAMBDA сделает жизнь ощутимо проще.

Рекурсивный перебор символов

Все предыдущие примеры демонстрировали только одну, наиболее очевидную, сторону функции LAMBDA — её применение в качестве «обёртки» для заворачивания в неё длинных формул и упрощения их ввода. На самом деле, у LAMBDA есть ещё одна, гораздо более глубокая, сторона, превращающая её почти что в полноценный язык программирования.

Дело в том, что принципиально важной особенностью LAMBDA-функций является возможность реализации в них рекурсии — логики вычислений, когда в процессе расчета функция вызывает сама себя. С непривычки, возможно, звучит жутковато, но в программировании рекурсия — обычное дело. Даже в макросах на Visual Basic можно её реализовать, а теперь, вот, как видите, дошло и до Excel. Давайте попробуем разобраться в этой технике на практическом примере.

Предположим, нам требуется создать пользовательскую функцию, которая удаляла бы из исходного текста все заданные символы. Полезность такой функции, думаю, доказывать вам не нужно — с её помощью было бы очень удобно очищать замусоренные входные данные, правда?

Однако, по сравнению с предыдущими, нерекурсивными примерами, нас ожидают две сложности.

  1. Нам придётся придумать название для нашей функции до того, как мы начнём писать её код, т.к. в нём это название уже будет использоваться для вызова функцией самой себя.
  2. Ввести такую рекурсивную функцию в ячейку и отлаживать её, указав после 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) в его финальном виде.

Рекурсивный перебор ячеек

Похожим образом можно реализовать и рекурсивный перебор ячеек в заданном диапазоне. Предположим, что мы хотим создать лямбда-функцию с именем ЗАМЕНАПОСПИСКУ для оптовой замены фрагментов в исходном тексте по заданному списку-справочнику. Выглядеть всё это в результате должно так:

Пример рекурсивной функции ЗАМЕНАПОСПИСКУ

Т.е. у нашей функции ЗАМЕНАПОСПИСКУ будет три аргумента:

  1. ячейка с текстом для обработки (исходный адрес)
  2. первая ячейка столбца со значениями для поиска из справочника
  3. первая ячейка столбца со значениями на замену из справочника

Функция должна проходить сверху-вниз по справочнику и заменять последовательно все варианты из левого столбца Найти на соответствующие варианты из правого столбца Заменить. Реализовать такое можно следующей рекурсивной лямбда-функцией:

Рекурсивная лямбда-функция замены текста

Здесь в переменной t хранится исходный текст из очередной ячейки столбца Адрес, а переменные n и z указывают на первые ячейки в столбцах Найти и Заменить, соответственно.

Как и в предыдущем примере, сначала эта функция заменяет в исходном тексте с помощью функции ПОДСТАВИТЬ (SUBSTITUTE) данные по первой строке справочника (т.е. СПб на Санкт-Петербург), а затем вызывает сама-себя, но со сдвигом по справочнику вниз на следующую строку (т.е. заменяет С-Пб на Санкт-Петербург). Затем вызывает себя ещё раз со сдвигом вниз — и заменяет уже Питер на Санкт-Петербург и т.д.

Сдвиг вниз на каждой итериации реализован стандартной экселевской функцией СМЕЩ (OFFSET), у которой в данном случае три аргумента — исходный диапазон, сдвиг по строкам (1) и сдвиг по столбцам (0).

Ну, и как только мы достигаем конца справочника (n=»»), то должны закончить рекурсию — прекращаем вызывать сами себя и выводим то, что накопилось после всех выполненных замен в переменной исходного текста t.

Вот и всё. Никаких хитрых макросов или запросов Power Query — вся задача решается одной функцией.

Ссылки по теме

  • Как использовать новые функции динамических массивов Excel: ФИЛЬТР, СОРТ, УНИК
  • Замена и зачистка текста функцией ПОДСТАВИТЬ
  • Создание макросов и пользовательских функций (UDF) на VBA

Функция ЛЯМБДА (LAMBDA) используется для создания пользовательских, повторно используемых функций и вызова их по выбранному имени. Новая функция доступна во всей книге Excel.

Описание функции

Функция ЛЯМБДА на момент добавления в справочник (4 фувраля 2021 года) находилась в «быстром кругу» тестирования программы Office Insider, это значит, что функция не только не доступна обычным пользователям Microsoft 365 (ранее Office 365), но и не все тестировщики имеют возможность ею воспользоваться.

Более того, Microsoft еще даже не определилась в какой категории будет находиться данная функция и, при попытке осуществить поиск в самом приложении Excel — выдает категорию «Рекомендованные», которая по сути является опциональной, если не было найдено точного соответствия. Естественно, вставить функции не вводом с клавиатуры, а через вкладку «Формулы» — не получается, она попросту отсутствует во всех категориях.

Поэтому данная функция помещена в категорию «Экспериментальные».

В простой формулировке функция ЛЯМБДА, позволяет создать пользователю свою функцию без применения макросов и навыков работы VBA.

Синтаксис

=ЛЯМБДА([параметр1;параметр2;...;] вычисление)

Аргументы

параметрвычисление

Необязательный аргумент. Значение, которое вы хотите передать функции, например ссылку на ячейку, строку или число. Можно ввести до 253 параметров

Обязательный аргумент. Формула, которая будет выполняться и возвращаться в результате выполнения функции. Он должен быть последним аргументом и возвращать результат.

Замечания

  • Если ввести более 253 параметров, Excel вернет ошибку «#ЗНАЧ!»
  • Функция ЛЯМБДА анонсирована после выхода Office 2019, поэтому нужно использовать Office по подписке, либо дождаться следующего большого обновления Office
  • Если в функцию ЛЯМБДА передано неправильное число аргументов, Excel возвращает ошибку «#ЗНАЧ!»
  • Если создать функцию ЛЯМБДА в ячейке, не вызывая ее из ячейки, Excel вернет ошибку «#ВЫЧИСЛ!»
  • Имена и параметры «Лямбда» должны следовать синтаксисам имен Excel за одним исключением: не используйте точка (.) в имени параметра

Создание функции ЛЯМБДА

Шаг1. Проверка формулы

Убедитесь, что формула, используемая в аргументе вычисления, работает правильно. Это крайне важно, поскольку при создании функции ЛЯМБДА необходимо убедиться в том, что формула работает, и исключить ее в случае ошибок или неожиданных ситуаций.

Шаг2. Создание Лямбда в ячейке

Лучше всего создать и проверить функцию ЛЯМБДА в ячейке, чтобы убедиться в ее правильности, включая определение и передачу параметров. Чтобы избежать #CALC! добавьте звонок к функции ЛЯМБДА, чтобы немедленно вернуть результат:

=ЛЯМБДА ([параметр1; параметр2; …];вычисление) (вызов функции)

В следующем примере возвращается значение 2.

=LAMBDA(number, number + 1)(1)

Шаг3. Добавление Лямбда в диспетчер имен

Завершив работу с функцией ЛЯМБДА, переместит ее в диспетчер имен для окончательного определения. Таким образом вы даете функции ЛЯМБДА понятное имя, даете описание и позволяет повторно работать с любой ячейкой в книге. Можно также управлять функцией ЛЯМБДА для любого имени, например для строковой константы, диапазона ячеек или таблицы.

Пример

Видео работы функции

Формулы Excel используют на порядок больше пользователей, чем все программисты C, C++, C#, Java и Python в мире вместе взятые. Несмотря на свой успех, Excel как язык программирования, имеет фундаментальные недостатки: (1) формулы Excel поддерживают только скалярные значения – числа, строки и логические значения; (2) Excel (без кода VBA) не позволяет определять новые функции. Ситуация изменилась с появлением в 2019 г. динамических массивов. С их помощью обычные формулы обрабатывают диапазон ячеек, а результаты также разливаются в диапазон ячеек. В декабре 2020 года Microsoft анонсировал функцию LAMBDA, которая позволяет определять новые функции, написанные на языке формул Excel. Функция LAMBDA поддерживает рекурсию, т.е. может вызывать сама себя. Это позволяет организовать циклы. В течение 2021 г. постепенно у всех пользователей Excel после плановых обновлений Office 365 появилась функция LAMBDA.

Рис. 1. Механизм создания пользовательских функций Excel без кода VBA

Скачать заметку в формате Word или pdf, примеры в формате Excel

Синтаксис функции LAMBDA

Начнем с простого примера. Создадим функцию для расчета гипотенузы по катетам.

Рис. 2. Формула расчета гипотенузы на основе функции LAMBDA

В общем виде синтаксис функции LAMBDA:

Рис. 3. Синтаксис функции LAMBDA

Последний аргумент функции LAMBDA – расчет (он же вычисление). Все предыдущие аргументы – параметры. Обязательный аргумент один. И это вычисление. Параметров может быть до 253.

Любопытной особенностью функции LAMBDA является отсутствие ссылок на ячейки в ее синтаксисе (см. рис. 2). Вместо них используются условные обозначения – параметры. Попробуйте в ячейке D3 ввести функцию LAMBDA со ссылками (см. рис. 4). Нажмите Enter. Получите ошибку:

Рис. 4. Ссылки на ячейки не работают

Для того, чтобы можно было протестировать функцию в ячейке разработчики добавили в синтаксис вызов функции

= LAMBDA([параметр1; параметр2; ...];вычисление) (вызов функции)

На рис. 2 вызов функции реализован через передачу ей значений двух параметров: а из ячейки С1 и b из ячейки С2.

=LAMBDA(a;b;КОРЕНЬ(a^2+b^2))(C1;C2)

В вызове функции параметры разделяются точкой с запятой, даже если они находятся в соседних ячейках. Например, такой синтаксис…

=LAMBDA(a;b;КОРЕНЬ(a^2+b^2))(C1:C2)

…вернет ошибку #ЗНАЧ!

Естественно, такое использование весьма неудобно, поэтому разработчики MS предлагают присвоить функции имя. Пройдите Формулы –> Диспетчер имен, и введите следующие настройки в окне Создание имени:

Рис. 5. Присвоении функции имени

Рис. 6. Функция ГИПОТЕНУЗА принимает два аргумента в виде ссылок на ячейки

К сожалению, подсказка при вводе формулы выглядит не слишком информативно:

Рис. 7. Ввод формулы ГИПОТЕНУЗА

Если вас интересует, почему так происходит, см. дискуссию на эту тему. Преодолеть такое положение вещей пока невозможно.

Если формула основана на LAMBDA, сервис Формулы –> Вычислить формулу не позволяет увидеть шаги вычисления так, как вы ожидаете… И с этим тоже ничего нельзя поделать.

Вычисление расстояния между городами

Команда разработчиков LAMBDA ранее создала географический тип данных и функцию LET. Так что LAMBDA отлично работает с географией. Допустим, у вас есть пары городов в столбцах A и B. Названия городов желательно ввести на английском языке, хотя часто Excel распознает и русское написание. Преобразуйте диапазон в умную таблицу. Для этого выделите диапазон и нажмите Ctrl+T (англ.). Выделите Таблицу и пройдите Данные –> Типы данных –> География. Если встать в любую ячейку Таблицы, появится значок полей данных. Кликните на него и раскроется список доступных полей:

Рис. 8. Географический тип данных

Если вы впервые сталкиваетесь с географическим типом данных, рекомендую изучить Николай Павлов. Новые типы данных в Excel 2016.

Рассчитаем расстояние между городами с использованием полей Широта (Latitude) и Долгота (Longitude). Для простоты будем считать, что наш земной шар – идеальная сфера с диаметром 12 742 км. Определим функцию РАССТОЯНИЕ(From; To):

=LAMBDA(From;To;(12742)*ASIN(КОРЕНЬ(0,5-COS((To.Latitude-From.Latitude)*ПИ()/180)/2+COS(From.Latitude*ПИ()/180)*COS(To.Latitude*ПИ()/180)*(1-COS((To.Longitude-From.Longitude)*ПИ()/180))/2)))

К сожалению, не по всем городам России имеются данные по широте и долготе. В частности, их нет по Москве и СПб…

В итоге получим:

Рис. 9. Расстояние между городами

Обращение строки

Рассмотрим более сложный пример – использование рекурсии для обращения текста. Ранее встроенные функции Excel с этим не справлялись. Такое было возможно с помощью Visual Basic или JavaScript. Определим функцию ОБРАЩЕНИЕ(мойтекст), использующую рекурсию на основе LAMBDA. В формуле используются вспомогательные функции – ГОЛОВА и ХВОСТ для вычисления первого символа и остального текста.

Рис. 10. Обращение текста

Разберем, как работает функция ОБРАЩЕНИЕ(). На первой итерации функция ГОЛОВА() возвращает букву О, а ХВОСТ() – БРАЩЕНИЕ. Чтобы показать только первую итерацию работы функции ОБРАЩЕНИЕ(), я создал функцию ОБРАЩЕНИЕ1():

Рис. 11. Первая итерация

Конструкция ЕСЛИ(мойтекст=»БРАЩЕНИЕ»;мойтекст;…) служит проверкой для выхода из рекурсии (цикла). Видно, что после одной итерации исходный текст потерял первую букву, поэтому проверка заканчивается успешно и возвращается текст ХВОСТ(мойтекст)&ГОЛОВА(мойтекст) = «БРАЩЕНИЕО». Первая буква ушла в конец текста. После каждой итерации первоначальный текст теряет по одной букве в начале. Когда выполнится условие мойтекст=»», цикл заканчивается, и возвращается обращенный текст.

Функции ГИПОТЕНУЗА() и РАССТОЯНИЕ() продемонстрировали использование LAMBDA для упрощения и повышения наглядности формул. В то же время функция ОБРАЩЕНИЕ() показала нетривиальное использование LAMBDA для организации цикла. Именно такое использование является серьезным шагом в развитии программирования в Excel. Рассмотрим еще один пример организации цикла.

Преобразование заголовка заметки в URL-адрес

Я публикую заметки с помощью WordPress, который делает это преобразование автоматически. Например, недавно я опубликовал заметку Заключительный проект в Power Query: объединяем все вместе. WordPress дал ей адрес https://baguzin.ru/wp/zaklyuchitelnyj-proekt-v-power-query-obedinyaem-vse-vmeste/

Адрес содержит слова в английской транслитерации, разделенные тире. В URL-адресах используются строчные буквы от a до z, цифры и дефис. Все остальные знаки недопустимы. Преобразование заголовка в URL-адрес можно реализовать с помощью LAMBDA-функции Slugify с двумя аргументами.[1] Первый – это текст (phrase), а второй всегда будет равен 1 и будет сохранен в переменной «ndx». Такое имя выбрано потому, что оно напоминает слово «индекс».

Для программистов VBA: «ndx» – это наш счетчик циклов. В отличие от VBA, где можно создать переменную на лету, для LAMBDA мы должны передать 1 в качестве аргумента.

=LAMBDA(phrase;ndx;    

   ЕСЛИ(ndx <= ДЛСТР(phrase);          

   Slugify(            

      LET(                

         char; СТРОЧН(ПСТР(phrase; ndx; 1));                

         charcode; КОДСИМВ(char);                

         ЛЕВСИМВ(phrase; ndx 1) &                

            ЕСЛИ(ИЛИ(И(charcode > 96; charcode < 123);

            И(charcode > 47; charcode < 58)); char; «-«)                

            & ПРАВСИМВ(phrase; ДЛСТР(phrase) ndx)

      );                

      ndx + 1);      

   ПОДСТАВИТЬ(СЖПРОБЕЛЫ(ПОДСТАВИТЬ(phrase; «-«; » «));» «;«-«)    

   )

)

Очень удобно изучать формулы, увеличив строку формул, и кликая на аргументы функций:

Рис. 12. Формула, преобразующая заголовок заметки в URL-адрес; выделен третий аргумент функции LAMBDA – расчет

Далее можно кликнуть во второй строке после открывающей скобки, и изучить аргументы функции ЕСЛИ:

Рис. 13. Подсвечен аргумент значение_если_ложь функции ЕСЛИ

Итак, функция LAMBDA начинается с двух параметров: phrase и ndx (см. рис. 12). Остальная часть формулы – это третий аргумент функции LAMBDA. Далее функция ЕСЛИ проверяет, находится ли ndx в пределах фразы? Если проверка пройдена, выполняется блок со строки LET( до строки ); Если проверка завершилась неудачей, т.е., счетчик вышел за пределы фразы, формируется URL-адрес (см. подсвеченную строку на рис. 13).

Шесть строк внутри блока LET() создают phrase для следующего вызова Slugify. ПСТР() извлекает один символ из phrase, соответствующий номеру индекса ndx. Этот символ переводится в нижний регистр и присваивается переменной char:

char; СТРОЧН(ПСТР(phrase; ndx; 1));

Код символа char присваивается переменной charcode:

Если код символа буква или цифра…

ЕСЛИ(ИЛИ(И(charcode > 96; charcode < 123);И(charcode > 47; charcode < 58)); char; «-«)

…используйте его (char), в противном случае используйте дефис («-«).

Фраза для следующей итерации будет состоять из части слева от исправленного символа…

ЛЕВСИМВ(phrase; ndx 1) &

…самого исправленного символа…

ЕСЛИ(ИЛИ(И(charcode > 96; charcode < 123);И(charcode > 47; charcode < 58)); char; «-«)&

и правой части…

ПРАВСИМВ(phrase; ДЛСТР(phrase) ndx)

При первом вызове Slugify обрабатывает первый символ. Затем механизм вычислений Excel вызовет Slugify, чтобы исправить 2-й символ. Это будет продолжаться до тех пор, пока ndx не превысит длину phrase. Как только ndx превысит длину phrase формула вернет результат:

ПОДСТАВИТЬ(СЖПРОБЕЛЫ(ПОДСТАВИТЬ(phrase; «-«; » «));» «;«-«)

Сначала мы заменим многочисленные дефисы, которыми в цикле LET() заменяли недопустимые символы, на пробелы – внутренняя функция ПОДСТАВИТЬ(). Затем удалим лишние пробелы – СЖПРОБЕЛЫ(). И наконец, заменим оставшиеся одиночные пробелы на дефисы – внешняя функция ПОДСТАВИТЬ().

Написание сложной формулы LAMBDA в ячейке Excel довольно сложное занятие. Использование окна Добавления имени еще хуже. Пожалуй, лучше всего писать формулу в блокноте или в текстовом поле в Excel (Вставка –> Текст –> Надпись). Нет хорошего способа проверить LAMBDA, использующую рекурсию. Пока вы не создадите имя, проверить формулу не получится. Но, если вы ошибетесь, формула с именем не будет работать, не сообщая почему. Хорошая новость заключается в том, что Microsoft работает над новым интерфейсом редактирования формул.

Теперь у вас есть функция SLUGIFY:

Рис. 14. Функция SLUGIFY за работой

Является ли число простым

На просторах Инета нашел любопытную функцию (на основе LAMBDA и LET), которая проверяет, является ли число простым. Привожу её код, а как она работает предлагаю разобраться вам самим в качестве небольшого домашнего задания))

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

=LAMBDA(vArg;

   LET(

      v; ЦЕЛОЕ(ABS(vArg));

      ev; ЕЧЁТН(v);

      high; ЦЕЛОЕ(КОРЕНЬ(v)+1/2);

      seqLimit; 2^20;

      ЕСЛИ(

         И(ev; v<>2);

         0;

         ЕСЛИ(

            high>seqLimit;

            1;

            LET(

               seq; v/ПОСЛЕД(1;high;1;2);

               iSeq; ЦЕЛОЕ(seq);

               factors; seq*(seq=iSeq);

               rFactors; ФИЛЬТР(factors;(factors>1)*(factors<v);0);

               sumFactors; СУММ(rFactors);

               (sumFactors=0)

            )

         )

      )

   )

)

Рис. 15. Является ли число простым

Использованные материалы

LAMBDA: The ultimate Excel worksheet function https://www.microsoft.com/en-us/research/blog/lambda-the-ultimatae-excel-worksheet-function/

Подсказки при вводе функции малоинформативны https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=144443&TITLE_SEO=144443-voprosy-po-novoy-funktsii-_lambda_&FID_8=&tags=SQL

Билл Джелен. Срывая маску с Excel. Глава 89. LAMBDA-функция, как хранилище сложной логики вычислений (на англ. языке) https://www.mrexcel.com/products/mrexcel-2021-unmasking-excel/

Лямбда-функция Excel, которая проверяет, является ли число простым https://thefaq.ru/ljambda-funkcija-excel-kotoraja-proverjaet-javljaetsja-li-chislo-prostym/

Дополнительные материалы

С добавлением лямбда-функций язык программирования Excel стал полным по Тьюрингу https://habr.com/ru/news/t/540308/

LAMBDA — новая суперфункция Excel https://www.planetaexcel.ru/techniques/25/20915/

How to write recursive LAMBDA function in Excel with examples https://www.ablebits.com/office-addins-blog/write-recursive-lambda-function-excel/

Функция ЛЯМБДА в Excel https://ru.wiki-base.com/7773197-excel-lambda-function

Microsoft позволит создавать пользовательские функции в Excel https://infostart.ru/journal/news/tekhnologii/microsoft-pozvolit-sozdavat-polzovatelskie-funktsii-v-excel_1354120/

Jon Acampora. The LAMBDA Function Explained – How to Create Custom Functions in Excel https://www.excelcampus.com/functions/lambda-explained/

Разделение по столбцам https://www.youtube.com/watch?v=o9UNfjol_Ok&ab_channel=AbiolaDavid

Calculate Nice Axis Scales with LET and LAMBDA https://peltiertech.com/calculate-nice-axis-scales-with-let-and-lambda/

Справка Microsoft на русском языке: Функция ЛЯМБДА

[1] Это перевод части главы из книги Билла Джелена (см. в конце заметки Использованные материалы)

The LAMBDA function provides a way to create a custom function in Excel. Once defined and named, a LAMBDA function can be used anywhere in a workbook. LAMBDA functions can be very simple, or quite complex, stringing together many Excel functions into one formula. A custom LAMBDA function does not require VBA or macros.

Example 1 | Example 2 | Example 3 | More examples

In computer programming, the term LAMBDA refers to an anonymous function or expression. An anonymous function is a function defined without a name. In Excel, the LAMBDA function is first used to create a generic (unnamed) formula. Once a generic version has been created and tested, it is ported to the Name Manager, where it is formally defined and named.

One of the key benefits of a custom LAMBDA function is that the logic contained in the formula exists in just one place. This means there is just one copy of code to update when fixing problems or updating functionality, and changes will automatically propagate to all instances of the LAMBDA function in a workbook.

The LET function is often used together with the LAMBDA function. LET provides a way to declare variables and assign values in a formula. This makes more complicated formulas easier to read by reducing redundant code. The LET function can also improve performance by reducing the number of calculations performed by a formula.

By default, all arguments in a LAMBDA function are required. To create optional arguments, see the ISOMITTED function.

Creating a LAMBDA function

LAMBDA functions are typically created and debugged in the formula bar on a worksheet, then moved into the name manager to assign a name that can be used anywhere in a workbook. 

There are four basic steps to creating and using a custom LAMBDA function:

  1. Verify the logic you will use with a standard formula
  2. Create and test a generic (unnamed) LAMBDA version of the formula
  3. Name and define the LAMBDA formula with the name manager
  4. Call the new custom function with the defined name

The examples below discuss these steps in more detail.

Example 1 — basic example

To illustrate how LAMBDA works, let’s begin with a very simple formula:

=x*y // multiply x and y

In Excel, this formula would use typically use cell references like this:

=B5*C5 // with cell references

Standard formula version

As you can see, the formula works fine, so we are ready to move on to creating a generic LAMBDA formula (unnamed version). The first thing to consider is if the formula requires inputs (parameters). In this case, the answer is «yes» – the formula requires a value for x, and a value for y. With that established, we start off with the LAMBDA function, and add the required parameters for user input:

=LAMBDA(x,y  // begin with input parameters

Next, we need to add the actual calculation, x*y:

=LAMBDA(x,y,x*y)

If you enter the formula at this point, you’ll get a #CALC! error. This happens because the formula has no input values to work with since there are no longer any cell references. To test the formula, we need to use a special syntax like this:

=LAMBDA(x,y,x*y)(B5,C5) // testing syntax

This syntax, where parameters are supplied at the end of a LAMBDA function in a separate set of parentheses, is unique to LAMBDA functions. This allows the formula to be tested directly on the worksheet before the LAMBDA is named. In the screen below, you can see that the generic LAMBDA function in F5 returns exactly the same result as the original formula in E5:

Generic (unnamed) lambda version

We are now ready to name the LAMBDA function with the Name Manager. First, copy the formula, not including the testing parameters at the end. Next, open the Name Manager with the shortcut Control + F3, and click New.

Click New in Name Manager

In the New Name dialog, enter the name  «XBYY», leave the scope set to workbook, and paste the formula you copied into the «Refers to» input area. (Tip: Use the tab key to navigate to the «Refers to» field).

Name and define LAMBDA in name manager

Make sure the formula begins with an equals sign (=). Now that the LAMBDA formula has a name, it can be used in the workbook like any other function. In the screen below the formula in G5, copied down, is:

=XBYY(B5,C5)

The screen below shows how things look in the workbook:

Named LAMBDA function in action

The new custom function returns the same result as the other two formulas.

Example 2 — volume of sphere

In this example, we’ll convert a formula to calculate the volume of a sphere into a custom LAMBDA function. The general Excel formula for calculating the volume of a sphere is:

=4/3*PI()*A1^3 // volume of sphere

where A1 represents radius. The screen below shows this formula in action:

Standard Excel formula for volume of sphere

Notice this formula only requires one input (radius) to calculate volume, so our LAMBDA function will only need one parameter (r), which will appear as the first argument. Here is the formula converted to LAMBDA:

=LAMBDA(r,4/3*PI()*r^3) // generic lambda

Back in the worksheet, we’ve replaced the original formula with the generic LAMBDA version. Notice we are using the testing syntax, which allows us to plug in B5 for radius:

Generic (unnamed) LAMBDA formula for volume of sphere

The results from the generic LAMBDA formula are exactly the same as the original formula, so the next step is to define and name this LAMBDA formula with the Name Manager, as explained above. The name used for a LAMBDA function can be any valid Excel name. In this case, we’ll name the formula «SphereVolume».

Back in the worksheet, we’ve replaced the generic (unnamed) LAMBDA formula with the named LAMBDA version, and entered B5 for r. Notice the results returned by the custom SphereVolume function are exactly the same as previous results.

Named LAMBDA formula for volume of sphere

Example 3 — count words

In this example, we’ll create a LAMBDA function to count words. Excel doesn’t have a function for this purpose, but you can count words with a cell with a custom formula based on the LEN and SUBSTITUTE functions like this:

=LEN(TRIM(A1))-LEN(SUBSTITUTE(A1," ",""))+1

Read the detailed explanation here. Here is the formula in action in a worksheet:

Standard formula for counting words

Notice we are getting an incorrect count of 1 when the formula is given an empty cell (B10). We’ll address this problem below.

This formula only requires one input, which is the text that contains words. In our LAMBDA function, we’ll name this argument «text». Here is the formula converted to LAMBDA:

=LAMBDA(text,LEN(TRIM(text))-LEN(SUBSTITUTE(text," ",""))+1)

Notice «text» appears as the first argument, and the calculation is the second and final argument. In the screen below, we’ve replaced the original formula with the generic LAMBDA version. Notice we are using the testing syntax, which allows us to plug in B5 for text:

=LAMBDA(text,LEN(TRIM(text))-LEN(SUBSTITUTE(text," ",""))+1)(B5)

Generic LAMBDA for counting words

The results from the generic LAMBDA formula are the same as the original formula, so the next step is to define and name this LAMBDA formula with the Name Manager, as explained previously. We’ll name this formula «CountWords».

Below, we’ve replaced the generic (unnamed) LAMBDA formula with the named LAMBDA version, and entered B5 for text. Notice we get exactly the same results.

Named LAMBDA for counting words - CountWords

The formula used in the Name Manager to define CountWords is the same as above, without the testing syntax:

=LAMBDA(text,LEN(TRIM(text))-LEN(SUBSTITUTE(text," ",""))+1)

Fixing the empty cell problem

As mentioned above, the formula above returns an incorrect count of 1 when a cell is empty. This problem can be fixed by replacing +1 with the code below:

=LEN(TRIM(B5))-LEN(SUBSTITUTE(B5," ",""))+(LEN(TRIM(B5))>0)

Full explanation here. To update the existing named LAMBDA formula, we again need to use the Name Manager:

  1. Open the Name Manager
  2. Select the name «CountWords» and click «Edit»
  3. Replace the «Refers to» code with this formula:
=LAMBDA(text,LEN(TRIM(text))-LEN(SUBSTITUTE(text," ",""))+(LEN(TRIM(text))>0))

Once the Name Manager is closed, the CountWords works correctly on empty cells, as seen below:

After updating CountWords in Name Manager

Note: by updating the code once in the Name Manager, all instances of the CountWords formula are updated at once. This is a key benefit of custom functions created with LAMBDA –formula updates can be managed in one place.

LAMBDA is a new function available in Excel 365 only.

Понравилась статья? Поделить с друзьями:
  • Прямоугольный треугольник как найти гипотенузу калькулятор
  • Как алладин нашел ковер самолет
  • Как найти обстоятельство в предложении английский
  • Как найти силу тока во всей цепи
  • Деформация пальцев на ногах как исправить