106

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

Всем доброго дня. Сегодня хочу предложить вашему вниманию решение одной реальной задачи, которую мне прислала слушательница. Сразу отмечу, что похожие вопросы были и ранее. Поэтому решил аж целую статью накатать по этому поводу :)

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

Лень читать? Вот видео

Формульный детокс: как сократить Excel-формулу размером с простыню до одной строки

Если не все, то наверняка многие сталкивались когда-нибудь с чем-то похожим:

Открываешь ячейку, а там… формула длиной в три экрана, собранная из костылей, велосипедов и какой-то матери. Если вы думаете, что это я специально написал в горячечном бреду, то нет. Самое забавное, что ЭТО даже как-то работало. И так было. Пока не появились они - счастливые обладатели компьютеров Apple. У них почему-то это не работало. Но это было не самое важное (не в обиду пользователям Apple). Куда важнее было оптимизировать формулу до адекватных размеров. Именно с таким вопросом ко мне и обратились. И сейчас я хочу представить вашему вниманию алгоритм решения похожих задач.

СПОЙЛЕР: задача была решена.

Шаг 1: определяем цель.

Прежде чем досконально разбираться в самой формуле (если честно, я этого так и не сделал), мне нужно было понять, какую вообще цель мы преследуем. Всё оказалось очень просто. Формула должна была решать тривиальную задачу: брать стоимость товара в долларах и переводить её в рубли по курсу ЦБ на определенную дату отгрузки. Казалось бы, обычный ВПР (VLOOKUP). Но автор исходника столкнулся с проблемой: курс есть на рабочие дни. На субботу и воскресенье банк его не выкатывает — нужно брать значение за пятницу. Чтобы это обойти, в формулу зашили кучу условий ЕСЛИ (IF), текстовые функции СЦЕПИТЬ (CONCATENATE), вытаскивание по отдельности дней, месяцев и годов... В общем, получился кошмар, который к тому же не работал на MacOS. Скорее всего, из-за разных стандартов в системах. Конкретную причину я не выяснял, так как после того, как отправил свой вариант, слушательница написала, что теперь всё работает даже на маках.

Шаг 2: подбираем инструменты.

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

Шаг 3: дьявол кроется в деталях.

И вот теперь переходим к самому интересному. Если задача такая простая, почему формула-то такая сложная?! Предлагаю вам взглянуть на таблицу с датами и попробовать самим понять, что с ними не так:

Посмотрели? Поняли? Кто понял, тот молодец, кто не понял, но продолжит читать, тот тоже молодец.

А царь-то даты-то ненастоящие! Выровнены по левому краю. Значит, это текст. И нельзя с ними работать, как с нормальными датами. Именно по этой причине формула и была такой страшной. Excel не умеет сопоставлять "правильную" дату из вашего отчета с текстовой строкой "13.07.2026". Автор извлекал по отдельности день, месяц, год. Далее с помощью функции ТЕКСТ(FORMAT) преобразовывал всё это в дату, и только потом сравнивал с датой в основной таблице. Вот этот кусок:

Решение очевидное: преобразовать текстовые даты в корректные даты. Тут стоит отметить, что нельзя это сделать простым изменением формата. Нельзя и всё тут. Далее те самые 5 стадий: отрицание, гнев, торг, депрессия, принятие. И теперь решение. В общем, есть безумно простой способ сделать это. Выделяем столбец, нажимаем Ctrl + H (Поиск и замена). В поле "Найти" пишем точку "." и в поле «Заменить на» пишем тоже точку ".". Жмем "Заменить все". Excel принудительно перезапишет ячейки, поймет, что это числа, и выровняет их по правому краю. Даты вылечены! Если в датах у вас дефисы или слэшы (/), то заменяйте их.

Теперь, когда даты стали датами, выбрасываем 90% старой формулы. Нам нужен ВПР. Но как заставить его автоматически брать курс за пятницу, если дата отгрузки выпала на субботу или воскресенье?

Все привыкли писать в конце ВПР ноль (0 или ЛОЖЬ), требуя точного совпадения. Но если мы поставим туда 1 или ИСТИНА, включится приблизительное совпадение.

Как это работает: если Excel не находит в таблице точную дату (например, субботу), он автоматически берет ближайшее меньшее значение. А ближайшим меньшим значением для субботы и воскресенья в календаре как раз и будет пятница!

!!! Важнейший нюанс !!!: чтобы этот трюк сработал, таблица с курсами валют ОБЯЗАТЕЛЬНО должна быть отсортирована по возрастанию (от старых дат к новым). Иначе ВПР сойдет с ума.

О чудо: огромная простыня текста превратилась в изящное:

Бонус 1: для зажиточных бояр.

