Как стать автором
Обновить

Комментарии 59

=ЕСЛИ(B1=0; СУММ(ЕСЛИОШИБКА(ПРОСМОТР(_d;_s[[date]:[rate]]);)*ТРАНСП(B5:B16)*ИНДЕКС((_d>ТРАНСП(A5:A16))*(_d<=A2);;)*1/(365+(ОСТАТ(ГОД(_d);4)=0)))-СУММ(ЕСЛИОШИБКА(ПРОСМОТР(_d;_s[[date]:[rate]]);)*ТРАНСП(D5:D16)*ИНДЕКС((_d>ТРАНСП(C5:C16))*(_d<=A2);;)*1/(365+(ОСТАТ(ГОД(_d);4)=0)));)
Кошмар какой! Проще перегнать в базу и обработать данные на любом доступном «человеческом» языке.
И самое стрёмное, что «ЕСЛИ(B1=0; СУММ(...» не работает на компьютерах иностранцев.

Тот кто придумал в Excel пихать формулы на русском — является диверсантом.
Теперь в LibreOffice то же самое. :(
Слава еврейскому б-гу и Аллаху, что в ивритской и арабской локализациях формулы оставили на английском. А то там была бы не только мешанина кириллицы с латиницей, но ещё и RTL/LTR.
И самое стрёмное, что «ЕСЛИ(B1=0; СУММ(...» не работает на компьютерах иностранцев.

Не сработает при «копировать-вставить». Нужно или искать сайт с переводом (или вручную заменить формулы), или взять экселевский файл с этой формулой.
Тот кто придумал в Excel пихать формулы на русском — является диверсантом.

Это сделано для доступности для широких масс (очень широких масс). Ну и все таки использование его редко выходит за пределы одного языка, потому и формулы вполне можно использовать на одном языке.
Когда возникает ситуация «нужно автоматизировать рабочее место продавщицы/телефонистки, Офис уже стоит, сторонний софт устанавливать нельзя, админских прав нет, USB-разъёмы выдраны админом при сборке компа», то приходится городить в Экселе именно такие формулы.
нужно автоматизировать рабочее место продавщицы/телефонистки
сторонний софт устанавливать нельзя, админских прав нет
В данном случае это означает, что Вас никто не уполномачивал автоматизировать это рабочее место. Сначала необходимо разобраться с организационными вопросами, а уж потом браться за технические.
В данном случае это означает, что непосредственному начальнику нужно, чтобы всё работало и не важно как, а глобальные IT-политики принимаются на много уровней выше и не касаются конкретных ситуаций на местах.
Конечно, бывают разные жизненные ситуации, но вообще то нужно бежать из мест, где «нужно, чтобы всё работало и не важно как».
Скажем так, иногда компенсация оправдывает неудобства :-)
Главное, чтоб у нас всегда оставалась возможность выбора.
Обычно такие задания дают эникеям.
В статье формулы совсем не кошмарные.
Просто экселисты делятся на макрописцев и формулистов. Построение таких формул это и развлечение, и соревнование. Учитывается остроумность алгоритма, не стандартное применение функций, их количество, аргументы и скорость обработки
Позвольте с вами не согласиться.
Макросы и формулы решают разные задачи, которые пересекаются очень редко.
Вместо построения громоздкой и трудночитаемой формулы «макропрописец» напишет свою собственную функцию для использования в формуле. Здесь они вполне пересекаются. Если понятно названы переменные, сделаны по-человечески именованые диапазоны, тогда, с учетом высокой читабельности VBA, люди со знанием английского с минимальными усилиями вполне смогут понять, что делает относительно несложный код, особенно если он с нормальными комментариями.
программистов мало, а эксель почти у всех
drive.google.com/file/d/1-yuzAfD2kRNhSVT7lEg_Z-ZWvub0uEFy/view?usp=sharing
по указанной ссылке болванка склада, которой будет достаточно очень многим небольшим фирмочкам. С помощью экселя можно решать очень большое количество задач, и для этого не надо быть программистом. Форумов, где помогут (бесплатно) — очень много, там же куча готовых решений. Было бы желание
НЛО прилетело и опубликовало эту надпись здесь
Статья была бы полезной, если бы автор разжевал все эти редкие функции и сначала показал, как они работают, на тривиальных примерах. А потом уже перешёл бы к реальным применениям.

А тут вывалили сразу трёхэтажный код и разбираться в нём неохота.
Статья не обучающая :). Примеры, кстати, тривиальные. Спрашивайте, отвечу. Выложу ссылки на заинтересовавшие файлы
Мало того, что стоило бы разжевать формулы, нужно ещё их дважды записывать — в русском и английском варианте. Читать мешанину языков — мозг взрывается.
Вспомнив формулы из 1С, решил, что тут всё довольно логично, компактно и трививально. Ещё и по-английски можно написать — вообще мечта…
Не являюсь специалистом в 1С, но разве там нет возможности записать по-английский и нормально структурировав конструкцию с помощью отступов? В приведенных формулах проблема не только в не читаемых сокращенных русских словах (в конце концов автор приводит и англоязычный вариант, который выглядит лишь ненамного лучше), а еще и в отсутствии структурирования.
Если вы пользовались Экселем, то вы замечали, что он парные скобки подсвечивает одинаковым цветом. Это, конечно, не так удобно, как отступы, но намного легче читается, чем использованные в статье одноцветные формулы.
Мой единственный положительный опыт использования Экселя сводится к написанию прайс-листов с автоматическим пересчетом рублевой цены в соответствии с текущим курсом. Но было это во времена версии 1, когда эксель представлял собой именно простую электронную таблицу, да и формула, как Вы понимаете, была простейшей. Более поздние несколько попыток его использовать были с отрицательным результатом, каждый раз приходил к выводу, что я, если и не быстрее, то с меньшей затратой сил и меньшим количеством ошибок напишу свою программу конкретно под данную задачу. А когда обнаружил еще и ошибку в его математике на уровне третьей значащей цифры на определенном наборе данных (по-моему, это была версия из офиса 97), то вообще перестал рассматривать возможность его использования для чего-либо, кроме как визуализации готовых сторонних данных, и это был уже не Эксель, а Calc из Libre Office.

Подсветка парных скобок — это, конечно, лучше, чем ничего, но, если бы авторы Экселя изначально рассчитывали на обработку формул подобной сложности, то должны были бы предусмотреть хоть какое-то структурирование текста.
Скобочки не панацея.
1. Alt+enter дает отступы с новой строки
2. +Ч(«комментарий к формуле») или +N(«комментарий к формуле») с ограничениями — нельзя писать в комментариях только «числа», «даты», «истина» тк эксель будет воспринимать частью формулы

Писать мегаформулы это путь экономиста ) Программист нажмет правую кнопочку мыши на ярлыке листа, выберет "исходный код" и напишет на VBA функцию с отступами. Далее будет вызывать ее =МояМегаФормула(A1:A100). Там еще и отладчик есть.

когда надо переходить на Access
спасибо что поделились, но думаю местные не оценят. любому программисту формулы проще на родном SQL самому себе написать, чем на чуждом — пользовательском — Excel.
НЛО прилетело и опубликовало эту надпись здесь
Не всегда у программиста есть выбор, на чём писать.
Человек, у которого в арсенале инструментов только Эксель, не является программистом в том смысле, в котором это слово трактуется большинством людей.
В соответствии с этим комиксом, я тоже не совсем «real programmer», т.к. в основном пользуюсь не emacs и vim, а Eclipse.
Не самые длинные формулы)
Мой маразм доводил до такого:
помесячное распределение ресурсов между сроками начала и окончания работ с возможностью использования кривых потребления
=ЕСЛИ(
ЕСЛИОШИБКА(
ПОИСКПОЗ($A584;'Отдельные данные'!$A$1:$A$600;0);0)>0;
СУММПРОИЗВ('Отдельные данные'!$B$1:$H$600*('Отдельные данные'!$A$1:$A$600='Остатки по сметам 31010'!$A584)*('Отдельные данные'!$B$1:$H$1='Остатки по сметам 31010'!X$1))/СУММПРОИЗВ('Отдельные данные'!$B$1:$H$600*('Отдельные данные'!$A$1:$A$600='Остатки по сметам 31010'!$A584))*$H584;
ЕСЛИ(ИЛИ($H584<0; $L584=0; МЕСЯЦ(X$1)>МЕСЯЦ($M584); МЕСЯЦ(X$1)<МЕСЯЦ($L584));0;
ЕСЛИ(МЕСЯЦ($M584)=МЕСЯЦ($L584); ($M584-$L584+1)*$H584/($M584-$L584+1);
ЕСЛИ(МЕСЯЦ(X$1)=МЕСЯЦ($L584);(ДЕНЬ(КОНМЕСЯЦА(X$1;0))-ДЕНЬ($L584)+1)*$H584/($M584-$L584+1);
ЕСЛИ(МЕСЯЦ(X$1)=МЕСЯЦ($M584); ДЕНЬ($M584)*$H584/($M584-$L584+1);
$H584/($M584-$L584+1)*ДЕНЬ(КОНМЕСЯЦА(X$1;0)))))))
Неужели кто-то такое пишет?
Пишет. Обоснование элементарное — связка между плановым и сметным отделами через эксель. Подготовка производства так же через эксель.
Конкретно этот случай
image

В работе используем связку формулы экселя + add-in от Ablebits.com (прошу не принимать за рекламу)
Огромная нелюбовь к макросам — администрировать таблицы с ними могут только те, кто написал тк при редактировании структуры таблицы макрос становится нерабочим (поправьте, если я не прав)
Если макрос написан по уму и использует Named Ranges вместо абсолютных адресов, то останется рабочим.

По моему опыту, основная проблема с макросами — что с каждой версией Офиса всё сложнее и сложнее разрешить их выполнение, причём эти разрешения забываются при апгрейде.
А отсутствие структурирования текста конструкции разве не является проблемой?
Макросы (в отличие от формул) пишутся на VBA.
VBA — это полноценный язык программирования.
Хотя Бейсик в среде программистов и является словом нецензурным, но я с Вами согласен. Просто в комментарии Lego-engineer присутствует именно малочитаемая формула, а в последующем комментарии ссылка на картинку под катом не рабочая, поэтому я и написал о том, что увидел.
Всё верно: Lego-engineer пользуется формулами, а не макросами.
что с каждой версией Офиса всё сложнее и сложнее разрешить их выполнение

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

да, ничто не совершенно, настройки панелей тоже улетят. И никто не предлагает сохранить их настройку, хотя это возможно. Но панель макросов и личная книга макросов всё равно в ручную
НЛО прилетело и опубликовало эту надпись здесь
это жаргон :)
Давным давно, в очередной раз скучая на работе, просто ради шутки собрал в экселе такую формулу:
Скрытый текст
=ЕСЛИ(ИЛИ(B4=0;C4=0;D4=0);«Не достаточно данных!»; СЦЕПИТЬ(ЕСЛИ(ИЛИ(И(C4=«апрель»;B4>30); И(C4=«июнь»;B4>30); И(C4=«сентябрь»;B4>30); И(C4=«ноябрь»;B4>30));30; ЕСЛИ(И(C4=«февраль»;B4>28;D4/4=ЦЕЛОЕ(D4/4));29; ЕСЛИ(И(C4=«февраль»;B4>28);28;B4)));" "; ЕСЛИ(C4=«январь»;" января "; ЕСЛИ(C4=«февраль»;" февраля "; ЕСЛИ(C4=«март»;" марта "; ЕСЛИ(C4=«апрель»;" апреля "; ЕСЛИ(C4=«май»;" мая "; ЕСЛИ(C4=«июнь»;" июня "; ЕСЛИ(C4=«июль»;" июля "; ЕСЛИ(C4=«август»;" августа "; ЕСЛИ(C4=«сентябрь»;" сентября "; ЕСЛИ(C4=«октябрь»;" октября "; ЕСЛИ(C4=«ноябрь»;" ноября ";" декабря ")))))))))));" ";D4;" года — "; ЕСЛИ(ДЕНЬНЕД(СЦЕПИТЬ(ЕСЛИ(ИЛИ(И(C4=«апрель»;B4>30); И(C4=«июнь»;B4>30); И(C4=«сентябрь»;B4>30); И(C4=«ноябрь»;B4>30));30; ЕСЛИ(И(C4=«февраль»;B4>28;D4/4=ЦЕЛОЕ(D4/4));29; ЕСЛИ(И(C4=«февраль»;B4>28);28;B4)));"."; ЕСЛИ(C4=«январь»;«01»; ЕСЛИ(C4=«февраль»;«02»; ЕСЛИ(C4=«март»;«03»; ЕСЛИ(C4=«апрель»;«04»; ЕСЛИ(C4=«май»;«05»; ЕСЛИ(C4=«июнь»;«06»; ЕСЛИ(C4=«июль»;«07»; ЕСЛИ(C4=«август»;«08»; ЕСЛИ(C4=«сентябрь»;«09»; ЕСЛИ(C4=«октябрь»;«10»; ЕСЛИ(C4=«ноябрь»;«11»;«12»)))))))))));".";D4);2)=1;«понедельник»; ЕСЛИ(ДЕНЬНЕД(СЦЕПИТЬ(ЕСЛИ(ИЛИ(И(C4=«апрель»;B4>30); И(C4=«июнь»;B4>30); И(C4=«сентябрь»;B4>30); И(C4=«ноябрь»;B4>30));30; ЕСЛИ(И(C4=«февраль»;B4>28;D4/4=ЦЕЛОЕ(D4/4));29; ЕСЛИ(И(C4=«февраль»;B4>28);28;B4)));"."; ЕСЛИ(C4=«январь»;«01»; ЕСЛИ(C4=«февраль»;«02»; ЕСЛИ(C4=«март»;«03»; ЕСЛИ(C4=«апрель»;«04»; ЕСЛИ(C4=«май»;«05»; ЕСЛИ(C4=«июнь»;«06»; ЕСЛИ(C4=«июль»;«07»; ЕСЛИ(C4=«август»;«08»; ЕСЛИ(C4=«сентябрь»;«09»; ЕСЛИ(C4=«октябрь»;«10»; ЕСЛИ(C4=«ноябрь»;«11»;«12»)))))))))));".";D4);2)=2;«вторник»; ЕСЛИ(ДЕНЬНЕД(СЦЕПИТЬ(ЕСЛИ(ИЛИ(И(C4=«апрель»;B4>30); И(C4=«июнь»;B4>30); И(C4=«сентябрь»;B4>30); И(C4=«ноябрь»;B4>30));30; ЕСЛИ(И(C4=«февраль»;B4>28;D4/4=ЦЕЛОЕ(D4/4));29; ЕСЛИ(И(C4=«февраль»;B4>28);28;B4)));"."; ЕСЛИ(C4=«январь»;«01»; ЕСЛИ(C4=«февраль»;«02»; ЕСЛИ(C4=«март»;«03»; ЕСЛИ(C4=«апрель»;«04»; ЕСЛИ(C4=«май»;«05»; ЕСЛИ(C4=«июнь»;«06»; ЕСЛИ(C4=«июль»;«07»; ЕСЛИ(C4=«август»;«08»; ЕСЛИ(C4=«сентябрь»;«09»; ЕСЛИ(C4=«октябрь»;«10»; ЕСЛИ(C4=«ноябрь»;«11»;«12»)))))))))));".";D4);2)=3;«среда»; ЕСЛИ(ДЕНЬНЕД(СЦЕПИТЬ(ЕСЛИ(ИЛИ(И(C4=«апрель»;B4>30); И(C4=«июнь»;B4>30); И(C4=«сентябрь»;B4>30); И(C4=«ноябрь»;B4>30));30; ЕСЛИ(И(C4=«февраль»;B4>28;D4/4=ЦЕЛОЕ(D4/4));29; ЕСЛИ(И(C4=«февраль»;B4>28);28;B4)));"."; ЕСЛИ(C4=«январь»;«01»; ЕСЛИ(C4=«февраль»;«02»; ЕСЛИ(C4=«март»;«03»; ЕСЛИ(C4=«апрель»;«04»; ЕСЛИ(C4=«май»;«05»; ЕСЛИ(C4=«июнь»;«06»; ЕСЛИ(C4=«июль»;«07»; ЕСЛИ(C4=«август»;«08»; ЕСЛИ(C4=«сентябрь»;«09»; ЕСЛИ(C4=«октябрь»;«10»; ЕСЛИ(C4=«ноябрь»;«11»;«12»)))))))))));".";D4);2)=4;«четверг»; ЕСЛИ(ДЕНЬНЕД(СЦЕПИТЬ(ЕСЛИ(ИЛИ(И(C4=«апрель»;B4>30); И(C4=«июнь»;B4>30); И(C4=«сентябрь»;B4>30); И(C4=«ноябрь»;B4>30));30; ЕСЛИ(И(C4=«февраль»;B4>28;D4/4=ЦЕЛОЕ(D4/4));29; ЕСЛИ(И(C4=«февраль»;B4>28);28;B4)));"."; ЕСЛИ(C4=«январь»;«01»; ЕСЛИ(C4=«февраль»;«02»; ЕСЛИ(C4=«март»;«03»; ЕСЛИ(C4=«апрель»;«04»; ЕСЛИ(C4=«май»;«05»; ЕСЛИ(C4=«июнь»;«06»; ЕСЛИ(C4=«июль»;«07»; ЕСЛИ(C4=«август»;«08»; ЕСЛИ(C4=«сентябрь»;«09»; ЕСЛИ(C4=«октябрь»;«10»; ЕСЛИ(C4=«ноябрь»;«11»;«12»)))))))))));".";D4);2)=5;«пятница»; ЕСЛИ(ДЕНЬНЕД(СЦЕПИТЬ(ЕСЛИ(ИЛИ(И(C4=«апрель»;B4>30); И(C4=«июнь»;B4>30); И(C4=«сентябрь»;B4>30); И(C4=«ноябрь»;B4>30));30; ЕСЛИ(И(C4=«февраль»;B4>28;D4/4=ЦЕЛОЕ(D4/4));29; ЕСЛИ(И(C4=«февраль»;B4>28);28;B4)));"."; ЕСЛИ(C4=«январь»;«01»; ЕСЛИ(C4=«февраль»;«02»; ЕСЛИ(C4=«март»;«03»; ЕСЛИ(C4=«апрель»;«04»; ЕСЛИ(C4=«май»;«05»; ЕСЛИ(C4=«июнь»;«06»; ЕСЛИ(C4=«июль»;«07»; ЕСЛИ(C4=«август»;«08»; ЕСЛИ(C4=«сентябрь»;«09»; ЕСЛИ(C4=«октябрь»;«10»; ЕСЛИ(C4=«ноябрь»;«11»;«12»)))))))))));".";D4);2)=6;«суббота»;«воскресенье»)))))); ЕСЛИ(ДАТА(D4; ЕСЛИ(C4=«январь»;1; ЕСЛИ(C4=«февраль»;2; ЕСЛИ(C4=«март»;3; ЕСЛИ(C4=«апрель»;4; ЕСЛИ(C4=«май»;5; ЕСЛИ(C4=«июнь»;6; ЕСЛИ(C4=«июль»;7; ЕСЛИ(C4=«август»;8; ЕСЛИ(C4=«сентябрь»;9; ЕСЛИ(C4=«октябрь»;10; ЕСЛИ(C4=«ноябрь»;11;12))))))))))); ЕСЛИ(ИЛИ(И(C4=«апрель»;B4>30); И(C4=«июнь»;B4>30); И(C4=«сентябрь»;B4>30); И(C4=«ноябрь»;B4>30));30; ЕСЛИ(И(C4=«февраль»;B4>28;D4/4=ЦЕЛОЕ(D4/4));29; ЕСЛИ(И(C4=«февраль»;B4>28);28;B4))))>СЕГОДНЯ();" (только будет)"; ЕСЛИ(ДАТА(D4; ЕСЛИ(C4=«январь»;1; ЕСЛИ(C4=«февраль»;2; ЕСЛИ(C4=«март»;3; ЕСЛИ(C4=«апрель»;4; ЕСЛИ(C4=«май»;5; ЕСЛИ(C4=«июнь»;6; ЕСЛИ(C4=«июль»;7; ЕСЛИ(C4=«август»;8; ЕСЛИ(C4=«сентябрь»;9; ЕСЛИ(C4=«октябрь»;10; ЕСЛИ(C4=«ноябрь»;11;12))))))))))); ЕСЛИ(ИЛИ(И(C4=«апрель»;B4>30); И(C4=«июнь»;B4>30); И(C4=«сентябрь»;B4>30); И(C4=«ноябрь»;B4>30));30; ЕСЛИ(И(C4=«февраль»;B4>28;D4/4=ЦЕЛОЕ(D4/4));29; ЕСЛИ(И(C4=«февраль»;B4>28);28;B4))))<СЕГОДНЯ();" (уже было)";" (сегодня)"))))

Из ячеек B4, C4 и D4, в которых выставляются день (1-31 число из всплывающего списка), месяц (январь-декабрь из всплывающего списка) и год соответственно (пишется произвольный, но проверяется на диапазон 1900-2100 гг.).
Что делает формула:
1) проверяет число и, если выбранная дата больше возможной в выбранном месяце, подставляет максимально возможную (с учетом високосности года для февраля)
2) меняет падеж в названии месяца (например, январь -> января)
3) вычисляет день недели для выбранной даты
4) сравнивает с сегодняшней датой и выдает «уже было», «сегодня» или «только будет», ну и в итоге выдает всю эту информацию в одну сточку.

Еще раз повторю, это было просто ради шутки. Никакой практической цели, кроме как поупражняться с многоуровневыми вложениями формул в формулы не было.
Just for fun))
Это чудо сокращается в разы с помощью волшебной функции ВПР и вспомогательных таблиц
впр не нужен. если нужны вспомогательные таблицы, то лучше использовать ИНДЕКС (намного гибче, и при использовании диапазонов читабельнее, ну и предсказуемее, тк при изменении таблицы данных не нужно лезть в формулу для изменения номера столбца). а конкретно здесь интереснее смотрелась формула ПОИСКПОЗ (т.к. нам нужен номер месяца). и доптаблицы не нужны. ПОИСКПОЗ(C4;{«январь»;«февраль»;«март»;«апрель»;«май»;«июнь»;«июль»;«август»;«сентябрь»;«октябрь»;«ноябрь»;«декабрь»};0)
Да, вы несомненно правы, я прекрасно знаю и много использую и ВПР, и ИНДЕКС в связке с ПОИСКПОЗ, и СУММЕСЛИМН с кучей условий, а также дополнительные вычисления на скрываемых листах… В общем много с экселем работаю.
Тут как раз была идея засунуть кучу различных вычислений именно в одну ячейку, просто ради забавы и собственно длинны всей этой формулы. Ну и чтобы это коррекетно работало в итоге.

Таких формул можно вагон и маленькую тележку нагуглить. Или не таких. Кто ж его знает, если просто вывалены куски кода без пояснений, как оно всё в Экселе работает.

Для всех кто пишет, что проще было на чем то другом сделать, скажу, что сам с таким сталкивался, когда делаешь для людей которые знают только эксель, а не аксесс или другие чудо базы.
Открывая статью, ожидал увидеть новые методы для уменьшения размеров этих формул, что-то вроде лайфхаков при работе с ними.
Есть такое выражение Математика это язык. Вот Эксель это тоже язык. Если бы офисные работники побольше бы работали в нём, а не в специально созданном ПО, их количество было бы меньше.
п.4
A1:A12 — числа от 1 до 12
B1 — год
=СУММ(ЕСЛИ(ДЕНЬНЕД(ДАТА(B1;A1:A12;13);2)=5;1;0))
Кстати, да! Спасибо!
Эксель это круто, особенно с постоянным пересчетом данных. Но когда файл за 1 месяц растет на 2,5мб, то через 3 месяца, через сетевой диск — там просто не реально работать. Приходилось тупо руками убивать инфу за 1 месяц, а архив создавать в другом файле без формул.
Трудно что-то сказать. Но мешать формулы и данные — не самая хорошая идея. Форматирование (цвет шрифта, заливка, границы) кушает объем. Очень часто прилетает мусор при использовании Ctrl+C & Ctrl+V из сторонних источников.
Но Мелкомягкие сделали очень хорошие умные таблицы и Power query
Когда-то в 2006 году увидел «внутренние» sql-запросы в оракле на несколько десятков строк, такие длинные запросы с тех пор больше нигде не видел)))
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории