Производственный календарь, т.е. список дат, где соответствующим образом помечены все официальные рабочие и выходные дни — совершенно необходимая штука для любого пользователя Microsoft Excel. На практике без него не обойтись:
- в бухгалтерских расчетах (зарплата, стаж, отпуска…)
- в логистике — для корректного определения сроков доставки с учётом выходных и праздников (помните классическое «давай уже после праздников?»)
- в управлении проектами — для правильной оценки сроков с учётом, опять же, рабочих-нерабочих дней
- при любом использовании функций типа РАБДЕНЬ (WORKDAY) или ЧИСТРАБДНИ (NETWORKDAYS), т.к. они требуют в качестве аргумента список праздников
- при использовании функций Time Intelligence (типа TOTALYTD, TOTALMTD, SAMEPERIODLASTYEAR и т.д.) в Power Pivot и Power BI
- … и т.д. и т.п. — примеров масса.
Тем, кто работает в корпоративных ERP-системах типа 1С или SAP — проще, в них производственный календарь встроен. Но что делать пользователям Excel?
Можно, конечно, вести такой календарь вручную. Но тогда придется как минимум раз в год (а то и чаще, как в «весёлом» 2020 году) его актуализировать, аккуратно внося туда все выходные, переносы и нерабочие дни, придуманные нашим правительством. А потом повторять эту процедуру каждый следующий год. Скукота.
А как насчёт чуть напрячься и сделать «вечный» производственный календарь в Excel? Такой, чтобы сам обновлялся, брал данные из интернета и формировал всегда актуальный список нерабочих дней для последующего использования в любых расчетах? Заманчиво?
Сделать такое, на самом деле, совсем не сложно.
Источник данных
Главный вопрос — а где брать данные? В поисках подходящего источника я перебрал несколько вариантов:
- Оригинальные указы публикуются на сайте правительства в формате PDF (вот, один из них, например) и отпадают сразу — полезную информацию из них не вытащить.
- Заманчивым вариантом, на первый взгляд, казался «Портал открытых данных РФ», где есть соответствующий набор данных, но, при ближайшем изучении всё оказалось печально. Для импорта в Excel сайт жутко неудобен, техподдержка не отвечает (самоизолировались?), да и сами данные там давно устарели — производственный календарь на 2020 год обновлялся последний раз в ноябре 2019 (позорище!) и, само-собой, не содержит наших «коронавирусных» и «голосовательных» выходных 2020 года, например.
Разочаровавшись в официальных источниках, я стал рыть неофициальные. Их в интернете множество, но большинство из них, опять же, совершенно неприспособлены для импорта в Excel и выдают производственный календарь в виде красивых картинок. Но нам-то с вами не на стенку его вешать, правильно?
И вот в процессе поисков случайно обнаружилось прекрасное — сайт http://xmlcalendar.ru/
Без лишних «рюшечек», простой, легкий и быстрый сайт, заточенный под одну задачу — отдавать всем желающим производственный календарь за нужный год в XML-формате. Отлично!
Если, вдруг, вы не в курсе, то XML — это текстовый формат с разметкой содержимого специальными <тегами>. Легкий, удобный и читаемый большинством современных программ, включая Excel.
Я, на всякий случай, связался с авторами сайта и они подтвердили, что сайт существует уже 7 лет, данные на нем постоянно актуализируются (у них для этого даже ветка на github есть) и закрывать его они не собираются. И совершенно не против, чтобы мы с вами с него грузили данные для любых наших проектов и расчётов в Excel. Бесплатно. Как же приятно, что есть еще такие люди! Респектище!
Осталось загрузить эти данные в Excel с помощью надстройки Power Query (для версий Excel 2010-2013 её можно бесплатно скачать с сайта Microsoft, а в версиях Excel 2016 и новее — она уже встроена по умолчанию).
Логика действий будет такая:
- Делаем запрос для загрузки данных с сайта за один любой год
- Превращаем наш запрос в функцию
- Применяем эту функцию к списку всех имеющихся лет, начиная с 2013 и до текущего года — и получаем «вечный» производственный календарь с автоматическим обновлением. Вуаля!
Шаг 1. Импортируем календарь за один год
Сначала загрузим производственный календарь за один любой год, например, за 2020. Для этого в Excel идём на вкладку Данные (или Power Query, если вы установили её как отдельную надстройку) и выбираем Из интернета (From Web). В открывшееся окно вставляем ссылку на соответствующий год, скопированную с сайта:
После нажатия на ОК появляется окно предварительного просмотра, в котором нужно нажать кнопку Преобразовать данные (Transform data) или Изменить данные (Edit data) и мы попадем в окно редактора запросов Power Query, где и продолжим работу с данными:
Сразу же можно смело удалить в правой панели Параметры запроса (Query settings) шаг Измененный тип (Changed Type) — он нам не нужен.
Таблица в столбце holidays содержит коды и описания нерабочих дней — увидеть её содержимое можно, дважды «провалившись» в неё щелчком мыши по зелёному слову Table:
Для возврата назад придется удалить в правой панели все появившиеся шаги обратно до Источника (Source).
Вторая таблица, куда можно зайти аналогичным образом, содержит как раз то, что нам нужно — даты всех нерабочих дней:
Останется эту табличку обработать, а именно:
1. Отфильтровать только даты праздников (т.е. единички) по второму столбцу Attribute:t
2. Удалить все столбцы, кроме первого — щелчком правой кнопкой мыши по заголовку первого столбца и выбором команды Удалить другие столбцы (Remove Other Columns):
3. Разделить первый столбец по точке отдельно на месяц и день с помощью команды Разделить столбец — По разделителю на вкладке Преобразование (Transform — Split column — By delimiter):
4. И, наконец, создать вычисляемый столбец с нормальными датами. Для этого на вкладке Добавление столбца жмём на кнопку Настраиваемый столбец (Add Column — Custom Column) и вводим в появившееся окно следующую формулу:
=#date(2020, [#»Attribute:d.1″], [#»Attribute:d.2″])
Здесь у оператора #date три аргумента: год, месяц и день, соответственно. После нажатия на ОК получаем требуемый столбец с нормальными датами выходных, а остальные столбцы удаляем как в п.2
Шаг 2. Превращаем запрос в функцию
Следующая наша задача — преобразовать созданный на 2020 год запрос в универсальную функцию для любого года (номер года будет её аргументом). Для этого делаем следующее:
1. Разворачиваем (если ещё не развернута) панель Запросы (Queries) слева в окне Power Query:
2. После преобразования запроса в функцию возможность видеть шаги, из которых состоит запрос и легко их редактировать, к сожалению, пропадает. Поэтому имеет смысл сделать копию нашего запроса и резвиться уже с ней, а оригинал оставить про запас. Для этого щелкаем правой кнопкой мыши в левой панели по нашему запросу calendar и выбираем команду Дублировать (Duplicate).
Щелкнув еще раз правой по получившейся копии calendar(2) выберем команду Переименовать (Rename) и введём новое имя — пусть будет, например, fxYear:
3. Открываем исходный код запроса на внутреннем языке Power Query (он лаконично назвается «М») с помощью команды Расширенный редактор на вкладке Просмотр (View — Advanced Editor) и вносим туда небольшие правки для превращения нашего запроса в функцию на любой год.
Было:
Стало:
Если интересны подробности, то здесь:
- (year as number)=> — объявляем, что в нашей функции будет один числовой аргумент — переменная year
- Подклеиваем переменную year в веб-ссылку на шаге Источник. Поскольку Power Query не позволяет склеивать числа и текст, то на лету преобразовываем номер года в текст с помощью функции Number.ToText
- Подставляем переменную year вместо 2020 года на предпоследнем шаге #»Добавлен пользовательский объект«, где мы формировали дату из фрагментов.
После нажатия на Готово наш запрос превращается в функцию:
Шаг 3. Импортируем календари за все года
Осталась самая малость — сделать последний главный запрос, который будет закачивать данные за все имеющиеся года и складывать все полученные даты праздников в одну таблицу. Для этого:
1. Щёлкаем в левой панели запросов в серое пустое место правой кнопкой мыши и выбираем последовательно Новый запрос — Другие источники — Пустой запрос (New Query — From other sources — Blank query):
2. Нам нужно сформировать список всех лет, для которых мы будем запрашивать календари, т.е. 2013, 2014 … 2020. Для этого в строке формул появившегося пустого запроса вводим команду:
Конструкция:
={ЧислоА..ЧислоБ}
… в Power Query формирует список целых чисел от А до Б. Например, выражение
={1..5}
…выдало бы список 1,2,3,4,5.
Ну, а чтобы не привязываться жёстко к 2020 году, мы используем функцию DateTime.LocalNow() — аналог экселевской функции СЕГОДНЯ (TODAY) в Power Query — и извлекаем из неё, в свою очередь, текущий год функцией Date.Year.
3. Полученный набор лет хоть и выглядит вполне адекватно, но для Power Query представляет собой не таблицу, а особый объект — список (List). Но преобразовать его в таблицу — не проблема: достаточно нажать кнопку В таблицу (To Table) в левом верхнем углу:
4. Финишная прямая! Применяем созданную нами ранее функцию fxYear к полученному списку лет. Для этого на вкладке Добавление столбца жмём кнопку Вызвать настраиваемую функцию (Add Column — Invoke Custom Function) и задаём её единственный аргумент — колонку Column1 с годами:
После нажатия на ОК наша функция fxYear по очереди отработает импорт для каждого года и мы получим столбец, где в каждой ячейке будет содержаться таблица с датами нерабочих дней (содержимое таблицы хорошо видно, если щёлкнуть мышью в фон ячейки рядом со словом Table):
Останется развернуть содержимое вложенных таблиц, щёлкнув по значку с двойными стрелками в шапке столбца Даты (галочку Использовать исходное имя столбца как префикс при этом можно снять):
… и после нажатия на ОК мы получим то, что хотели — список всех праздников с 2013 и до текущего года:
Первый, ненужный уже столбец, можно удалить, а для второго задать тип данных Дата (Date) в выпадающем списке в шапке столбца:
Сам запрос можно переименовать как-нибудь более осмысленно, чем Запрос1 и выгрузить затем результаты на лист в виде динамической «умной» таблицы с помощью команды Закрыть и загрузить на вкладке Главная (Home — Close & Load):
Обновлять созданный календарь в будущем можно щелчком правой кнопки мыши по таблице или запросу в правой панели через команду Обновить. Или же использовать кнопку Обновить все на вкладке Данные (Date — Refresh All) или сочетание клавиш Ctrl+Alt+F5.
Вот и всё.
Теперь вам больше никогда не нужно тратить время и мыслетопливо на поиски и актуализацию списка праздничных дней — теперь у вас есть «вечный» производственный календарь. Во всяком случае, до тех пор, пока авторы сайта http://xmlcalendar.ru/ поддерживают своё детище, что, я надеюсь, будет ещё очень и очень долго (спасибо им еще раз!).
Ссылки по теме
- Импорт курса биткойна в Excel из интернета через Power Query
- Поиск ближайшего рабочего дня функцией РАБДЕНЬ (WORKDAY)
- Поиск пересечения интервалов дат
04.01.2023
Другие года: 2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016.
Согласно статье 112 Трудового кодекса Российской Федерации (в ред. ФЗ № 35-ФЗ от 23 апреля 2012 года) нерабочими праздничными днями в Российской Федерации являются:
Праздники в 2023 году:
✅ 31 декабря 2022 года — выходной день.
✅ 1, 2, 3, 4, 5, 6 и 8 января — Новый год (новогодние каникулы);
✅ 7 января — Рождество Христово;
✅ 23 февраля — День защитника Отечества;
✅ 8 марта — Международный женский день;
✅ 1 мая — Праздник Весны и Труда;
✅ 9 мая — День Победы;
✅ 12 июня — День России;
✅ 4 ноября — День народного единства.
Перенос выходных дней ежегодно осуществляется Правительством России в целях рационального планирования рабочего времени в организациях и учета интересов различных категорий работников по созданию условий для полноценного отдыха.
Согласно Постановлению Правительства РФ от 29.08.2022 № 1505 «О переносе выходных дней в 2023 году» (ссылка) разработан перенос выходных дней в 2023 году с праздничных дней:
• с 01.01 (воскресенье) на 24.02 (пятница);
• с 08.01 (воскресенье) на 08.09 (понедельник);
Предпраздничные дни в 2023 году:
• вторник 22 февраля, вторник 7 марта, пятница 3 ноября.
Итого 3 предпраздничных дня в 2023 году.
Скачать Производственный календарь 2023 в excel (xls, таблица «Норма времени» на 2 странице)
Согласно статье 112 Трудового кодекса РФ при совпадении выходного и нерабочего праздничного дней выходной день переносится на следующий после праздничного рабочий день. Исключение составляют выходные дни, совпадающие с нерабочими праздничными днями января. Изменениями, внесенными в ст. 112 ТК РФ Федеральным законом от 23.04.2012 № 35-ФЗ, предусматривается, что Правительство Российской Федерации вправе переносить два выходных дня из числа выходных дней, совпадающих с нерабочими январскими праздничными днями, на другие дни в очередном календарном году.
Норма рабочего времени в 2023 году
Период | Д кален дарных |
Д рабочих | Д выход, празд. |
Д пред- празд. |
Часы 40- часовая |
Часы 36- часовая |
Часы 24- часовая |
Январь | 31 | 17 | 14 | 0 | 136,0 | 122,4 | 81,6 |
Февраль | 28 | 18 | 10 | 1 | 143,0 | 128,6 | 85,4 |
Март | 31 | 22 | 9 | 1 | 175,0 | 157,4 | 104,6 |
1 квартал | 90 | 57 | 33 | 2 | 454,0 | 408,4 | 271,6 |
Апрель | 30 | 20 | 10 | 0 | 160,0 | 144,0 | 96,0 |
Май | 31 | 20 | 11 | 0 | 160,0 | 144,0 | 96,0 |
Июнь | 30 | 21 | 9 | 0 | 168,0 | 151,2 | 100,8 |
2 квартал | 91 | 61 | 30 | 0 | 488,0 | 439,2 | 292,8 |
1 полугодие | 181 | 118 | 63 | 2 | 942,0 | 847,6 | 564,4 |
Июль | 31 | 21 | 10 | 0 | 168,0 | 151,2 | 100,8 |
Август | 31 | 23 | 8 | 0 | 184,0 | 165,6 | 110,4 |
Сентябрь | 30 | 21 | 9 | 0 | 168,0 | 151,2 | 100,8 |
3 квартал | 92 | 65 | 27 | 0 | 520,0 | 468,0 | 312,0 |
Октябрь | 31 | 22 | 9 | 0 | 176,0 | 158,4 | 105,6 |
Ноябрь | 30 | 21 | 9 | 1 | 167,0 | 150,2 | 99,8 |
Декабрь | 31 | 21 | 10 | 0 | 168,0 | 151,2 | 100,8 |
4 квартал | 92 | 64 | 28 | 1 | 511,0 | 459,8 | 306,2 |
2 полугодие | 184 | 129 | 55 | 1 | 1 031,0 | 927,8 | 618,2 |
Год | 365 | 247 | 118 | 3 | 1 973,0 | 1 775,4 | 1 182,6 |
Согласно статье 91 ТК РФ (в ред. Федерального закона от 22 июля 2008 г. N 157-ФЗ) Порядок исчисления нормы рабочего времени на определенные календарные периоды (месяц, квартал, год) в зависимости от установленной продолжительности рабочего времени в неделю определяется федеральным органом исполнительной власти, осуществляющим функции по выработке государственной политики и нормативно-правовому регулированию в сфере труда.» (Собрание законодательства Российской Федерации, 2008, N 30 (ч. I), ст. 3613).
В настоящее время действует Порядок исчисления нормы рабочего времени на определенные календарные периоды времени (месяц, квартал, год) в зависимости от установленной продолжительности рабочего времени в неделю, утвержденный приказом Минздравсоцразвития России от 13 августа 2009 г. N 588н (Бюллетень трудового и социального законодательства РФ, 2009, N 10).
Согласно установленному Порядку исчисления нормы рабочего времени данная норма исчисляется по расчетному графику пятидневной рабочей недели с двумя выходными днями в субботу и воскресенье, исходя из продолжительности ежедневной работы (смены), например, при 40-часовой рабочей неделе — 8 часов, при продолжительности рабочей недели 36 часов она составит 7,2 часа; при 24-часовой рабочей неделе — 4,8 часа. Продолжительность рабочего дня или смены, непосредственно предшествующих нерабочему праздничному дню, уменьшается на один час.
Рассчитанная в приведенном порядке норма рабочего времени распространяется на все режимы труда и отдыха.
Итого
Всего в 2023 году 365 дней (не високосный год) при пятидневной рабочей неделе с двумя выходными днями; 247 рабочих дня, в том числе 3 предпраздничных дня (сокращенных на один час рабочих дней) и 118 выходных и праздничных дней.
Норма рабочего времени в 2023 году составляет:
при 40-часовой рабочей неделе — 1 973,0 часа = 8,0 час. x 247 дней — 3 часа;
при 36-часовой рабочей неделе — 1 775,4 часа = 7,2 час. x 247 дней — 3 часа;
при 24-часовой рабочей неделе — 1 182,6 часа = 4,8 час. x 247 дней — 3 часа.
Теперь разберём, как загрузить в Excel производственный календарь для последующего использования. В статье показан один из вариантов, далеко не единственный.
В качестве источника данных воспользуемся набором на Портале открытых данных РФ (
https://data.gov.ru/opendata/7708660670-proizvcalendar).
Раскроем паспорт набора:
Набор представляет собой производственный календарь c 1999 до 2025 года. Звездочкой (*) отмечены предпраздничные (сокращенные) дни. Плюсом (+) отмечены перенесенные выходные дни.
Для загрузки в Excel скопируем ссылку на набор (https://data.gov.ru/opendata/7708660670-proizvcalendar/data-20191112T1252-structure-20191112T1247.csv):
Запустим Excel. Воспользуемся коннектором для получения данных с Web-страницы (вкладка “Данные” — “Создать запрос” — “Из других запросов” — “Из Интернета”):
В открывшемся диалоге вставим скопированную ранее ссылку на набор:
Предварительный просмотр данных показывает, что в таком виде данными пользоваться будет крайне сложно. Обработаем данные в Power Query.
Загруженный набор данных в каждой строке хранит описание для одного года — сначала на каждый месяц — через запятую список дней (выходных, сокращённых и дополнительных выходных), затем несколько статистических столбцов.
Удалим статистические столбцы. Они нам не пригодятся. Наша цель — таблица, где на каждую дату будет признак — рабочий, выходной или сокращённый рабочий (последний вариант — опциональный, такие дни можно тоже интерпретировать как рабочие, в зависимости от задачи):
Итого, у нас осталось 13 колонок — колонка с годом и с каждый месяцем. Развернём колонки с месяцами в плоский список. Для этого воспользуемся командой “Отменить свёртывание столбцов”:
Команда “Отменить свёртывание столбцов” создаёт пары для каждого сочетания названия столбца и ячейки в этом столбце и превращает их в столбцы:
Далее разделим столбец с днями на отдельные столбцы с помощью команды ”Разделить столбец” — “По разделителю”:
В качестве разделителя укажем запятую, разделим по каждому вхождения разделителя:
Получим 16 столбцов с числами — столько, сколько их значится в максимуме в некоторых месяцах. Там, где значений в ячейке было менее 16 — лишние столбцы остались со значением null. Произведём с числами ту же операцию, которую произвели с месяцами — развернём в плоский список с помощью команды “Отменить свёртывание столбцов”:
И получим таблицу, где каждая строка — характеристики одной даты. Столбец “Атрибут.1” появился как порядковый номер конкретного числа в ячейке, он не пригодится. Удалим его:
Теперь мы можем обработать звёздочки и плюсики, присвоив каждой строке (= каждой дате) некоторый признак. Чтобы далее использовать вычисление, определяющее вхождение символов * или + в строку — нам необходимо преобразовать столбец в текст:
Далее добавляем условный столбец, который будет присваивать признак каждому дню в зависимости от вхождения * и +:
Пропишем условие определения признака следующим образом: если в значении дня (столбец “Значение”) присутствует символ *, то считаем такой день сокращённым рабочим, иначе — выходным. Мы могли бы добавить ещё одно условие для вхождения символа +, но такие дни тоже являются выходными, хоть и добавленными. Можно выделить это тип дней отдельно, если этого требует задача. Мы выделять не будем:
Получаем вот такой столбец:
Теперь можно избавить из дополнительных символов у числа (* и +), чтобы перейти к дальнейшим шагам обработки. Для удаления символов воспользуемся командой “Замена значений”:
Заменим звёздочку на “ничего”. Оставим поле с итоговым значением пустым. Это будет равносильно тому, чтобы удалить выбранные подстроки (в данном случае — звёздочки):
Проделаем аналогичную операцию для удаления плюсиков. Теперь у нас есть три столбца — части даты. Соберём их в дату с помощью вычисляемого столбца:
Сбор даты из элементов можно произвести несколько способами. Рассмотрим один из вариантов — соберём все элементы даты в текстовую строку и преобразуем в дату. Date.From — преобразовывает текст в дату. Text.Combine — объединяет несколько текстовых строк в одну. Text.From — преобразуем нетекстовое значение к текст. Точки между элементами даты добавим для разделения (можно воспользоваться другим символом, например, тире):
Date.From(
Text.Combine(
{
[Значение],
«.»,
[Атрибут],
«.»,
Text.From([#»Год/Месяц»])
}
)
)
В результате получим столбец с датой — Date. Теперь можем удалить составные столбцы — они свою роль сыграли:
Осталось скорректировать типы данных. Поставить, что столбец Date — это данные типа Дата, Day type — Текст:
Результат:
Итоговый код обработки данных:
let
Источник = Csv.Document(Web.Contents(«https://data.gov.ru/opendata/7708660670-proizvcalendar/data-20191112T1252-structure-20191112T1247.csv»),[Delimiter=»,», Columns=18, Encoding=65001, QuoteStyle=QuoteStyle.None]),
#»Повышенные заголовки» = Table.PromoteHeaders(Источник, [PromoteAllScalars=true]),
#»Измененный тип» = Table.TransformColumnTypes(#»Повышенные заголовки»,{{«Год/Месяц», Int64.Type}, {«Январь», type text}, {«Февраль», type text}, {«Март», type text}, {«Апрель», type text}, {«Май», type text}, {«Июнь», type text}, {«Июль», type text}, {«Август», type text}, {«Сентябрь», type text}, {«Октябрь», type text}, {«Ноябрь», type text}, {«Декабрь», type text}, {«Всего рабочих дней», Int64.Type}, {«Всего праздничных и выходных дней», Int64.Type}, {«Количество рабочих часов при 40-часовой рабочей неделе», Int64.Type}, {«Количество рабочих часов при 36-часовой рабочей неделе», type text}, {«Количество рабочих часов при 24-часовой рабочей неделе», type text}}),
#»Удаленные столбцы» = Table.RemoveColumns(#»Измененный тип»,{«Всего рабочих дней», «Всего праздничных и выходных дней», «Количество рабочих часов при 40-часовой рабочей неделе», «Количество рабочих часов при 36-часовой рабочей неделе», «Количество рабочих часов при 24-часовой рабочей неделе»}),
#»Несвернутые столбцы» = Table.UnpivotOtherColumns(#»Удаленные столбцы», {«Год/Месяц»}, «Атрибут», «Значение»),
#»Разделить столбец по разделителю» = Table.SplitColumn(#»Несвернутые столбцы», «Значение», Splitter.SplitTextByDelimiter(«,», QuoteStyle.Csv), {«Значение.1», «Значение.2», «Значение.3», «Значение.4», «Значение.5», «Значение.6», «Значение.7», «Значение.8», «Значение.9», «Значение.10», «Значение.11», «Значение.12», «Значение.13», «Значение.14», «Значение.15», «Значение.16»}),
#»Измененный тип1″ = Table.TransformColumnTypes(#»Разделить столбец по разделителю»,{{«Значение.1», type text}, {«Значение.2», type text}, {«Значение.3», type text}, {«Значение.4», type text}, {«Значение.5», type text}, {«Значение.6», type text}, {«Значение.7», type text}, {«Значение.8», type text}, {«Значение.9», type text}, {«Значение.10», type text}, {«Значение.11», type text}, {«Значение.12», type text}, {«Значение.13», Int64.Type}, {«Значение.14», Int64.Type}, {«Значение.15», Int64.Type}, {«Значение.16», Int64.Type}}),
#»Несвернутые столбцы1″ = Table.UnpivotOtherColumns(#»Измененный тип1″, {«Год/Месяц», «Атрибут»}, «Атрибут.1», «Значение»),
#»Удаленные столбцы1″ = Table.RemoveColumns(#»Несвернутые столбцы1″,{«Атрибут.1»}),
#»Измененный тип2″ = Table.TransformColumnTypes(#»Удаленные столбцы1″,{{«Значение», type text}}),
#»Условный столбец добавлен» = Table.AddColumn(#»Измененный тип2″, «Date type», each if Text.Contains([Значение], «*») then «Сокращённый рабочий» else «Выходной»),
#»Замененное значение» = Table.ReplaceValue(#»Условный столбец добавлен»,»*»,»»,Replacer.ReplaceText,{«Значение»}),
#»Замененное значение1″ = Table.ReplaceValue(#»Замененное значение»,»+»,»»,Replacer.ReplaceText,{«Значение»}),
#»Добавлен пользовательский объект» = Table.AddColumn(#»Замененное значение1″, «Date», each Date.From(
Text.Combine(
{
[Значение],
«.»,
[Атрибут],
«.»,
Text.From([#»Год/Месяц»])
}
)
)),
#»Удаленные столбцы2″ = Table.RemoveColumns(#»Добавлен пользовательский объект»,{«Год/Месяц», «Атрибут», «Значение»}),
#»Измененный тип3″ = Table.TransformColumnTypes(#»Удаленные столбцы2″,{{«Date type», type text}})
in
#»Измененный тип3″
*****
Получили почти то, что хотели, за исключением одного “но” — в итоговой таблице нет рабочих дней. Для решения некоторых задач полученного результата вполне достаточно. Кроме того, обработку дней мы можем далее заложить логикой (а-ля “Всё, что не в таблице — рабочие дни”). Но — закончим задачу для полноценного календаря, где тип присвоен каждой дате. Для этого сгенерим таблицу с полным список дат и объединим с полученной. Для генерации списка дат создадим пустой запрос:
И отредактируем код запроса вручную в Расширенном редакторе:
Зададим границы диапазона данных — дату начала и дату окончания:
date_start = #date(2015, 1, 1),
date_end = #date(2023, 1, 1),
Воспользуемся List.Dates для генерации списка дат. Ей необходимо три параметра: дата старта диапазона, количество элементов и шаг:
date_list = List.Dates(
date_start,
Duration.Days(date_end — date_start) + 1,
#duration(1, 0, 0, 0)
)
Получим вот такой код:
let
date_start = #date(2015, 1, 1),
date_end = #date(2023, 1, 1),
date_list = List.Dates(
date_start,
Duration.Days(date_end — date_start) + 1,
#duration(1, 0, 0, 0)
)
in
date_list
И в результате получим вот список дат в заданном диапазоне. Это список (не таблица) и, соответственно, не имеет всех атрибутов таблицы. Преобразуем его в таблицу:
А вот это уже таблица. Переименуем, изменим типа данных на Date:
Получаем таблицу со списком дат, но без указания типов этих дат. “Вытащим” типы данных из первой созданной таблицы. Для этого объединим таблицы:
Если мы вызвали команду объединения, находясь во второй таблице, то эта вторая таблица автоматически встанет в качестве первой объединяемой таблицы. Нам нужно выбрать вторую — это данные, загруженные с Портала открытых данных. Необходимо указать, по каким столбцам сопоставлять данные — выбираем в обеих таблицах колонку Date:
Для каждой строки создалась подтаблица из данных присоединённой таблицы. Развернём колонки:
Снимем галочку использования названия таблицы в качестве префикса, снимем галочку со столбца Date:
В результате получим таблицу, у которой будут проставлены типы дат у выходных и сокращённых рабочих дней. У части дат будет null вместо типа даты. Исходя из логики загруженного производственного календаря делаем вывод, что это простые рабочие дни. Заменим null на слово “Рабочий”:
Вот теперь — всё. Осталось только загрузить
Итоговый код второго запроса:
let
date_start = #date(2015, 1, 1),
date_end = #date(2023, 1, 1),
date_list = List.Dates(
date_start,
Duration.Days(date_end — date_start) + 1,
#duration(1, 0, 0, 0)
),
#»Преобразовано в таблицу» = Table.FromList(date_list, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#»Переименованные столбцы» = Table.RenameColumns(#»Преобразовано в таблицу»,{{«Column1», «Date»}}),
#»Измененный тип» = Table.TransformColumnTypes(#»Переименованные столбцы»,{{«Date», type date}}),
#»Объединенные запросы» = Table.NestedJoin(#»Измененный тип», {«Date»}, #»data-20191112T1252-structure-20191112T1247″, {«Date»}, «data-20191112T1252-structure-20191112T1247», JoinKind.LeftOuter),
#»Развернутый элемент data-20191112T1252-structure-20191112T1247″ = Table.ExpandTableColumn(#»Объединенные запросы», «data-20191112T1252-structure-20191112T1247», {«Date type»}, {«Date type»}),
#»Замененное значение» = Table.ReplaceValue(#»Развернутый элемент data-20191112T1252-structure-20191112T1247″,null,»Рабочий»,Replacer.ReplaceValue,{«Date type»})
in
#»Замененное значение»
Подробная инструкция так же в видео.
Содержание
- Создание различных календарей
- Способ 1: создание календаря на год
- Способ 2: создание календаря с использованием формулы
- Способ 3: использование шаблона
- Вопросы и ответы
При создании таблиц с определенным типом данных иногда нужно применять календарь. Кроме того, некоторые пользователи просто хотят его создать, распечатать и использовать в бытовых целях. Программа Microsoft Office позволяет несколькими способами вставить календарь в таблицу или на лист. Давайте выясним, как это можно сделать.
Если инструкция по созданию календаря в Microsoft Excel вам покажется сложной, в качестве альтернативы рекомендуем рассмотреть веб-платформу Canva, доступную онлайн из любого браузера. Это сервис с огромной библиотекой редактируемых шаблонов различной направленности и стилистики, в числе которых есть и календари. Любой из них можно изменить на свое усмотрение либо создать таковой с нуля и затем сохранить на компьютер в предпочтительном формате или распечатать.
Создание различных календарей
Все календари, созданные в Excel, можно разделить на две большие группы: охватывающие определенный отрезок времени (например, год) и вечные, которые будут сами обновляться на актуальную дату. Соответственно и подходы к их созданию несколько отличаются. Кроме того, можно использовать уже готовый шаблон.
Способ 1: создание календаря на год
Прежде всего, рассмотрим, как создать календарь за определенный год.
- Разрабатываем план, как он будет выглядеть, где будет размещаться, какую ориентацию иметь (альбомную или книжную), определяем, где будут написаны дни недели (сбоку или сверху) и решаем другие организационные вопросы.
- Для того, чтобы сделать календарь на один месяц выделяем область, состоящую из 6 ячеек в высоту и 7 ячеек в ширину, если вы решили писать дни недели сверху. Если вы будете их писать слева, то, соответственно, наоборот. Находясь во вкладке «Главная», кликаем на ленте по кнопке «Границы», расположенной в блоке инструментов «Шрифт». В появившемся списке выбираем пункт «Все границы».
- Выравниваем ширину и высоту ячеек, чтобы они приняли квадратную форму. Для того, чтобы установить высоту строки кликаем на клавиатуре сочетание клавиш Ctrl+A. Таким образом, выделяется весь лист. Затем вызываем контекстное меню кликом левой кнопки мыши. Выбираем пункт «Высота строки».
Открывается окно, в котором нужно установить требуемую высоту строки. Ели вы впервые делаете подобную операцию и не знаете, какой размер установить, то ставьте 18. Потом жмите на кнопку «OK».
Теперь нужно установить ширину. Кликаем по панели, на которой указаны наименования столбцов буквами латинского алфавита. В появившемся меню выбираем пункт «Ширина столбцов».
В открывшемся окне установите нужный размер. Если не знаете, какой размер установить, можете поставить цифру 3. Жмите на кнопку «OK».
После этого, ячейки на листе приобретут квадратную форму.
- Теперь над расчерченным шаблоном нам нужно зарезервировать место для названия месяца. Выделяем ячейки, находящиеся выше строки первого элемента для календаря. Во вкладке «Главная» в блоке инструментов «Выравнивание» жмем на кнопку «Объединить и поместить в центре».
- Прописываем дни недели в первом ряду элемента календаря. Это можно сделать при помощи автозаполнения. Вы также можете на свое усмотрение отформатировать ячейки этой небольшой таблицы, чтобы потом не пришлось форматировать каждый месяц в отдельности. Например, можно столбец, предназначенный для воскресных дней залить красным цветом, а текст строки, в которой находятся наименования дней недели, сделать полужирным.
- Копируем элементы календаря ещё для двух месяцев. При этом не забываем, чтобы в область копирования также входила объединенная ячейка над элементами. Вставляем их в один ряд так, чтобы между элементами была дистанция в одну ячейку.
- Теперь выделяем все эти три элемента, и копируем их вниз ещё в три ряда. Таким образом, должно получиться в общей сложности 12 элементов для каждого месяца. Дистанцию между рядами делайте две ячейки (если используете книжную ориентацию) или одну (при использовании альбомной ориентации).
- Затем в объединенной ячейке пишем название месяца над шаблоном первого элемента календаря – «Январь». После этого, прописываем для каждого последующего элемента своё наименование месяца.
- На заключительном этапе проставляем в ячейки даты. При этом, можно значительно сократить время, воспользовавшись функцией автозаполнения, изучению которой посвящен отдельный урок.
После этого, можно считать, что календарь готов, хотя вы можете дополнительно отформатировать его на своё усмотрение.
Урок: Как сделать автозаполнение в Excel
Способ 2: создание календаря с использованием формулы
Но, все-таки у предыдущего способа создания есть один весомый недостаток: его каждый год придется делать заново. В то же время, существует способ вставить календарь в Excel с помощью формулы. Он будет каждый год сам обновляться. Посмотрим, как это можно сделать.
- В левую верхнюю ячейку листа вставляем функцию:
="Календарь на " & ГОД(СЕГОДНЯ()) & " год"
Таким образом, мы создаем заголовок календаря с текущим годом. - Чертим шаблоны для элементов календаря помесячно, так же как мы это делали в предыдущем способе с попутным изменением величины ячеек. Можно сразу провести форматирование этих элементов: заливка, шрифт и т.д.
- В место, где должно отображаться названия месяца «Январь», вставляем следующую формулу:
=ДАТА(ГОД(СЕГОДНЯ());1;1)
Но, как видим, в том месте, где должно отобразиться просто название месяца установилась дата. Для того, чтобы привести формат ячейки к нужному виду, кликаем по ней правой кнопкой мыши. В контекстном меню выбираем пункт «Формат ячеек…».
В открывшемся окне формата ячеек переходим во вкладку «Число» (если окно открылось в другой вкладке). В блоке «Числовые форматы» выделяем пункт «Дата». В блоке «Тип» выбираем значение «Март». Не беспокойтесь, это не значит, что в ячейке будет слово «Март», так как это всего лишь пример. Жмем на кнопку «OK».
- Как видим, наименование в шапке элемента календаря изменилось на «Январь». В шапку следующего элемента вставляем другую формулу:
=ДАТАМЕС(B4;1)
В нашем случае, B4 – это адрес ячейки с наименованием «Январь». Но в каждом конкретном случае координаты могут быть другими. Для следующего элемента уже ссылаемся не на «Январь», а на «Февраль», и т.д. Форматируем ячейки так же, как это было в предыдущем случае. Теперь мы имеем наименования месяцев во всех элементах календаря. - Нам следует заполнить поле для дат. Выделяем в элементе календаря за январь все ячейки, предназначенные для внесения дат. В Строку формул вбиваем следующее выражение:
=ДАТА(ГОД(D4);МЕСЯЦ(D4);1-1)-(ДЕНЬНЕД(ДАТА(ГОД(D4);МЕСЯЦ(D4);1-1))-1)+{0:1:2:3:4:5:6}*7+{1;2;3;4;5;6;7}
Жмем сочетание клавиш на клавиатуре Ctrl+Shift+Enter. - Но, как видим, поля заполнились непонятными числами. Для того, чтобы они приняли нужный нам вид. Форматируем их под дату, как это уже делали ранее. Но теперь в блоке «Числовые форматы» выбираем значение «Все форматы». В блоке «Тип» формат придется ввести вручную. Там ставим просто букву «Д». Жмем на кнопку «OK».
- Вбиваем аналогичные формулы в элементы календаря за другие месяцы. Только теперь вместо адреса ячейки D4 в формуле нужно будет проставить координаты с наименованием ячейки соответствующего месяца. Затем, выполняем форматирование тем же способом, о котором шла речь выше.
- Как видим, расположение дат в календаре все ещё не корректно. В одном месяце должно быть от 28 до 31 дня (в зависимости от месяца). У нас же в каждом элементе присутствуют также числа из предыдущего и последующего месяца. Их нужно убрать. Применим для этих целей условное форматирование.
Производим в блоке календаря за январь выделение ячеек, в которых содержатся числа. Кликаем по значку «Условное форматирование», размещенному на ленте во вкладке «Главная» в блоке инструментов «Стили». В появившемся перечне выбираем значение «Создать правило».
Открывается окно создания правила условного форматирования. Выбираем тип «Использовать формулу для определения форматируемых ячеек». В соответствующее поле вставляем формулу:
=И(МЕСЯЦ(D6)1+3*(ЧАСТНОЕ(СТРОКА(D6)-5;9))+ЧАСТНОЕ(СТОЛБЕЦ(D6);9))
D6 – это первая ячейка выделяемого массива, который содержит даты. В каждом конкретном случае её адрес может отличаться. Затем кликаем по кнопке «Формат».В открывшемся окне переходим во вкладку «Шрифт». В блоке «Цвет» выбираем белый или цвет фона, если у вас установлен цветной фон календаря. Жмем на кнопку «OK».
Вернувшись в окно создания правила, жмем на кнопку «OK».
- Используя аналогичный способ, проводим условное форматирование относительно других элементов календаря. Только вместо ячейки D6 в формуле нужно будет указывать адрес первой ячейки диапазона в соответствующем элементе.
- Как видим, числа, которые не входят в соответствующий месяц, слились с фоном. Но, кроме того, с ним слились и выходные дни. Это было сделано специально, так как ячейки, где содержаться числа выходных дней мы зальём красным цветом. Выделяем в январском блоке области, числа в которых выпадают на субботу и воскресение. При этом, исключаем те диапазоны, данные в которых были специально скрыты путем форматирования, так как они относятся к другому месяцу. На ленте во вкладке «Главная» в блоке инструментов «Шрифт» кликаем по значку «Цвет заливки» и выбираем красный цвет.
Точно такую же операцию проделываем и с другими элементами календаря.
- Произведем выделение текущей даты в календаре. Для этого, нам нужно будет опять произвести условное форматирование всех элементов таблицы. На этот раз выбираем тип правила «Форматировать только ячейки, которые содержат». В качестве условия устанавливаем, чтобы значение ячейки было равно текущему дню. Для этого вбиваем в соответствующее поля формулу (показано на иллюстрации ниже).
=СЕГОДНЯ()
В формате заливки выбираем любой цвет, отличающийся от общего фона, например зеленый. Жмем на кнопку «OK».
После этого, ячейка, соответствующая текущему числу, будет иметь зеленый цвет.
- Установим наименование «Календарь на 2017 год» посередине страницы. Для этого выделяем всю строку, где содержится это выражение. Жмем на кнопку «Объединить и поместить в центре» на ленте. Это название для общей презентабельности можно дополнительно отформатировать различными способами.
В целом работа над созданием «вечного» календаря завершена, хотя вы можете ещё долго проводить над ним различные косметические работы, редактируя внешний вид на свой вкус. Кроме того, отдельно можно будет выделить, например, праздничные дни.
Урок: Условное форматирование в Excel
Способ 3: использование шаблона
Те пользователи, которые ещё в недостаточной мере владеют Экселем или просто не хотят тратить время на создание уникального календаря, могут воспользоваться готовым шаблоном, закачанным из интернета. Таких шаблонов в сети довольно много, причем велико не только количество, но и разнообразие. Найти их можно, просто вбив соответствующий запрос в любую поисковую систему. Например, можно задать следующий запрос: «календарь шаблон Excel».
Примечание: В последних версиях пакета Microsoft Office огромный выбор шаблонов (в том числе и календарей) интегрирован в состав программных продуктов. Все они отображаются непосредственно при открытии программы (не конкретного документа) и, для большего удобства пользователя, разделены на тематические категории. Именно здесь можно выбрать подходящий шаблон, а если такового не найдется, его всегда можно скачать с официального сайта Office.com.
По сути, такой шаблон — уже готовый календарь, в котором вам только останется занести праздничные даты, дни рождения или другие важные события. Например, таким календарем является шаблон, который представлен на изображении ниже. Он представляет собой полностью готовую к использованию таблицу.
Вы можете в нем с помощью кнопки заливки во вкладке «Главная» закрасить различными цветами ячейки, в которых содержатся даты, в зависимости от их важности. Собственно, на этом вся работа с подобным календарем может считаться оконченной и им можно начинать пользоваться.
Мы разобрались, что календарь в Экселе можно сделать двумя основными способами. Первый из них предполагает выполнение практически всех действий вручную. Кроме того, календарь, сделанный этим способом, придется каждый год обновлять. Второй способ основан на применении формул. Он позволяет создать календарь, который будет обновляться сам. Но, для применения данного способа на практике нужно иметь больший багаж знаний, чем при использовании первого варианта. Особенно важны будут знания в сфере применения такого инструмента, как условное форматирование. Если же ваши знания в Excel минимальны, то можно воспользоваться готовым шаблоном, скачанным из интернета.
С данной странички вы можете бесплатно скачать календари в формет XLS или XLSx, которые предназначены для программы Excel. Любой из календарей, представленный на ниже, выполнен на 2023 год. Шаблоны отличаются наличием праздников, количеством листов, предусмотренными полями для заметок.
Простой календарь на 2023 год
Язык | русский | |
Количество листов | 1 | |
Неделя начинается | с понедельника | |
Выходные | не выделены | |
Праздники | не выделены | |
Скачать | XLS (Excel 97-2003) | |
Скачать | XLSx (Excel 2007-2016) |
Особенности календаря. Календарь предназначен не только для электронного использования, но и готов для распечатки на А4 формат. Изначально, шаблон чистый, но при желании, можно изменить фон любой ячейки. Классическое построение календарной сетки.
Цветной календарь 2023 в столбик
Язык | русский | |
Количество листов | 1 | |
Неделя начинается | с понедельника | |
Выходные | суббота и воскресенье одним цветом | |
Праздники | не выделены | |
Скачать | XLS (Excel 97-2003) | |
Скачать | XLSx (Excel 2007-2016) |
Особенности календаря. Числа каждого месяца выстроены в столбик. Возле каждого числа осталось место под короткую пометку. Фон каждого месяца выделен уникальным цветом. Тем же цветов выделены и оба выходных соответствующего месяца.
Цветной вертикальный календарь на 2023 год
Язык | русский | |
Количество листов | 1 | |
Неделя начинается | с понедельника | |
Выходные | суббота и воскресенье, разными цветами | |
Праздники | не выделены | |
Скачать | XLS (Excel 97-2003) | |
Скачать | XLSx (Excel 2007-2016) |
Особенности календаря. Данный шаблон, максимально рационально использует рабочее пространство, не имея пробелов и пропусков. Фон ячейки каждого месяца был выделен уникальным цветом. Недели пронумерованы, и выделены тем же цветом, что и соответствующий месяц.
Календарь 2023 с официальными праздниками России
Язык | русский | |
Количество листов | 4 | |
Неделя начинается | с понедельника | |
Выходные | суббота и воскресенье, разными цветами | |
Праздники | официальные праздники в России | |
Скачать | XLS (Excel 97-2003) | |
Скачать | XLSx (Excel 2007-2016) |
Особенности календаря. Календарь составлен на одном листе книги Экселя, но при распечатки на А4 формате листа, займет четыре странички. Желтым фоном были выделены даты, которые в России являются государственными, официальными выходными днями. Каждый праздник подписан. Все 52 недели пронумерованы. На каждое число любого месяца можно сделать запись в 3-4 слова.
Горизонтальный календарь на 2023 год в Экселе
Язык | русский | |
Количество листов | 1 | |
Неделя начинается | с понедельника | |
Выходные | суббота и воскресенье (синий, красный) | |
Праздники | не выделены | |
Скачать | XLS (Excel 97-2003) | |
Скачать | XLSx (Excel 2007-2016) |
Особенности календаря. Каждая неделя пронумерована. Каждый месяца 2023 года имеет свой уникальный цвет фона.
Календарь в Экселе на 2023 год в столбик
Язык | русский | |
Количество листов | 1 | |
Неделя начинается | с понедельника | |
Выходные | суббота и воскресенье (желтый, оранжевый) | |
Праздники | не выделены | |
Скачать | XLS (Excel 97-2003) | |
Скачать | XLSx (Excel 2007-2016) |
Особенности календаря. Числа каждого месяца содержат ячейку для пометки или формулы.
Лежачий календарь в Экселе на 2023 год
Язык | русский | |
Количество листов | 4 | |
Неделя начинается | с понедельника | |
Выходные | суббота и воскресенье (желтый, оранжевый) | |
Праздники | не выделены | |
Скачать | XLS (Excel 97-2003) | |
Скачать | XLSx (Excel 2007-2016) |
Особенности календаря. На одной вкладке размещены все 12 месяцев.
Горизонтальный календарь в Excel на 2023 год А4 формата
Язык | русский | |
Количество листов | 1 | |
Неделя начинается | с понедельника | |
Выходные | суббота и воскресенье (оранжевый фон) | |
Праздники | не выделены | |
Скачать | XLS (Excel 97-2003) | |
Скачать | XLSx (Excel 2007-2016) |
Особенности календаря. Строгая, умеренная цветовая гамма. Месяца размещены в 3 строчки.