Функция LET появилась в версии Office 365 (по подписке) и будет доступна, начиная с версии Office 2021. Функция LET позволяет присваивать имена фрагментам формулы, а затем использовать эти имена в вычислениях. Формулы становятся короче и лучше читаемы. Это похоже на использование имен ячеек, диапазонов и формул в диспетчере имен. Но имена, присвоенные функцией LET, действуют только в пределах указанной формулы, и нигде больше. При использовании в русском Office имя функции сохраняется (не переводится на русский язык).
Синтаксис
Рис. 1. Синтаксис функции LET
Скачать заметку в формате Word или pdf, примеры в формате Excel
Более строго, синтаксис функции LET:
1 |
LET(имя1; значение_имени1; [имя2; значение_имени2]; …; вычисление) |
Имя1 – обязательный аргумент, должен начинаться с буквы или нижнего подчеркивания. Значение_имени1 – обязательный аргумент, содержит значение для Имя1. имя2/значение_имени2 – необязательные аргументы; всего может быть не более 126 таких пар. Вычисление – обязательный аргумент, формула, использующая имена.
В простейшем случае:
Рис. 2. Возведение в степень с помощью функции LET
Внутри функции LET определено имя х и его значение 3, а также имя y со значением 4. С этими именами выполняется действие xy. Этот пример поясняет базовые возможности функции LET. Для подобных простых вычислений использование LET не оправдано. Поэтому обратимся к более сложным формулам, в которых использование LET будет полезным.
Функция LET устраняет дублирование фрагментов формулы
Допустим, вам нужно вывести все рабочие дни между двумя датами, хранящимися в ячейках листа. Функция LET присвоит имя исходному массиву дат, а затем использует это имя в функциях ФИЛЬТР() и ДЕНЬНЕД():
1 |
=LET(даты;ПОСЛЕД(C5-C4+1;;C4);ФИЛЬТР(даты;ДЕНЬНЕД(даты;2)<6)) |
Если вы не знакомы с функциями динамических массивов, вам для начала сюда))
Рис. 3. Упрощение формулы за счет именования ее фрагмента
Первый аргумент функции LET – даты – вводит имя внутри формулы. Второй аргумент функции LET задает массив дат: ПОСЛЕД(C5-C4+1;;C4). Этот массив включает на одно значение больше, чем разность в ячейках С5 и С4, начинается с С4 с шагом 1.
Третий аргумент функции LET осуществляет вычисления с массивом дат: ФИЛЬТР(даты;ДЕНЬНЕД(даты;2)<6). А именно, фильтрует массив дат, оставляя только даты, для которых ДЕНЬНЕД() меньше 6, т.е., исключает выходные дни.
Без функции LET формула могла выглядеть так:
1 |
=ФИЛЬТР(ПОСЛЕД(C5-C4+1;;C4);ДЕНЬНЕД(ПОСЛЕД(C5-C4+1;;C4);2)<6) |
Объявляя переменные и присваивая им значения, функция LET упрощает написание сложных формул. Внутри LET может использоваться несколько пар: имя/значение. Аргумент вычисление всегда будет последним в формуле.
Функция LET дает три существенных преимущества
Простота. Использование имен для повторяющихся фрагментов упрощает формулы и облегчает их редактирование. Если требуется, вы вносите одно изменение, а не несколько. Это быстрее и снижает вероятность ошибки.
Ясность. Использование говорящих имен облегчает понимание того, как работает формула. Человеку, написавшему формулу и использующему её, гораздо проще дешифровать внутреннюю структуру записи.
Производительность. Удаление дублирования сокращает время вычислений. Это незаметно в обычных книгах Excel, но очень важно в моделях с миллионами записей.
Использование LET во вложенных конструкциях ЕСЛИ
Допустим у вас есть результаты трех тестов по трем отдельным предметам (столбцы В, C и D). Вам нужно рассчитать среднее значение для каждого человека и выставить оценку в соответствии с критерием в правой таблице:
Рис. 4. Результаты тестов для оценки
Без функции LET вы, скорее всего, выставите оценку с помощью вложенных ЕСЛИ:
1 2 3 4 5 6 7 |
=ЕСЛИ( СРЗНАЧ(B2:D2)>=250;"Отл."; ЕСЛИ( СРЗНАЧ(B2:D2)>=200;"Хор."; ЕСЛИ(СРЗНАЧ(B2:D2)>=160;"Уд.";"Неуд.") ) ) |
Рис. 5. Оценка с помощью функций ЕСЛИ
Проблема в том, что СРЗНАЧ(B2:D2) рассчитывается трижды. Чтобы сделать формулу более эффективной (и наглядной) мы можем присвоить среднему значению имя:
1 2 3 4 5 6 7 8 |
=LET( среднее;СРЗНАЧ(B2:D2); ЕСЛИ(среднее>=250;"Отл."; ЕСЛИ(среднее>=200;"Хор."; ЕСЛИ(среднее>=160;"Уд.";"Неуд.") ) ) ) |
Рис. 6. Выставление оценки с использованием LET
Если вам понадобится добавить еще один экзамен, то вы поправите формулу лишь в одном месте:
Рис. 7. Добавление еще одного экзамена требует лишь одного изменения в формуле
Без LET вам пришлось бы вносить изменения в трех местах.
Использование нескольких имен в функции LET
Допустим у вас есть ФИО, и нужно извлечь имя. Следующая формула справляется с этой задачей, но понять, как она работает совсем не просто:
1 |
=ПСТР(A2;ПОИСК(" ";A2)+1;ПОИСК(" ";A2;ПОИСК(" ";A2)+1)-ПОИСК(" ";A2)-1) |
Рис. 8. Извлечение имени из ФИО
Чтобы работа формулы стала более понятной, можно ввести несколько имен:
- ФИО = А2
- пробел1 = ПОИСК(
"
"
;A2) - пробел2 = ПОИСК(
"
"
;A2;ПОИСК("
"
;A2)+1)
Теперь формула стала намного понятнее:
1 2 3 4 5 6 |
=LET( ФИО;A2; пробел1;ПОИСК(" ";A2); пробел2;ПОИСК(" ";A2;ПОИСК(" ";A2)+1); ПСТР(ФИО;пробел1+1;пробел2-пробел1-1) ) |
Рис. 9. Та же формула, но с использованием имен
Функция LET и динамические массивы
В предыдущих примерах формула с LET вводилась в одну ячейку, а далее копировалась вдоль столбца. Чаще у нас на входе будет массив, и результат также будет представлять из себя массив. В Excel 365 обработать такие ситуации можно с помощью одной формулы с поддержкой динамических массивов.
Предположим, в одной таблице у вас есть график экзаменов (см. рис. 10, диапазон А2:С21), а во второй таблице вы хотите вывести только ту часть графика, которая приходится на n ближайших дней, не включая сегодняшний. Да к тому же отсортировать список по фамилиям по алфавиту. Определите имена внутри функции LET, и используйте функции динамических массивов СОРТ и ФИЛЬТР. Результатом будет массив записей в диапазоне Е6:G10.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
=LET( данные;$A$2:$C$21; даты;C2#; сегодня;E1; n;F3; СОРТ( ФИЛЬТР( данные; (даты>сегодня)*(даты<=сегодня+n); "Нет экзаменов" ) ) ) |
Рис. 10. Использование LET с динамическими массивами
Поскольку даты экзаменов я задал в ячейке С2 случайной функцией СЛМАССИВ, нажимая F9 вы будете изменять даты в С2:С21. Соответственно будет меняться таблица, начинающаяся в Е6.
Извлечение предпоследнего слова из текстовой строки
Допустим у вас есть серия фраз, из которых нужно извлечь предпоследнее слово. В принципе понятно, как найти решение, но также ясно, что оно будет не простым, и основано на целом ряде шагов. Можно, например:
- сжать пробелы (вдруг между какими-то словами используется более одного пробела);
- подсчитать длину исходной фразы;
- длину фразы с удаленными пробелами;
- узнать количество слов во фразе;
- заменить пробел перед предпоследним словом на знак карет ^;
- выделить часть фразы после карет ^;
- найти позицию пробела между оставшимися двумя словами;
- выделить левое слово.
Рис. 11. Найти предпоследнее слово в пять шагов
Поскольку часто хотят получить ответ в одной ячейке, указанные выше пять формул можно объединить в одну. Для этого начните с формулы в ячейке F2:
1 |
=ЛЕВСИМВ(E2;НАЙТИ(" ";E2)-1) |
Вместо ссылки на Е2 дважды подставьте формулу из Е2 (без знака равно). Получится:
1 |
=ЛЕВСИМВ(ПСТР(D2;НАЙТИ("^";D2)+1;50);НАЙТИ(" ";ПСТР(D2;НАЙТИ("^";D2)+1;50))-1) |
Теперь выделите формулу в D2 и подставьте ее содержимое четыре раза вместо ссылки на D2. Если вы дойдете до конца, то получите формулу, ссылающуюся только на А2:
Рис. 12. Объединенная формула в одной ячейке
Вот именно в таких задачах выгода от использования функции LET становится очевидной. Для начала вы дадите имя переменной для формулы из B2 (см. рис. 11), затем, используя это первое имя, поименуете формулу в ячейке С3, и т.д., двигаясь теперь слева направо. Вы можете провести подготовительную работу в таблице…
Рис. 13. Имена и значения
… а затем подставить эти имена и формулы в функцию LET:
Рис. 14. Функция LET облегчает написание и понимание формулы
Чтобы формула с LET лучше читалась, используйте Alt+Enter для перехода к новой строке в строке формул после каждой пары аргументов.
Расчет ответа в игре Быки и коровы
Кратко напомню правила. Играют двое. Каждый задумывает и записывает тайное 4-значное число с неповторяющимися цифрами (ноль может быть первым). Игрок, который начинает игру по жребию, делает попытку отгадать число. Попытка — это 4-значное число с неповторяющимися цифрами, сообщаемое противнику в виде вопроса. Противник говорит в ответ, сколько цифр угадано с совпадением их позиций в тайном числе и сколько угадано без совпадения. Например: задумано тайное число 3219; попытка (вопрос) 2310; результат (ответ): один «бык» (цифра 1 из вопроса входит в тайное число и стоит на своем месте) и две «коровы» (цифры 2 и 3 из вопроса входят в тайное число, но стоят не на своем месте). Ответ сообщается в виде 2-значного числа. В нашем примере ответ – 12 (один «бык», две «коровы»). Игроки делают попытки по очереди. Побеждает тот, кто первым получит на свой вопрос ответ 40.
Около 10 лет назад я написал заметку на эту тему и для нахождения ответов использовал довольно сложную формулу:
Рис. 15. Формула для получения ответа в игре Быки и коровы
Тогда я использовал механизм объединения нескольких формул в ряде ячеек в одну сложную формулу. Промежуточные вычисления у меня не сохранились, так что сейчас мне было бы довольно непросто понять, как работает формула. За 10 лет изменился Excel и мои знания формул, так что сегодня эту задачу я бы решал иначе.
Итак, нам нужно сравнить два 4-значных числа, и подсчитать, сколько цифр совпадает в них с точностью до позиции и сколько просто совпадает:
Рис. 16. Формула для получения ответа в игре Быки и коровы с использованием LET
Первые четыре переменные извлекают цифры из проверяемого числа. Вторые четыре переменные – из числа-вопроса. Имя Бык возвращает количество совпадающих цифр с точностью до позиции. Кор1, … Кор4 возвращают число совпадений на разных позициях. Вычисление выводит ответ. Вуаля!
Литература
Baxter Floyd. Excel 2021. A Complete Guide About Excel 2021 With All-in-One Approach For Beginners
Bill Jelen. MrExcel 2021 – Unmasking Excel. Holy Macro! Books. 2021
Разработка оптимальной стратегии игры «Быки и коровы» на основе теории информации
крутая штука
давно ждал чего-то подобного
А примечания к ярлыку листа как не было, так и нет ((