Если у вас Excel 2021 года или свежее, можно использовать преемника — функцию ПРОСМОТРX (XLOOKUP). Она еще круче, потому что ей плевать на сортировку. Даже если даты в базе идут в полном хаосе, вы просто выставляете в пятом аргументе режим сопоставления -1 (точное совпадение или следующее меньшее). И всё работает идеально.

Бонус 2: для всех.

Что делать, если вам всё-таки нужно разобраться в чужой сложной формуле, а она выдает ошибку? Не пытайтесь расшифровать её глазами.

В Excel есть встроенный отладчик. Встаньте на ячейку со страшной формулой, перейдите на вкладку "Формулы" - группа "Зависимости формул" - кнопка "Вычислить формулу" (иконка с лупой и fx).

Excel откроет окно, в котором можно посмотреть, что происходит в формуле. Нажимая кнопку "Вычислить", вы будете видеть, как постепенно, шаг за шагом, считаются внутренние функции. Вы сразу (или не сразу, если формула сложно-огромная) поймете, на каком именно этапе и почему формула спотыкается и выдает ошибку.

Резюме:

У самурая нет цели, есть только путь — но в Excel этот подход не работает. Прежде чем писать гигантские формулы:

  1. Приведите данные к правильному формату.

  2. Определитесь с целью.

  3. Подберите инструменты и изучите их.

Стоит отметить, что сократить формулу можно не всегда. Порой логика сложная и формула должна быть соответствующей. Тут уже ничего не попишешь. Либо смотреть в сторону Power Query, Pivot или VBA.

На этом, пожалуй, всё. Спасибо всем, кто дочитал до конца. Надеюсь, было полезно. В комментариях делитесь своими формулами-монстрами. Если статья "зайдёт", то, думаю, будет ещё несколько похожих, так как за время преподавания уже накопился определённый материал.

MS, Libreoffice & Google docs

781 пост15K подписчика

Правила сообщества

1. Не нарушать правила Пикабу

2. Публиковать посты соответствующие тематике сообщества

3. Проявлять уважение к пользователям

4. Не допускается публикация постов с вопросами, ответы на которые легко найти с помощью любого поискового сайта.

По интересующим вопросам можно обратиться к автору поста схожей тематики, либо к пользователям в комментариях


Важно - сообщество призвано помочь, а не постебаться над постами авторов! Помните, не все обладают 100 процентными знаниями и навыками работы с Office. Хотя вы и можете написать, что вы знали об описываемом приёме раньше, пост неинтересный и т.п. и т.д., просьба воздержаться от подобных комментариев, вместо этого предложите способ лучше, либо дополните его своей полезной информацией и вам будут благодарны пользователи.

Утверждения вроде "пост - отстой", это оскорбление автора и будет наказываться баном.

5
Автор поста оценил этот комментарий
Не проще ли было привести таблицу с курсовами валют к нормальному виду? Для сб и вс заполнить пятничные данные?
Это делается очень легко через pq+ достаточно просто нажать обновить, а не вручную вписывать данные.
На планете эксель был подробный пост про это
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

В самом файле была таблица, которая выгружалась из PQ. Как я понял, дальше данные из неё копировали на отдельный лист, который я и показываю в статье. При этом, в самой выгрузке даты уже были текстом. То есть там ошибка в самом запросе. Но речь не шла про исправление запроса.

К нормальную виду я привёл ту таблицу, на которую ссылалась формула.

А вот про "для сб и вс заполнить пятничные данные" не совсем понял. Формула же как раз это и делает, заполняет данные для сб и вс от пятницы.

Если имеете в виду, чтобы в самом запросе к датам добавить выходные, потом выбрать "заполнить вниз", то зачем? Смысл от этого не изменится, всё равно ВПР потом писать.

показать ответы
Автор поста оценил этот комментарий

Это уже какой-то черный пояс по экселю. Я пока только додумалась до power query (при помощи нейронки, конечно же), всем офисом круглыми глазами на это смотрели

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Да, Power Query - это мощь :)

1
Автор поста оценил этот комментарий
Зачастую текст может быть распознан экселем как число, достаточно добавить перед ссылкой на эту ячейку --, а дата в экселе это и есть число
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Да, есть несколько вариантов. Один из них тот, который описали Вы :) Другой, который показал я. Ещё есть функция ДАТАЗНАЧ или ЗНАЧЕН.

3
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Согласен. Вот поэтому и пишу такие статьи :) Если поможет хоть одному человеку, уже хорошо.

0
Автор поста оценил этот комментарий

Делается отдельная таблица календарь. Связывается по дате с таблицей курса валют. К дате в календаре через объединить запросы добавляете курс валюты. Потом заполнить вниз. Проверяем что у даты формат даты. Выходим из query.


