Статья Хилла Уейна, автора почтовой рассылки «Компьютерные штучки», которая посвящена формальным методам и применению математики в программировании, истории и культуре программного обеспечения, философии и теории программирования, а также всяким экзотическим штукам и нишевым темам. В общем, рекомендуем.
В прошлом выпуске рассылки Уейн игрался с языком программирования J, который работает как арифметический калькулятор в консоли, и пошутил по ходу дела:
Пошутив про офисную программу, Хилл Уейн решил действительно посмотреть на неё поближе… и был поражён увиденным: «Это как найти сундук с сокровищами у себя на чердаке», — пишет он. И перечисляет некоторые новые функции современного Excel, о которых мало кто знает.
Вот кое-что из интересного.
Начнём с самой полезной функции, о которой, похоже, никто не знает. Вместо того чтобы повсюду использовать названия ячеек и диапазонов типа
![](https://habrastorage.org/r/w1560/webt/qd/6a/-4/qd6a-4ffnllvozskm_4h8ndlxfw.png)
Определены три имени, одно — фиксированное значение, другое — фиксированный массив, третье — ссылка на ячейку
Обычно об этом не принято распространяться, но такой метод устраняет одну из главных проблем нечитаемости формул. Вместо формулы
О, и можете составлять кастомные формулы на свой вкус.
Это не шутка. В 2020 году Microsoft добавила в Excel функции
Предположим, у нас такая табличка.
![](https://habrastorage.org/r/w1560/webt/b8/cs/ra/b8csramedfn7vo8bn2-yceqlmke.png)
Последний столбец — сложное преобразование текста
Нажимаем Ctrl+E:
![](https://habrastorage.org/r/w1560/webt/ow/6l/iu/ow6liunshqkwugpzzx7iajwcjvq.png)
Теперь в последних двух строках столбец заполнен по тому же образцу
Разве не здорово?!
Очень порадовала кнопка «Импорт из интернета»:
![](https://habrastorage.org/r/w1560/webt/ue/8v/6o/ue8v6oilsrtixoswyuhlawex-o8.png)
Она делает почти то, что вы ожидаете: вводите URL страницы — и оттуда HTML-таблица преобразуется в таблицу Excel.
Но есть нюанс (вот почему «почти»). Значения из интернета не просто копируются на лист. Excel сохраняет «запрос данных» по URL. Если изменить таблицу до неузнаваемости, то можно обновить запрос — и немедленно восстановить исходную таблицу вместе с любыми обновлениями из источника. То есть мы можем просто периодически (или автоматически) обновлять значения, которые подгружаются из интернета.
Это можно сделать практически с любым источником данных, включая XML, JSON и даже таблицы в PDF. В качестве эксперимента я импортировал в Excel старую налоговую декларацию в PDF — и он извлёк нужные данные.
Но прежде чем импортировать данные, можно изменить их на лету с помощью
![](https://habrastorage.org/r/w1560/webt/jj/xc/ow/jjxcow-7phqydlcyqq7zgyv_pps.png)
Очищаем CSV от плохих данных с помощью воспроизводимых шагов
Я уже говорил, что можно переименовать и комментировать каждый шаг? Если это недостаточно круто, как вам такое — можно форкнуть любой запрос, чтобы у разных запросов были общие начальные шаги! Например, вытянуть из интернета кучу данных, очистить их — а затем разложить на отдельные таблицы 2021 и 2022. Затем, если требуется дополнительная очистка, то применяем её к форкнутому префиксу — и обе таблицы на выходе автоматически обновятся.
APL — функциональный язык, оптимизированный для работы с массивами, предшественник Matlab — прим. пер.
Наверное, для меня это самое странное. В Excel есть своеобразные «транзитные» массивы: формула в одной ячейке выводит массив значений, которые транзитом переходят в другие ячейки. Например, у нас такая таблица:
Затем пишем в C1 формулу
А если написать
Это открывает некоторые забавные возможности в стиле APL. Недавно у меня была такая таблица данных:
В этом случае значение в столбце B показывает на нечётные значения, которые не делятся на два. Я хотел вычислить сумму всех значений после деления на два. «Правильный» способ будет такой:
Но можно сделать и в стиле APL, например, так:
В инсайдерской сборке есть несколько формул, которые ещё больше превращают Excel в нечто APL-подобное.
А вот игра «Жизнь» в Excel:
![](https://habrastorage.org/r/w1560/webt/bo/hq/jr/bohqjrxntb2tchynwgkz3ntnkis.png)
В целом я рад, что потратил время на изучение Excel, потому что это очень интересный инструмент, который может оказаться полезным для меня. Даже удивительно, насколько он круче Google Sheets. Все обзоры в интернете говорят, что они примерно равны, но в Sheets даже нет приличных таблиц, не говоря уже о лямбдах или кнопке «Принять позу йоги» (здесь в словах автора чувствуется некая ирония — прим. пер.). Но зато Google Sheets бесплатный.
Вряд ли большинство пользователей, или даже «опытных пользователей», используют эти функции. То же самое верно и для разработчиков, большинство из которых на самом деле не используют все возможности своих редакторов. Однако такие штуки интересно исследовать!
В любом случае, любопытно познакомиться с этим инструментом, если вы или ваша компания оплатила подписку на Office 365.
В прошлом выпуске рассылки Уейн игрался с языком программирования J, который работает как арифметический калькулятор в консоли, и пошутил по ходу дела:
Я столько времени трачу на интерактивные вычисления, что даже не мог оторваться от этих функций… Может, мне просто хорошенько освоить Excel?
Пошутив про офисную программу, Хилл Уейн решил действительно посмотреть на неё поближе… и был поражён увиденным: «Это как найти сундук с сокровищами у себя на чердаке», — пишет он. И перечисляет некоторые новые функции современного Excel, о которых мало кто знает.
Вот кое-что из интересного.
В Excel теперь реальные возможности для программирования
Начнём с самой полезной функции, о которой, похоже, никто не знает. Вместо того чтобы повсюду использовать названия ячеек и диапазонов типа
A15
и B1:D94
, вы можете… дать им нормальные имена. Или пропустить хранение информации в ячейке — и просто напрямую присвоить значение. Почти как в настоящем языке программирования!![](https://habrastorage.org/webt/qd/6a/-4/qd6a-4ffnllvozskm_4h8ndlxfw.png)
Определены три имени, одно — фиксированное значение, другое — фиксированный массив, третье — ссылка на ячейку
Обычно об этом не принято распространяться, но такой метод устраняет одну из главных проблем нечитаемости формул. Вместо формулы
=A1*B1
можно написать =Ширина*Высота
, как это делали деды.О, и можете составлять кастомные формулы на свой вкус.
Это не шутка. В 2020 году Microsoft добавила в Excel функции
LET
и LAMBDA
. Если присвоить формуле LAMBDA(arr,y, MAX(arr)^y)
имя MAXEXP
, то можно использовать MAXEXP
в качестве обычной встроенной формулы. LET
позволяет связывать в середине формулы новые имена, которые также могут ссылаться на предыдущие связывания. Очень простой пример: LET(x, 1, y, x+1, z, y+x)
выдаёт 3
. Примерно так же с LET
работают все языки программирования. Конечно, синтаксис здесь немного странный, если вы не фанат S-выражений (sexp), но всё же. Полезная штука.Заливка!
Предположим, у нас такая табличка.
![](https://habrastorage.org/webt/b8/cs/ra/b8csramedfn7vo8bn2-yceqlmke.png)
Последний столбец — сложное преобразование текста
Нажимаем Ctrl+E:
![](https://habrastorage.org/webt/ow/6l/iu/ow6liunshqkwugpzzx7iajwcjvq.png)
Теперь в последних двух строках столбец заполнен по тому же образцу
Разве не здорово?!
Источники данных
Очень порадовала кнопка «Импорт из интернета»:
![](https://habrastorage.org/webt/ue/8v/6o/ue8v6oilsrtixoswyuhlawex-o8.png)
Она делает почти то, что вы ожидаете: вводите URL страницы — и оттуда HTML-таблица преобразуется в таблицу Excel.
Но есть нюанс (вот почему «почти»). Значения из интернета не просто копируются на лист. Excel сохраняет «запрос данных» по URL. Если изменить таблицу до неузнаваемости, то можно обновить запрос — и немедленно восстановить исходную таблицу вместе с любыми обновлениями из источника. То есть мы можем просто периодически (или автоматически) обновлять значения, которые подгружаются из интернета.
Это можно сделать практически с любым источником данных, включая XML, JSON и даже таблицы в PDF. В качестве эксперимента я импортировал в Excel старую налоговую декларацию в PDF — и он извлёк нужные данные.
Но прежде чем импортировать данные, можно изменить их на лету с помощью
Power Query
. Отфильтровать строки, заполнить пустые ячейки, разделить столбец по разделителю, выполнить базовую очистку данных. Все изменения моделируются как последовательность шагов преобразования. Это означает, что если обновить запрос, то все первоначальные преобразования применятся заново. Вот как это выглядит:![](https://habrastorage.org/webt/jj/xc/ow/jjxcow-7phqydlcyqq7zgyv_pps.png)
Очищаем CSV от плохих данных с помощью воспроизводимых шагов
Я уже говорил, что можно переименовать и комментировать каждый шаг? Если это недостаточно круто, как вам такое — можно форкнуть любой запрос, чтобы у разных запросов были общие начальные шаги! Например, вытянуть из интернета кучу данных, очистить их — а затем разложить на отдельные таблицы 2021 и 2022. Затем, если требуется дополнительная очистка, то применяем её к форкнутому префиксу — и обе таблицы на выходе автоматически обновятся.
Excel — это по сути APL
APL — функциональный язык, оптимизированный для работы с массивами, предшественник Matlab — прим. пер.
Наверное, для меня это самое странное. В Excel есть своеобразные «транзитные» массивы: формула в одной ячейке выводит массив значений, которые транзитом переходят в другие ячейки. Например, у нас такая таблица:
A B 1 2 3 4 5 6
Затем пишем в C1 формулу
=A1:A3 + B1:B3
— и получаем C1=3, C2=7, C3=11. Далее, если поместить в D1 формулу =C1^2
, то просто получаем D1=9
. Но если вы вместо этого написать C1#^2
, то это применится к транзитному массиву C1
— и теперь у нас будет D1=9, D2=49, D3=121.А если написать
C1 = A1:A3 + TRANPOSE(B1:B3)
, то получится следующее:C D E 3 5 7 5 7 9 7 9 11
Это открывает некоторые забавные возможности в стиле APL. Недавно у меня была такая таблица данных:
A B 12 15 x
В этом случае значение в столбце B показывает на нечётные значения, которые не делятся на два. Я хотел вычислить сумму всех значений после деления на два. «Правильный» способ будет такой:
=SUM(A:A*IF(ISBLANK(B:B), 1, 0.5))
Но можно сделать и в стиле APL, например, так:
SUM(A:A*(1-0.5*(B:B="x")))
В инсайдерской сборке есть несколько формул, которые ещё больше превращают Excel в нечто APL-подобное.
А вот игра «Жизнь» в Excel:
LET(x, SUM(OFFSET(cell#,-1,-1,3,3)), (x=3)+cell#*(x=4))
![](https://habrastorage.org/webt/bo/hq/jr/bohqjrxntb2tchynwgkz3ntnkis.png)
Разные крутости
- Excel поставляется с решателем для логического программирования с учётом ограничений (constraint solver). Можно включить его в дополнениях программы (аддонах).
- Можно напрямую перемещать или копировать листы между разными файлами Excel.
- С помощью связанных типов данных можно вставить в ячейку позу йоги — и Excel скажет, насколько она сложная.
- Есть кнопка для создания 3D-глобусных карт по вашим данным. Видимо, по ним можно водить экскурсии, хотя я не пробовал (и вряд ли попробую).
- Есть кнопка, которая преобразует выборку данных в изображение.
В целом я рад, что потратил время на изучение Excel, потому что это очень интересный инструмент, который может оказаться полезным для меня. Даже удивительно, насколько он круче Google Sheets. Все обзоры в интернете говорят, что они примерно равны, но в Sheets даже нет приличных таблиц, не говоря уже о лямбдах или кнопке «Принять позу йоги» (здесь в словах автора чувствуется некая ирония — прим. пер.). Но зато Google Sheets бесплатный.
Вряд ли большинство пользователей, или даже «опытных пользователей», используют эти функции. То же самое верно и для разработчиков, большинство из которых на самом деле не используют все возможности своих редакторов. Однако такие штуки интересно исследовать!
В любом случае, любопытно познакомиться с этим инструментом, если вы или ваша компания оплатила подписку на Office 365.