Сама делала таблицы и оптимизации на заказ. Пользователи могут поломать все, что ломается, и даже то, что ломаться не должно. Поэтому формулы массивов как защита от удаления, формулы, которые будут работать даже у неграмотных специалистов. И контрольные проверки, где сразу будет видно, что что-то пошло не так.


И некоторые громозкие формулы приходиться делать, потому что заполняют черти как. А потом клиент приходит, что все сломалось и данные не правильные

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

То есть Вы предлагаете человеку, который, с Ваших слов, может сломать всё, что угодно, использовать JOIN в Power Query? Вы в этом не видите никакого противоречия? Я вот предыдущему комментатору безуспешно пытался доказать, что у меня была другая задача, попробую и Вам один раз написать. Моей задачей НЕ БЫЛО оптимизировать процесс. Спросили, можно ли формулу сократить. Я формулу сократил. Человек спрашивал для себя. Не для какого-то мифического заказчика. Далее я посчитал, что это интересный случай, решил поделиться опытом с другими. Всё. Вы же тут уже про клиентов, жалобы, сломалось, косяки начнутся.

То, что поломать могут что угодно, так я об этом тоже писал. И Ваши формулы массивов поломают. Выделят полностью, и удалят. Так себе защита. И запрос удалят. Откроют панель запросов, ПКМ-удалить. Только вот какое отношение это имеет к моей статье?

1
Автор поста оценил этот комментарий

Поддерживаю ваше мнение. В power query легко меняется формат даты, сортируется и заполняется данные на выходные. И там есть защита от дурака. А в новом файле с новой формулрй 100% начнутся косяки исполнителей.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

И как же легко в Power Query заполнить данные на выходные, если в источнике выходных нет?

показать ответы
0
Автор поста оценил этот комментарий

Насколько я помню, работало и "=a1+0", но давно это не пробовал, т.к. давно с числовыми значениями так не работал без макросов


Минутка ненужной информации - excel прекрасно обрабатывает ~50 вложенных if

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да, работает. Смысл в том, чтобы сделать какую-то математическую операцию с ячейкой, но при этом число измениться не должно. +0 как раз про это. Но более распространённый вариант - умножение на 1.

0
Автор поста оценил этот комментарий
Так ты не оптимизировал, а ввел дополнительные факторы ошибки. Чем прошлая формула была плоха, кроме того, что она громоздкая?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

В своём вопросе Вы сами и ответили. Формула была громоздкая. Действительно, зачем писать СУММ, когда можно просто сложить 50 ячеек вручную. Громоздко, и что с того? Зато работает. И напишу в четвёртый раз: спросили, можно ли написать короче. Я это сделал.

показать ответы
0
Автор поста оценил этот комментарий
А таблицу расчесчета статики для алюминиевых профилей оптимизируешь? За деньги. Сыпется постоянно, заебала
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Можно попробовать. Тг - @Andrey_Mitrokhin

2
Автор поста оценил этот комментарий
Ты понимаешь, что ты сделал хуже чем было? Раньше просто не работало на маке, а теперь выдает случайные данные, если по какой-то причине нарушили сортировку
раскрыть ветку (1)
Автор поста оценил этот комментарий

Нет, не понимаю :) Человеческий фактор никто никогда не отменит. А если человек в ВПР ошибку сделает? А если не тот столбец укажет, а если забудет запрос обновить, а если, если... И опять же, Вы перегоняете из пустого в порожнее. Третий раз напишу, что задача была - оптимизировать формулу, а не автоматизировать весь процесс.

показать ответы
3
Автор поста оценил этот комментарий
Смысл в том, чтобы результатом парсинга были сразу готовые к использованию данные, а не использовать костыли + у тебя сейчас как минимум 2 фактора влияющие на стабильность работы:
после каждого обновления запроса - переводить текст в дату и чувствительность к фильтрации и сортировки таблицы с курсами
раскрыть ветку (1)
Автор поста оценил этот комментарий

Я же написал выше, что вопрос был не в выгрузке, а в формуле. Этот вопрос я и решал.

По поводу того, зачем добавлять выходные в выгрузку всё равно не понял. Если уж убирать фактор вспомогательной таблицы, то в самом PQ настраиваем сортировку и корректный формат. Далее пишем формулу, про которую речь в статье. И всё чудесно работает и обновляется. Добавление выходных абсолютно ничего не даёт в плане упрощения. Будут точно такие же готовые данные. Нет, я понимаю, что это можно сделать. Вот только это те же яйца, только в профиль. Только придётся ещё в PQ ковыряться, разбираясь, как в столбец с датами добавить выходные.

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества