Николай Павлов Microsoft Excel: Мастер Формул Подробное руководство по «высшему пилотажу» в формулах и функциях Microsoft Excel Москва Издательство «Книга по Требованию» 2016 © Павлов Николай, 2017 П 12 Microsoft Excel: Мастер Формул. Подробное руководство по «высшему пилотажу» в формулах и функциях / Николай Павлов – М., 2017. – 240 с. : ил. ISBN 978-5-519-50143-9 В этой книге практикующий IT-тренер и MVP по Excel Николай Павлов делится секретами создания и отладки сложных формул в программе Microsoft Excel. Подробно разбираются нюансы работы с дубликатами, извлечение топовых значений, сравнение списков, поиск и подстановка данных, настройка связей между таблицами и многое другое. Книга рассчитана на средних и продвинутых пользователей Microsoft Excel. Ко всем описанным в книге задачам в комплекте идут живые файлы-примеры, которые можно использовать в работе. УДК 004,42(075.8) ББК 32.81-018,2*32.973.26 Оглавление ОТ АВТОРА ....................................................................................................................................................................... 4 ФАЙЛЫ ПРИМЕРОВ И ВИДЕОУРОКИ .............................................................................................................................. 5 ВВЕДЕНИЕ В ФОРМУЛЫ МАССИВОВ .............................................................................................................................. 6 ОПРЕДЕЛЕНИЕ И СПОСОБЫ ВВОДА ФОРМУЛ МАССИВА.................................................................................................................... 7 Способы ввода формул массива .................................................................................................................................... 7 КЛАССИФИКАЦИЯ ФОРМУЛ МАССИВА .......................................................................................................................................... 8 Тип 1. Массив(ы) на входе, массив на выходе .............................................................................................................. 8 Тип 2. Массив(ы) на входе, ячейка на выходе ............................................................................................................... 8 Тип 3. Массив констант внутри формулы ................................................................................................................. 9 ПЛЮСЫ И МИНУСЫ ФОРМУЛ МАССИВА ...................................................................................................................................... 10 Плюсы формул массива ................................................................................................................................................ 10 Минусы формул массива .............................................................................................................................................. 10 ХИТРОСТИ ВВОДА И ОТЛАДКИ СЛОЖНЫХ ФОРМУЛ ....................................................................................................11 ВЫЧИСЛЕНИЕ ФРАГМЕНТА ФОРМУЛЫ......................................................................................................................................... 12 ПОШАГОВОЕ ВЫПОЛНЕНИЕ....................................................................................................................................................... 13 БЫСТРОЕ ВЫДЕЛЕНИЕ ВСЕГО МАССИВА....................................................................................................................................... 14 НАГЛЯДНОСТЬ СЛОЖНЫХ ФОРМУЛ ............................................................................................................................................ 15 УМНЫЕ ТАБЛИЦЫ.................................................................................................................................................................... 16 ИМЕНОВАННЫЕ ДИАПАЗОНЫ .................................................................................................................................................... 19 ТОЧНОЕ КОПИРОВАНИЕ ФОРМУЛ БЕЗ СДВИГА ССЫЛОК.................................................................................................................. 23 ВЫБОРОЧНЫЙ ПОДСЧЕТ ПО УСЛОВИЯМ .....................................................................................................................25 СРЕДНЕЕ БЕЗ УЧЕТА НУЛЕЙ И ОШИБОК ........................................................................................................................................ 26 ВЫБОРОЧНОЕ СУММИРОВАНИЕ ОДНОМУ УСЛОВИЮ..................................................................................................................... 27 ВЫБОРОЧНОЕ СУММИРОВАНИЕ ПО НЕСКОЛЬКИМ УСЛОВИЯМ........................................................................................................ 29 Способ 1. Функция СУММЕСЛИМН .............................................................................................................................. 29 Способ 2. Функция баз данных БДСУММ .................................................................................................................... 30 Способ 3. Формула массива ......................................................................................................................................... 31 ПОДСЧЕТ КОЛИЧЕСТВА И СУММЫ ПО УСЛОВИЮ С УЧЕТОМ РЕГИСТРА .............................................................................................. 32 СУММИРОВАНИЕ ЯЧЕЕК ЧЕРЕЗ ОДНУ, ДВЕ, ТРИ И Т.Д. ................................................................................................................... 34 СУММИРОВАНИЕ ЯЧЕЕК ПО ДИАГОНАЛИ..................................................................................................................................... 37 СУММИРОВАНИЕ ПО «ОКНУ» НА ЛИСТЕ ..................................................................................................................................... 39 СУММИРОВАНИЕ ТОЛЬКО ВИДИМЫХ ЯЧЕЕК ................................................................................................................................ 41 СУММИРОВАНИЕ ЯЧЕЕК ПО ЦВЕТУ, ШРИФТУ, ФОРМАТУ И Т.Д. ....................................................................................................... 43 Оживляем призрака ...................................................................................................................................................... 43 Применение на практике ............................................................................................................................................ 44 Ложка дегтя ................................................................................................................................................................. 45 СУММИРОВАНИЕ ЧИСЕЛ, НАПИСАННЫХ ЧЕРЕЗ ДРОБЬ ................................................................................................................... 47 ПОИСК И ПОДСТАНОВКА ...............................................................................................................................................48 СЕКРЕТЫ ФУНКЦИИ ВПР (VLOOKUP) ....................................................................................................................................... 49 Стандартное использование ..................................................................................................................................... 49 Символы подстановки ................................................................................................................................................. 49 Интервальный просмотр............................................................................................................................................ 50 Перехват ошибок #Н/Д ................................................................................................................................................ 51 Левый ВПР ...................................................................................................................................................................... 52 Способ 1. ВПР и ВЫБОР .................................................................................................................................................................52 Способ 2. ИНДЕКС и ПОИСКПОЗ ...................................................................................................................................................53 Способ 3. СУММЕСЛИ ...................................................................................................................................................................53 Мастер Формул www.PlanetaExcel.ru Несовпадение форматов ............................................................................................................................................. 54 Непечатаемые символы и лишние пробелы .............................................................................................................. 56 Вычисление номера столбца ....................................................................................................................................... 56 Поиск и подстановка с учетом регистра .................................................................................................................. 57 Использование «умных таблиц» в связке с ВПР ........................................................................................................ 59 Извлечение сразу нескольких столбцов ..................................................................................................................... 60 Сравнение быстродействия разных видов ВПР ........................................................................................................ 60 ПОИСК ПО НЕСКОЛЬКИМ УСЛОВИЯМ .......................................................................................................................................... 62 ДВУМЕРНЫЙ ПОИСК (ВПР 2D) ................................................................................................................................................. 63 Способ 1. Функции ИНДЕКС и ПОИСКПОЗ .................................................................................................................... 63 Способ 2. Пересечение именованных диапазонов ..................................................................................................... 64 ТРЕХМЕРНЫЙ ПОИСК СРАЗУ ПО НЕСКОЛЬКИМ ЛИСТАМ (ВПР 3D) .................................................................................................. 67 ПОИСК ДАННЫХ В НЕСКОЛЬКИХ ТАБЛИЦАХ .................................................................................................................................. 70 Одинаковые таблицы................................................................................................................................................... 70 Разные таблицы ........................................................................................................................................................... 71 ПОИСК БЛИЖАЙШЕГО ЧИСЛОВОГО ЗНАЧЕНИЯ.............................................................................................................................. 74 Поиск ближайшего наименьшего................................................................................................................................ 74 Поиск ближайшего наибольшего ................................................................................................................................ 74 Поиск ближайшего значения (точно) ......................................................................................................................... 75 ПОИСК ПОСЛЕДНЕГО ЗНАЧЕНИЯ ................................................................................................................................................. 78 ПОИСК СРАЗУ ВСЕХ ЗНАЧЕНИЙ (МУЛЬТИВПР) ............................................................................................................................. 81 ПОИСК ЗАДАННОЙ ПОСЛЕДОВАТЕЛЬНОСТИ В СПИСКЕ ................................................................................................................... 84 ПОДСТАНОВКА ИЗ НИОТКУДА .................................................................................................................................................... 85 Функция ВЫБОР ............................................................................................................................................................. 85 Массив констант в формуле ...................................................................................................................................... 85 Массив констант с именем ........................................................................................................................................ 86 ПОИСК ЧАСТИЧНЫХ ТЕКСТОВЫХ СОВПАДЕНИЙ ............................................................................................................................. 88 ТОЧНЫЙ ПОИСК С УЧЕТОМ РЕГИСТРА СИМВОЛОВ ......................................................................................................................... 90 ПОИСК ПЕРВОГО ИЛИ ПОСЛЕДНЕГО ЗНАЧЕНИЯ В СТРОКЕ ИЛИ СТОЛБЦЕ ........................................................................................... 92 Текст .............................................................................................................................................................................. 92 Числа ............................................................................................................................................................................... 93 Универсальный вариант .............................................................................................................................................. 95 ФИЛЬТРАЦИЯ ФОРМУЛАМИ ...................................................................................................................................................... 97 Способ 1. Без формул массива, но с дополнительным столбцом .......................................................................... 97 Способ 2. Формулой массива без дополнительных столбцов .............................................................................. 100 АНАЛИЗ ПРЕДЕЛЬНЫХ ЗНАЧЕНИЙ ............................................................................................................................. 103 ВЫЯВЛЕНИЕ ТОПОВЫХ ЗНАЧЕНИЙ ............................................................................................................................................ 104 ПОИСК МИНИМАЛЬНОГО/МАКСИМАЛЬНОГО ПО УСЛОВИЮ ......................................................................................................... 106 ПОИСК МИНИМАЛЬНОГО/МАКСИМАЛЬНОГО ПО НЕСКОЛЬКИМ УСЛОВИЯМ ................................................................................... 109 ПОИСК САМЫХ ЧАСТО ВСТРЕЧАЮЩИХСЯ ЗНАЧЕНИЙ ................................................................................................................... 111 Поиск самых часто встречающихся чисел функцией МОДА ................................................................................. 111 Частотный анализ по диапазонам функцией ЧАСТОТА ........................................................................................ 112 Поиск самого часто встречающегося текста ....................................................................................................... 112 ДУБЛИКАТЫ И УНИКАЛЬНЫЕ ..................................................................................................................................... 115 ПОДСЧЕТ КОЛИЧЕСТВА УНИКАЛЬНЫХ ЗНАЧЕНИЙ В СПИСКЕ .......................................................................................................... 116 ИЗВЛЕЧЕНИЕ УНИКАЛЬНЫХ ЗНАЧЕНИЙ...................................................................................................................................... 119 Необходимое вступление .......................................................................................................................................... 119 Способ 1. Вспомогательный столбец ...................................................................................................................... 120 Способ 2. Формула массива ........................................................................................................................................ 123 УДАЛЕНИЕ ДУБЛИКАТОВ ......................................................................................................................................................... 126 СРАВНЕНИЕ СПИСКОВ ................................................................................................................................................. 127 СОВПАДАЮТ ИЛИ НЕТ?........................................................................................................................................................... 128 ПОДСВЕТКА ОТЛИЧИЙ-СОВПАДЕНИЙ В ДВУХ СПИСКАХ ................................................................................................................ 132 1 Мастер Формул www.PlanetaExcel.ru ВЫЯВЛЕНИЕ РАЗЛИЧИЙ В ДВУХ СПИСКАХ .................................................................................................................................. 133 Способ 1. Простой - функция СЧЁТЕСЛИ ................................................................................................................... 133 Способ 2. Продвинутый – получаем отличия отдельным списком ..................................................................... 133 ПОИСК СОВПАДЕНИЙ В ДВУХ И БОЛЕЕ СПИСКАХ ......................................................................................................................... 136 ТРАНСФОРМАЦИЯ ТАБЛИЦ ФОРМУЛАМИ.................................................................................................................139 РАЗМЕЩЕНИЕ ЭЛЕМЕНТОВ СПИСКА В ОБРАТНОМ ПОРЯДКЕ ......................................................................................................... 140 ТРАНСПОНИРОВАНИЕ (ПОВОРОТ) ТАБЛИЦ ................................................................................................................................ 142 Способ 1. Функция ТРАНСП ......................................................................................................................................... 142 Способ 2. Формируем адрес сами .............................................................................................................................. 143 УДАЛЕНИЕ ПУСТЫХ ЯЧЕЕК В СПИСКЕ ......................................................................................................................................... 145 СОРТИРОВКА ФОРМУЛОЙ ....................................................................................................................................................... 148 Для чисел...................................................................................................................................................................... 148 Для текста ................................................................................................................................................................. 148 Формулой массива на «умной таблице» ................................................................................................................. 150 СЛУЧАЙНАЯ ВЫБОРКА ЭЛЕМЕНТОВ ИЗ СПИСКА .......................................................................................................................... 153 Простой вариант ....................................................................................................................................................... 153 Без повторов ............................................................................................................................................................... 153 Одной формулой массива .......................................................................................................................................... 154 РАЗДЕЛЕНИЕ ОДНОГО СТОЛБЦА НА НЕСКОЛЬКО ......................................................................................................................... 157 ФОРМУЛЫ ДЛЯ РАБОТЫ С ДАТАМИ ..........................................................................................................................159 НЕОБХОДИМОЕ ВСТУПЛЕНИЕ .................................................................................................................................................. 160 ОКРУГЛЕНИЕ ДАТ .................................................................................................................................................................. 161 Округление даты до ближайшего рабочего дня .................................................................................................... 161 Округление даты до заданного дня недели ............................................................................................................ 163 ОПРЕДЕЛЕНИЕ ДАТЫ ПО ДНЮ И НОМЕРУ НЕДЕЛИ ...................................................................................................................... 165 СКОЛЬКО ЗАДАННЫХ ДНЕЙ НЕДЕЛИ ПОПАДАЕТ В ИНТЕРВАЛ ДАТ .................................................................................................. 166 Способ 1. Формула массива ....................................................................................................................................... 166 Способ 2. Новая функция ЧИСТРАБДНИ.МЕЖД ........................................................................................................ 169 ВЫЧИСЛЕНИЕ НУЖНОЙ ДАТЫ КАЖДОГО МЕСЯЦА ....................................................................................................................... 170 ПЕРЕСЕЧЕНИЕ ДВУХ ИНТЕРВАЛОВ ДАТ ...................................................................................................................................... 172 Пересекаются или нет? ............................................................................................................................................ 172 Сколько дней в пересечении? ..................................................................................................................................... 173 ВЫЯВЛЕНИЕ ВРЕМЕННЫХ ИНТЕРВАЛОВ, КУДА ВХОДИТ ЗАДАННАЯ ДАТА ........................................................................................ 176 ГЕНЕРАЦИЯ СЛУЧАЙНОГО СПИСКА ДАТ ..................................................................................................................................... 178 СКЛЕИВАНИЕ ДАТ И ТЕКСТА..................................................................................................................................................... 180 ПРОДВИНУТОЕ УПРАВЛЕНИЕ СВЯЗЯМИ С ПОМОЩЬЮ ФОРМУЛ ..............................................................................181 СОЗДАНИЕ ВНЕШНИХ ССЫЛОК ВРУЧНУЮ ................................................................................................................................... 182 3D-ССЫЛКИ НА ГРУППУ ЛИСТОВ .............................................................................................................................................. 183 СВЯЗЫВАНИЕ ЛИСТОВ СПЕЦИАЛЬНОЙ ВСТАВКОЙ ....................................................................................................................... 185 СОЗДАНИЕ ССЫЛОК НА ДРУГИЕ ЛИСТЫ ФОРМУЛОЙ .................................................................................................................... 187 КОНСОЛИДАЦИЯ ТАБЛИЦ ИЗ РАЗНЫХ ФАЙЛОВ СО СВЯЗЯМИ ........................................................................................................ 189 РЕДАКТИРОВАНИЕ СВЯЗЕЙ МЕЖДУ КНИГАМИ ............................................................................................................................ 193 ПОЛУЧЕНИЕ ИМЕНИ ТЕКУЩЕГО ФАЙЛА И ЛИСТА ФОРМУЛОЙ ....................................................................................................... 195 ОГЛАВЛЕНИЕ КНИГИ С ГИПЕРССЫЛКАМИ .................................................................................................................................. 197 Шаг 1. Создаем список листов .................................................................................................................................. 197 Шаг 2. Добавляем автоматическое обновление ................................................................................................... 198 Шаг 3. Скрываем ошибки ........................................................................................................................................... 198 Шаг 4. Добавляем гиперссылки ................................................................................................................................. 199 ДИНАМИЧЕСКИЕ ГИПЕРССЫЛКИ ИЗ ОДНОЙ ТАБЛИЦЫ В ДРУГУЮ .................................................................................................. 200 ВИЗУАЛИЗАЦИЯ СВЯЗЕЙ С ПОМОЩЬЮ НАДСТРОЙКИ INQUIRE....................................................................................................... 202 ДРУГИЕ ТРЮКИ С ФОРМУЛАМИ .................................................................................................................................205 ДИНАМИЧЕСКИЙ ДИАПАЗОН С АВТОПОДСТРОЙКОЙ РАЗМЕРОВ .................................................................................................... 206 2 Мастер Формул www.PlanetaExcel.ru Способ 1. Умная таблица ........................................................................................................................................... 206 Способ 2. Динамический именованный диапазон формулами ............................................................................... 208 Ищем последнюю ячейку ........................................................................................................................................................... 208 Формируем ссылку с помощью ИНДЕКС................................................................................................................................... 210 Создаем именованный диапазон .............................................................................................................................................. 210 ИЗВЛЕЧЕНИЕ ДАННЫХ ИЗ СВОДНЫХ ТАБЛИЦ .............................................................................................................................. 211 Постановка задачи ..................................................................................................................................................... 211 Прямая ссылка на ячейку в сводной .......................................................................................................................... 212 Функция ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ ................................................................................................. 212 Ссылка на итоги .......................................................................................................................................................... 214 Использование дат ..................................................................................................................................................... 214 ИЗВЛЕЧЕНИЕ ЧИСЕЛ ИЗ ТЕКСТА ................................................................................................................................................ 216 Извлечение номера счета из описания платежа ................................................................................................... 216 Извлечение почтового индекса из адреса ............................................................................................................... 217 Извлечение целых чисел из текста .......................................................................................................................... 219 СПРАВОЧНИК ПО ФУНКЦИЯМ ИЗ ЭТОЙ КНИГИ ......................................................................................................... 221 АДРЕС (ADDRESS) ......................................................................................................................................................................... 222 ВПР (VLOOKUP) ............................................................................................................................................................................ 222 ВЫБОР (CHOOSE) ......................................................................................................................................................................... 222 ГПР (HLOOKUP) ............................................................................................................................................................................ 223 ДАТА (DATE) ................................................................................................................................................................................. 223 ДВССЫЛ (INDIRECT) ..................................................................................................................................................................... 224 ДЕНЬНЕД (WEEKDAY)................................................................................................................................................................... 224 ЕПУСТО (ISBLANK) ........................................................................................................................................................................ 224 ЕСЛИ (IF) ....................................................................................................................................................................................... 224 ЕСЛИОШИБКА (IFERROR) ............................................................................................................................................................. 225 ЕЧИСЛО (ISNUMBER) ................................................................................................................................................................... 226 ИНДЕКС (INDEX) ........................................................................................................................................................................... 226 ЛЕВСИМВ (LEFT)........................................................................................................................................................................... 228 МЕДИАНА (MEDIAN) .................................................................................................................................................................... 228 НАИБОЛЬШИЙ (LARGE) ............................................................................................................................................................... 228 НАИМЕНЬШИЙ (SMALL) .............................................................................................................................................................. 229 НАЙТИ (FIND) ............................................................................................................................................................................... 229 ПЕЧСИМВ (CLEAN) ....................................................................................................................................................................... 229 ПОИСК (SEARCH) .......................................................................................................................................................................... 230 ПОИСКПОЗ (MATCH).................................................................................................................................................................... 230 ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ (GET.PIVOT.DATA) .................................................................................................. 231 ПРАВСИМВ (RIGHT) ..................................................................................................................................................................... 231 ПСТР (MID) ................................................................................................................................................................................... 232 РАБДЕНЬ (WORKDAY) .................................................................................................................................................................. 232 РАБДЕНЬ.МЕЖД (WORKDAY.INTL) .............................................................................................................................................. 232 СЖПРОБЕЛЫ (TRIM) .................................................................................................................................................................... 233 СЛУЧМЕЖДУ (RANDBETWEEN) ................................................................................................................................................... 233 СМЕЩ (OFFSET) ............................................................................................................................................................................ 233 СОВПАД (EXACT) .......................................................................................................................................................................... 234 СРЗНАЧЕСЛИ (AVERAGEIF)........................................................................................................................................................... 234 СТОЛБЕЦ (COLUMN) .................................................................................................................................................................... 234 СТРОКА (ROW) ............................................................................................................................................................................. 235 СУММЕСЛИ (SUMIF) .................................................................................................................................................................... 235 СУММПРОИЗВ (SUMPRODUCT) .................................................................................................................................................. 236 СЧЁТЕСЛИ (COUNTIF) ................................................................................................................................................................... 236 ТЕКСТ (TEXT) ................................................................................................................................................................................. 237 ТРАНСП (TRANSPOSE) .................................................................................................................................................................. 237 ЯЧЕЙКА (CELL) .............................................................................................................................................................................. 237 ТРЕНИНГИ ..................................................................................................................................................................... 239 3 От автора Хочу сразу и честно вас предупредить. Если вы только недавно окунулись в мир Excel – не покупайте эту книгу. Вас и без нее будет ждать много восхитительных открытий. Я вам даже немного завидую. Радость и ощущение всемогущества от использования сводных таблиц, или функции ВПР (VLOOKUP), или условного форматирования первое время будет зашкаливать и без этого. Купите лучше любую хорошую книжку по базовому набору функций Excel или мою предыдущую: «Microsoft Excel: сборник готовых рецептов – бери и пользуйся!». Пользы будет больше. Книга, которую вы держите в руках, – не для новичков. Эта книга для тех, кто в Microsoft Excel работает уже давно. Достаточно давно, чтобы к радости от результатов работы порой примешивалось и разочарование от осознания того, что не все, что хочется, возможно реализовать в этой программе. Для тех, кто «перерос ВПР» и хочет с помощью формул творить на порядок более сложные вещи. Если вы из таких – добро пожаловать. Мне есть, чем с вами поделиться. Файлы примеров и видеоуроки Нет ничего более раздражающего, чем хороший пример. (Марк Твен) Книга – это хорошо, но живой пример с готовой формулой – еще лучше! Ко всем задачам из этой книги есть файлы Excel, где можно посмотреть работающие формулы и даже скопировать их оттуда в свой проект. Не стесняйтесь. Имена файлов повторяют названия глав, так что найти нужное будет несложно: Где взять эти файлы: Если вы купили эту книгу в электронном виде, то файлы примеров должны идти в комплекте архивом. Если в бумажном, то файлы можно скачать на моем сайте в разделе Книги: www.PlanetaExcel.ru/books Также несколько задач из этой книги пошагово разобраны в видеоуроках, которые я выкладываю у себя на сайте в разделе Видеоуроки www.PlanetaExcel.ru/video. Если вы из тех, кому «лучше один раз увидеть» и по тексту разобраться сложновато, то загляните в этот раздел – возможно, есть видео с разбором вашей задачи. Введение в формулы массивов Абсолютное большинство пользователей Excel никогда даже не слышали про формулы массива. Меньшинство – встречали их в чужих таблицах или в интернете и пытались копировать в своих проектах (далеко не всегда удачно). И уже совсем немногие научились использовать их мощь и магию для решения своих задач. В этой главе мы: Разберемся с тем, что же такое массивы и формулы массива, как они работают, какова их внутренняя логика. Классифицируем формулы массива на 3 основных типа и изучим их особенности. Научимся двум способам ввода формул массива. Обсудим плюсы и минусы использования формул массивов, какие преимущества они дают пользователю и чем за это приходится платить. Мастер Формул www.PlanetaExcel.ru Определение и способы ввода формул массива Мой совет: идите вперед не останавливаясь. Так всякий раз оказываешься в новом месте. (Джордж Карлин) Давайте начнем, как положено, с синхронизации терминологии, чтобы быть уверенными далее, что мы с вами одинаково понимаем ключевые понятия. Массив – это набор элементов, состоящий из двух или более элементов. В терминах Excel, массив – это диапазон, состоящий из нескольких ячеек. Как и диапазоны, массивы могут быть одномерными (строка или столбец) или двумерными. Любая обычная формула в Excel принимает на входе один или несколько массивов в виде исходных данных, обрабатывает их и выдает значение в качестве результата. Формула массива – это формула в ячейке листа Excel, которая обрабатывает на входе один или несколько массивов, применяя к каждой ячейке какие-либо действия (математические или логические операторы, функции и т.д.) и выдавая на выходе тоже массив. Иногда к результирующему массиву в конце тоже применяется какая-либо функция (суммирование, среднее и т.п.) – тогда на выходе формулы массива будет одно значение. Способы ввода формул массива Существует два основных способа ввести формулу массива: Ввести формулу в ячейку листа и нажать сочетание Ctrl+Shift+Enter вместо просто Enter. Тогда Excel воспримет ее уже не как обычную, а именно как формулу массива. Она будет автоматически заключена в фигурные скобки (вводить их вручную не нужно – это не поможет). В некоторых случаях можно вести формулу как аргумент функции СУММПРОИЗВ (SUMPRODUCT). Тогда нажимать Ctrl+Shift+Enter не нужно и фигурных скобок вокруг формулы не появляется, но фактически формула будет работать уже как формула массива. Первый способ – это классика. Второй способ не совсем очевиден и не всегда применим, но позволяет избежать проблем, возникающих, когда начинающие пользователи пытаются изменять (копировать) формулы массива и, конечно же, не жмут в конце сочетание Ctrl+Shift+Enter. 7 Мастер Формул www.PlanetaExcel.ru Классификация формул массива Условно можно классифицировать все формулы массива на три основных типа. Тип 1. Массив(ы) на входе, массив на выходе ФМ, принимающие на входе массивы (диапазоны) ячеек и выдающие на выходе массив (диапазон) ячеек. Классический пример такой формулы – расчет таблицы умножения (помните обратную сторону обложки своей тетрадки по математике в школе?): Для ввода такой формулы нужно сначала выделить сразу все зеленые ячейки (D8:L16), ввести формулу в первую ячейку диапазона (D5) и затем нажать сочетание Ctrl+Shift+Enter. Формула вычислит результаты перемножения всех пар чисел и заполнит ими сразу весь выделенный диапазон. Тип 2. Массив(ы) на входе, ячейка на выходе Также весьма часто встречаются формулы массива, принимающие на входе массивы (диапазоны) и выдающие на выходе одну ячейку. Обычно это вариация первого типа, но к результирующему массиву применена какаялибо агрегирующая функция (например, СУММ, СРЗНАЧ, МИН и т.п.): 8 Мастер Формул www.PlanetaExcel.ru Тип 3. Массив констант внутри формулы Массивом может быть не только диапазон ячеек, но и массив констант (чисел и текстовых строк), явно прописанный прямо в формуле в фигурных скобках: В приведенном выше примере функция ИНДЕКС выбирает из массива констант дней недели нужный день по номеру. Причем в русской версии Excel для разделения элементов в строке используется точка с запятой, а для разделения строк – двоеточие: А в английской версии Excel для разделения элементов в строке может использоваться запятая либо обратный слеш, а для разделения строк – точка с запятой: Для ввода формул с массивами констант сочетание Ctrl+Shift+Enter нажимать не нужно, достаточно обычного Enter. 9 Мастер Формул www.PlanetaExcel.ru Плюсы и минусы формул массива Знак «плюс» состоит из двух знаков «минус». (Наблюдение) Как всегда, у любой палки два конца. Формулы массива (ФМ) – очень мощный инструмент, но не панацея от всех проблем. Плюсы формул массива Иногда ФМ – единственный способ решить задачу, т.к. в Excel просто нет встроенных функций для этого. Например, существуют функции СУММЕСЛИ и СРЗНАЧЕСЛИ (SUMIF и COUNTIF), но нет их аналогов для нахождения максимума и минимума по условию (точнее говоря, эти функции появились только в последних обновлениях Excel 2016). Простая ФМ эту задачу решает легко в любой версии Excel. Конечно, есть еще и макросы, ими можно реализовать вообще все, но надо уметь программировать, а это тема для другой (весьма толстой!) книги. ФМ могут компактно заменить много промежуточных вычислений и столбцов со вспомогательными формулами. Попробуйте реализовать ВПР (VLOOKUP), выдающую сразу все найденные значения, а не только первое встретившееся, например. ФМ можно использовать как вариант защиты данных, т.к. в ФМ, выдающих на выходе сразу массив ячеек, нельзя менять отдельные ячейки – только весь массив сразу. Многие начинающие пользователи не в курсе такого нюанса, и это становится для них непреодолимой преградой. Минусы формул массива Сложность понимания и отладки отпугивает на начальном этапе. Но к концу этой книги мы эту проблему совместными усилиями решим, я надеюсь. В отличие от обычных формул, Excel запускает пересчет всего массива при изменении хотя бы одной в нем ячейки. Это плохо отражается на быстродействии – ФМ для обработки больших диапазонов данных заметно тормозят Excel. Иногда альтернативные способы (вспомогательные столбцы с обычными формулами, сводные таблицы) оказываются быстрее и эффективнее. В ФМ, выдающих на выходе массив ячеек, невозможно отредактировать отдельные ячейки массива – только всю ФМ целиком. Это создает определенные неудобства. 10 Хитрости ввода и отладки сложных формул Громоздкость и сложность формул (особенно формул массива) создают определенные трудности при их написании и отладке. Однако есть несколько простых трюков, которые могут заметно облегчить жизнь в такой ситуации. В этой главе мы разберем: Как быстро вычислить любой выделенный фрагмент любой формулы. Как разложить сложную формулу на отдельные действия «по шагам». Как добавить наглядность при вводе запутанных формул с вложенными функциями. Как упростить себе жизнь, используя «умные таблицы» Excel и именованные диапазоны в своих проектах. Как скопировать ячейки, не нарушив формулы в них. Мастер Формул www.PlanetaExcel.ru Вычисление фрагмента формулы Простота – высшая ступень искусства. (Брюс Ли) Это мегапростой и мегаудобный трюк, позволяющий быстро определить правильность формулы или понять, что именно и как она считает. Пожалуй, для меня он является основным способом отладки сложных формул. И основным инструментом при попытке разобраться в чужих формульных «кружевах». Суть его насколько проста – настолько же и гениальна. Если выделить мышью фрагмент любой сложной формулы… …и нажать на клавиатуре клавишу F9, то Excel вычислит выделенную часть и покажет ее результат: Очень важно после нажатия на F9 не забыть потом нажать Ctrl+Z, чтобы вернуть формулу в исходное состояние, или Esc, чтобы выйти из ячейки без сохранения изменений. 12 Мастер Формул www.PlanetaExcel.ru Пошаговое выполнение Интересно взглянуть «за кулисы» любимого фильма или спектакля? В Excel любую длинную и сложную формулу можно в специальном окне выполнить медленно и пошагово, наблюдая логику ее работы и промежуточные значения вложенных функций. Для этого выделите ячейку с формулой и на вкладке Формулы (Formulas) нажмите кнопку Вычислить формулу (Evaluate Formula). В появившемся диалоговом окне можно несколько раз, не спеша, жать на кнопку Вычислить (Evaluate) и наблюдать за процессом «изнутри»: 13 Мастер Формул www.PlanetaExcel.ru Быстрое выделение всего массива Если вы имеете дело с формулой массива первого типа (выдающей на выходе массив), то иногда не совсем очевидно, в каких именно ячейках листа она работает. Чтобы выделить сразу весь массив ячеек, который участвует в текущей формуле массива, достаточно выделить одну любую ячейку из него и нажать сочетание клавиш Ctrl+/: Это позволит быстро понять, с какими именно ячейками на листе работает данная формула, и изменить ее сразу для всех ячеек, если нужно. 14 Мастер Формул www.PlanetaExcel.ru Наглядность сложных формул Приходилось ли вам когда-нибудь разбираться с чужой сложной, многоэтажной формулой? Или даже со своей собственной, но сделанной давно? Мои знакомые программисты называют такой случай «холодный код», имея в виду, что ты уже толком не можешь вспомнить, что именно и как ты пытался реализовать и почему именно такую функцию использовал. Разобраться в таком бывает нелегко. Посмотрите, например, вот на такую «матрешку» из вложенных функций: Не очень-то понятная с ходу логика, правда? На самом деле все можно весьма значительно упростить, если сделать следующее: Увеличить высоту строки формул, потянув за ее нижний край: В строке формул разнести формулу на несколько отдельных смысловых строк, ставя мигающий курсор в точку разрыва и используя сочетание клавиш Alt+Enter: Там же, в строке формул, с помощью пробелов добавить отступы для вложенных функций, наглядно отобразив смысловые уровни «матрешки»: 15 Мастер Формул www.PlanetaExcel.ru Умные таблицы Если размеры диапазона, с которым должна работать формула, постоянно меняются (например, к нему периодически дописываются строки с новыми данными), то вместо постоянного отслеживания размеров и исправления ссылок в формулах можно использовать «умную таблицу». «Умная таблица» - неофициальный, но уже устаканившийся термин, который я ввел несколько лет назад, чтобы отличать такие автоподстраивающиеся в размерах таблицы от обычных фиксированных диапазонов, т.к. кто-то в Microsoft не придумал ничего лучше, как оригинально назвать их Таблицами (Tables). Подозреваю, что детей этого человека зовут Ребенок1 и Ребенок2. Для преобразования диапазона в Умную Таблицу нужно выделить ее (иногда достаточно выделить даже одну любую ячейку в ней) и нажать на вкладке Главная кнопку Форматировать как таблицу (Home – Format as Table): Дизайн роли не играет – выбирайте любой из предложенных. Если принципиально не нужно перекрашивать таблицу (например, у нее уже есть жестко заданное корпоративное оформление), то потом можно будет на вкладке Конструктор (Design) в группе Стили (Styles) выбрать вариант без перекрашивания. 16 Мастер Формул www.PlanetaExcel.ru Главное удобство, которое мы получаем после превращения обычной таблицы в «умную», состоит в использовании имен таблицы и ее столбцов в формулах. Имя самой таблицы можно посмотреть/изменить на вкладке Конструктор (Design) в левом верхнем углу: Чтобы сослаться на нужный элемент умной таблицы можно использовать следующие способы: Таблица1 – ссылка на все ячейки таблицы с данными, кроме строки заголовка (A2:C7). Таблица1[#Все] – ссылка на все ячейки таблицы вместе со строкой заголовка (A1:C7). Таблица1[Доходы] – ссылка на все ячейки столбца Доходы кроме строки заголовка (B2:B7). Таблица1[[#Все];[Доходы]] – ссылка на все ячейки столбца Доходы вместе со строкой заголовка (B1:B7). Таблица1[#Заголовки] – ссылка на строку заголовка (A1:C1). Если добавить к таблице еще один столбец для расчета прибыли, то в нем в ячейке D2 можно будет использовать универсальную формулу: Символ @ в данном контексте означает «возьми из этой же строки» и заставляет Excel автоматически каждый раз брать значения из соответствующих столбцов текущей строки. Умные таблицы отлично «дружат» как с обычными, так и с формулами массива, весьма упрощая и делая их более наглядными и понятными: 17 Мастер Формул www.PlanetaExcel.ru Главное же преимущество умных таблиц, как я уже упоминал, это автоподстройка размеров. Т.е. при добавлении новых строк или столбцов к таблице совершенно не потребуется корректировать наши формулы, т.к. в них используются имена столбцов, а не жестко зафиксированные в размерах диапазоны. 18 Мастер Формул www.PlanetaExcel.ru Именованные диапазоны Вместо привычных, но громоздких адресов ячеек а-ля морской бой, можно использовать компактные и понятные именованные диапазоны, т.е. давать ячейкам и диапазонам собственные имена. Классический способ их сделать - с помощью Диспетчера имен на вкладке Формулы (Formulas – Name Manager): Чтобы создать именованный диапазон, нажмите кнопку Создать (New), введите имя диапазона (без пробелов!) и выделите диапазон в строке Диапазон (Reference): Область действия именованного диапазона (текущий лист или вся книга) задается в выпадающем списке Область. После создания именованные диапазоны можно смело использовать в любых формулах (в т.ч. формулах массива), например: =СУММ(Статьи_расходов) или =ВПР(A1;Статьи_расходов;2;0) 19 Мастер Формул www.PlanetaExcel.ru Именованные диапазоны по определению являются абсолютными, т.е. не сдвигаются при копировании формул, в которых участвуют. Так, в приведенной выше формуле можно было бы использовать вместо имени Статьи_расходов адрес $A$1:$B$3 (но обязательно с долларами!). Еще один (самый быстрый) способ создать именованный диапазон – это выделить исходные ячейки и ввести имя диапазона вместо адреса в левой части строки формул: … и затем нажать на клавишу Enter. Единственный нюанс: если именованный диапазон с таким именем уже существует, то Excel не пересоздает его заново, а просто выделяет. Для замены или корректировки уже существующего диапазона придется открывать окно Диспетчера Имен с вкладки Формулы (Formulas – Name Manager). Также очень удобно, для последующего использования, давать имена целым столбцам (полям) в таблице, причем это можно делать автоматически. Если выделить диапазон и нажать на вкладке Формулы кнопку Создать из выделенного (Formulas – Create from Selection), то появится диалоговое окно: Если включить первый флажок В строке выше (Top row), то Excel автоматически присвоит каждому столбцу таблицы имя, взяв его из первой строки, т.е. A2:A7 будет называться Месяц, диапазон B2:B7 – Москва и т.д. Если при этом включить еще опцию В столбце слева (Left column), то аналогичная ситуация произойдет и по горизонтали: строка B2:D2 получит имя Январь, строка B3:D3 – Февраль и т.д. Единожды проведя такое именование, можно в будущем свободно использовать имена столбцов в любых формулах. Например, чтобы найти все апрельские продажи в Самаре, нужна будет формула: 20 Мастер Формул www.PlanetaExcel.ru =СУММЕСЛИ(Месяц;"Апрель";Самара) Забавный момент состоит в том, что если установить в Excel масштаб просмотра меньше 40% (ползунком в правом нижем углу или вращая колесико мыши с Ctrl), то Excel отобразит имена всех диапазонов прямо на листе: Красиво. И еще один не совсем очевидный с ходу трюк. Если создать именованный диапазон в Диспетчере Имен, но в поле Диапазон ввести не адрес, а значение (число, текст или формулу), то мы создадим именованную константу - имя, которое никуда не ссылается, но подразумевает под собой определенное значение: Впоследствии можно пользоваться такой константой как переменной в любых формулах и расчетах: =Цена*(1–НДС) 21 Мастер Формул www.PlanetaExcel.ru Подобным образом удобно задавать константы, которые редко меняются, но часто встречаются в ваших отчетах (ставки налогов и сборов, банковские проценты и т.д.). 22 Мастер Формул www.PlanetaExcel.ru Точное копирование формул без сдвига ссылок Предположим, что у нас есть вот такая несложная таблица, в которой подсчитываются суммы по каждому месяцу в двух городах, а затем итог переводится в евро по курсу из ячейки J2. Проблема в том, что если скопировать диапазон D2:D8 с формулами куда-нибудь в другое место на лист, то Microsoft Excel автоматически скорректирует ссылки в этих формулах, сдвинув их на новое место и перестав считать: Нам же хотелось скопировать диапазон с формулами так, чтобы формулы не изменились и остались теми же самыми, сохранив результаты расчета. Чтобы формулы при копировании не менялись, надо (временно) их деактивировать - сделать так, чтобы Excel перестал их рассматривать как формулы. Это можно сделать, заменив на время копирования знак "равно" (=) на любой другой символ, не встречающийся обычно в формулах, например, на "решетку" (#) или на пару амперсандов (&&). Для этого: 1. Выделяем диапазон с формулами (в нашем примере D2:D8). 2. Жмем Ctrl+H на клавиатуре или на вкладке Главная – Найти и выделить – Заменить (Home – Find & Select – Replace): 23 Мастер Формул www.PlanetaExcel.ru 3. В появившемся диалоговом окне вводим что ищем и на что заменяем и в Параметрах (Options) не забываем уточнить Область поиска – Формулы. Жмем Заменить все (Replace All). 4. Копируем получившийся диапазон с деактивированными формулами в нужное место: 5. Заменяем # на = обратно с помощью того же окна, возвращая функциональность формулам. 24 Выборочный подсчет по условиям Если вдуматься, то любой отчет практически в любой сфере бизнеса – это, по сути, выборочное суммирование или вычисления по условию. Microsoft Excel имеет много эффективных инструментов, позволяющих подобные операции делать автоматически: быстро, без ошибок и с автоматическим обновлением результатов при изменении исходных данных. В этой главе мы разберем: Как производить вычисления (сумму, среднее, количество) по одному или нескольким сложным условиям с помощью функций СУММЕСЛИ, СУММЕСЛИМН, БДСУММ и формул массива. Как вычислять по заданному «окну» (диапазону) на листе, если размеры «окна» заранее не известны. Как суммировать только видимые ячейки или ячейки через одну, две, три и т.д. Как суммировать ячейки по цвету без использования макросов с помощью недокументированных возможностей Microsoft Excel. Мастер Формул www.PlanetaExcel.ru Среднее без учета нулей и ошибок Исходные данные, с которыми нам приходится работать, часто несовершенны - «человеческий фактор» дает о себе знать. Одна ячейка с ошибкой или лишнее пустое или нулевое значение часто приводят к возникновению, по цепочке, ошибок в итоговых строках, столбцах, а затем и во всей таблице. Так, например, если нам необходимо рассчитать средний доход с клиента, то пустая или нулевая ячейка с количеством клиентов будет приводить к ошибкам в строках и невозможности вычислить общее итоговое среднее по всей таблице – мы получим ошибки деления на ноль: Для перехвата ошибки можно воспользоваться функцией ЕСЛИОШИБКА (IFERROR), которая заменит ошибку на пустое значение (пустые кавычки, а не ноль, из-за которого «просядет» общее среднее): 26 Мастер Формул www.PlanetaExcel.ru Выборочное суммирование одному условию Если нужно выборочно просуммировать данные из таблицы только по одному условию, то задача легко решается при помощи встроенной функции Excel СУММЕСЛИ (SUMIF) из категории Математические (Math&Trig). Предположим, нам надо просуммировать все сделки по Самаре в представленной таблице: У функции СУММЕСЛИ всего три аргумента: Диапазон проверяемых значений (столбец с названиями городов – A2:A12). Критерий – что мы ищем, т.е. Самара из D2. Диапазон суммирования (столбец с суммами, которые хотим сложить). Внимательный читатель уже заметил, наверное, что в 11-й строке таблицы нас подстерегают «грабли» - город записан с «г.» Чтобы обойти подобные проблемы, можно использовать спецсимволы подстановки: * (звездочка) – подменяет собой любое количество любых символов ? (вопросительный знак) – подменяет один любой символ Таким образом, чтобы учитывать любой вариант написания Самары, нужно приклеить к ячейке с критерием по одной звездочке перед и после с помощью символа сцепки (&): 27 Мастер Формул www.PlanetaExcel.ru При всей внешней простоте и прозрачности у функции СУММЕСЛИ есть и «темная сторона» - в некоторых случаях она может вычислять сумму по условию неправильно. Для примера взгляните вот на такой случай: Разница с предыдущим решением в том, что в качестве диапазона проверки выделен уже весь столбец (A:A), а не конкретный диапазон A2:A12, т.е. количество ячеек в проверяемом и суммируемом диапазонах уже не равно друг другу. Странно то, что в такой ситуации Excel выдает не ошибку (что было бы логично и объяснимо), а продолжает вычисления, отображая некорректный результат. Резюме: будьте осторожны с выделением диапазонов для функции СУММЕСЛИ (SUMIF). 28 Мастер Формул www.PlanetaExcel.ru Выборочное суммирование по нескольким условиям Если при вычислении суммы нужно проверять не одно, а сразу несколько условий, то функция СУММЕСЛИ (SUMIF) и ей подобные, к сожалению, не подойдут, т.к. умеют учитывать только один критерий. Давайте рассмотрим другие способы решения такой задачи. Способ 1. Функция СУММЕСЛИМН Начиная с версии Excel 2007 Microsoft добавила в Excel «старших сестер» функциям выборочного подсчета СУММЕСЛИ, СЧЁТЕСЛИ и СРЗНАЧЕСЛИ – функции СУММЕСЛИМН, СЧЁТЕСЛИМН и СРЗНАЧЕСЛИМН. В английском варианте эти функции выглядят как SUMIFS, COUNTIFS и AVERAGEIFS, т.е. имеют на конце букву -S, обозначающую в английском языке множественное число. В русской версии эту роль играет -МН. Эти функции отличаются от классических тем, что умеют проверять и учитывать при вычислениях уже не одно, а сразу несколько условий (если точно, то 127 включительно – хватит на все случаи жизни с большим запасом). Так, например, если нам нужно сложить все сделки менеджера Кузнецова по Самаре, то можно применить нашу функцию СУММЕСЛИМН (SUMIFS) следующим образом: Как видно из предыдущего скриншота, первым аргументом этой функции идет Диапазон_суммирования, т.е. те ячейки, которые мы фактически хотим складывать. Затем аргументы идут парами – диапазоны проверки и условия, которые в них должны выполняться. Обратите внимание на полосу прокрутки справа – она позволит добавить третью пару диапазон - условие, четвертую и т.д., если нужно. Хорошим примером использования функции СУММЕСЛИ с двумя условиями является создание с ее помощью упрощенного аналога сводной таблицы: 29 Мастер Формул www.PlanetaExcel.ru Достаточно ввести одну функцию СУММЕСЛИ в ячейку H4 и протянуть ее на весь диапазон H4:J8, чтобы все вычислить. Только не забудьте правильно закрепить диапазоны в формуле знаками $. Ну и на больших таблицах, конечно, такой способ может ощутимо тормозить – тогда лучше все-таки использовать сводные таблицы, поскольку они пересчитываются не в реальном времени, а только по запросу пользователя. Способ 2. Функция баз данных БДСУММ Если условий, по которым нужно провести выборочное суммирование, очень много, то можно воспользоваться другим подходом – функцией баз данных БДСУММ (DSUM). Единственным минусом в данном случае будет необходимость заранее создать мини-таблицу с условиями: Первый аргумент этой функции – таблица с исходными данными, второй – имя суммируемого поля (столбца), третий – таблица с условиями. Обратите внимание на следующие нюансы: Шапка таблицы условий может не совпадать один в один с шапкой таблицы данных, но названия столбцов должны быть абсолютно идентичны. Допускается дублирование столбцов (см. столбцы Дата), если по ним нужно задать больше одного условия. Условия в ячейках одной строки воспринимаются как связанные логическим И (AND). Например, в первой строке мы ищем сумму всех сделок Кузнецова в Москве, а во второй – всех сделок по Самаре в первом квартале 2014 года. 30 Мастер Формул www.PlanetaExcel.ru Условия, находящиеся в разных строках, Excel воспринимает как независимые, т.е. связанные логическим ИЛИ (OR). Таким образом, на выходе мы получим сумму всех сделок по каждой из строк: Результат = (Все сделки Кузнецова в Москве) + (Все сделки в 1 квартале 2014 по Самаре) + (Все сделки Пупкина на сумму больше 1 млн). Способ 3. Формула массива Для суммирования по нескольким условиям также можно использовать хитрую формулу массива с функцией СУММПРОИЗВ (SUMPRODUCT) и двойным бинарным отрицанием. Эта формула проверяет условия с помощью двух выражений (A5:A30=I14) и (B5:B30=K14), каждое из которых на выходе выдает набор значений ИСТИНА или ЛОЖЬ для каждой из проверяемых ячеек. Два знака «минус» перед каждой проверкой в скобках по науке мудрено называются «двойным бинарным отрицанием» и делают, по факту, очень простую вещь – дважды умножают содержимое скобок на -1. Такое умножение нужно для того, чтобы конвертировать логические значения ИСТИНА и ЛОЖЬ в 1 и 0 и получить из наших проверок в скобках наборы нулей и единиц. Это будет хорошо видно, если выделить по очереди оба условия проверки и нажать на клавишу F9: Затем эти наборы перемножаются функцией СУММПРОИЗВ друг на друга и на массив суммируемых значений (столбец Выручка). Таким образом, после всех этих операций «выживут» только те суммы, где оба условия дали ИСТИНУ, т.е. 1. Если хоть одно условие не выполнилось, то значение ЛОЖЬ по нему, превратившееся после двойного бинарного отрицания в ноль, обратит в ноль и сумму по этой строке. 31 Мастер Формул www.PlanetaExcel.ru Подсчет количества и суммы по условию с учетом регистра В обычном режиме функции СУММЕСЛИ, СЧЁТЕСЛИ и СРЗНАЧЕСЛИ и их братья-близнецы с -МН на конце нечувствительны к регистру, т.е. не различают строчные и прописные буквы. Если же необходимо выборочно подсчитывать с учетом регистра, то вместо них придется применить другую формулу: Формула в ячейке F2 подсчитывает количество ячеек в столбце A1:A8, содержащих слово Планета (причем именно с большой буквы, остальные – маленькие). Давайте разберем логику работы этой формулы поподробнее: Функция НАЙТИ(что_искать; где_искать) ищет заданную строку внутри другой строки и выдает порядковый номер символа, начиная с которого обнаружено вхождение. Так, например: =НАЙТИ("трон";"электронный") …выдаст в качестве результата число 5, т.к. слово «трон» встречается в слове «электронный» начиная с 5-й позиции. Для нас в данном случае критически важен один аспект работы этой функции – она чувствительна к регистру, в отличие от ее аналога – функции ПОИСК. В случае если искомый текст не найден, функция выдает на выходе ошибку #ЗНАЧ! (#VALUE!). Если выделить фрагмент нашей формулы с функцией НАЙТИ и нажать на клавиатуре F9, то мы наглядно увидим результат ее работы: Затем мы используем функцию ЕЧИСЛО (ISNUMBER), которая для чисел выдает в качестве результата логическое значение ИСТИНА, а для ошибок – соответственно ЛОЖЬ: 32 Мастер Формул www.PlanetaExcel.ru Чтобы превратить логические значения ЛОЖЬ и ИСТИНА в удобные для подсчета числа 1 и 0 соответственно, используем двойное бинарное отрицание или, говоря по-простому, двойное умножение на -1: И, наконец, используем функцию СУММПРОИЗВ (SUMPRODUCT), которая выполняет двойную функцию: вопервых, суммирует полученные вхождения-единички; и, во-вторых, позволяет ввести нашу формулу без сочетания Ctrl+Shift+Enter, хотя она, по сути, является формулой массива. Если же необходимо не просто подсчитать количество вхождений, а просуммировать какие-либо данные по условию с учетом регистра, то к нашей функции СУММПРОИЗВ просто добавится еще один аргумент – диапазон суммируемых значений: 33 Мастер Формул www.PlanetaExcel.ru Суммирование ячеек через одну, две, три и т.д. При особо изощренном дизайне таблиц периодически возникает необходимость выполнения математических действий над ячейками, расположенными не одним монолитным массивом, а через одну, две и т.д. Если решать проблему "в лоб", то придется вводить длинную формулу с перебором всех ячеек, т.к. сразу весь диапазон одним движением выделить не получится: Также можно попробовать применить штатную функцию СУММЕСЛИ (SUMIF), которая суммирует ячейки по условию: Первый аргумент этой функции - диапазон проверяемых ячеек, второй - критерий отбора (слово "Выручка"), третий - диапазон ячеек с числами для суммирования. Если же удобного отдельного столбца с признаком для выборочного суммирования с помощью встроенной функции СУММЕСЛИ (SUMIF) нет или значения в нем непостоянные (где-то "Выручка", а где-то "Revenue" и 34 Мастер Формул www.PlanetaExcel.ru т.д.), то можно написать формулу массива, которая будет проверять номер строки для каждой ячейки и суммировать только те из них, где номер четный, т.е. кратен двум. Давайте подробно разберем формулу в G2. "Читать" эту формулу лучше из середины наружу: Функция СТРОКА (ROW) выдает номер строки для каждой по очереди ячейки из диапазона B2:B15. Функция ОСТАТ (MOD) вычисляет остаток от деления каждого полученного номера строки на 2. Функция ЕСЛИ (IF) проверяет остаток, и если он равен нулю (т.е. номер строки четный, кратен 2), то выводит содержимое очередной ячейки или, в противном случае, не выводит ничего. И, наконец, функция СУММ (SUM) суммирует весь набор значений, которые выдает ЕСЛИ, т.е. суммирует каждое 2-е число в диапазоне. Если же нужно суммировать каждую третью, четвертую и т.д. ячейки, то изменяется только делитель номера строки: 35 Мастер Формул www.PlanetaExcel.ru В качестве альтернативы можно использовать функцию СУММПРОИЗВ (SUMPRODUCT), которая хоть и вводится уже как обычная функция (т.е. обходится без Ctrl+Shift+Enter), но работает по той же логике формулы массива: Или в англоязычном варианте: =SUMPRODUCT(--(MOD(ROW(C5:C20);4=1);C5:C20) Эта функция перемножает поэлементно два массива: Первый массив: --(ОСТАТ(СТРОКА(C5:C20);4)=1) – это результаты проверки остатков от деления номеров строк ячеек на 4. Чтобы преобразовать логические значения ИСТИНА и ЛОЖЬ, получившиеся в результате проверки формулой ОСТАТ(СТРОКА(C5:C20);4)=1, в единицы и нули, используется двойной минус – он равносилен двукратному умножению на -1, т.е. не меняет значения, но конвертирует ИСТИНУ в 1, а ЛОЖЬ в 0. Если выделить первый аргумент функции СУММПРОИЗВ в строке формул: … и нажать клавишу F9, то это станет хорошо видно: Второй массив: C5:C20 – все значения из столбца Сумма. Эти два массива попарно перемножаются друг на друга и все полученные произведения складываются. Таким образом, на выходе суммируются только строки с нужными номерами. Со столбцами ситуация совершенно аналогичная, но нужно использовать функцию СТОЛБЕЦ (COLUMN), а не СТРОКА (ROW): 36 Мастер Формул www.PlanetaExcel.ru Суммирование ячеек по диагонали Эта ситуация возникала в моей практике не так часто, но хотелось ее описать в этой книге, потому что она очень наглядно иллюстрирует мощь формул массива и их внутреннюю логику при обработке данных. Предположим, что у нас есть квадратный массив 10 на 10 ячеек, заполненный числами, и нам необходимо просуммировать ячейки, находящиеся на диагонали от левого верхнего до правого нижнего угла. Можно красиво решить подобную задачу с помощью изящной формулы массива: В англоязычном варианте это будет соответственно: {=SUM(A1:J10*(ROW(A1:J10)=COLUMN(A1:J10)))} Главная идея этой формулы в том, что у нужных нам ячеек номера строк и столбцов совпадают. Поэтому с помощью выражения (СТРОКА(A1:J10)=СТОЛБЕЦ(A1:J10) мы, по сути, последовательно проверяем каждую из 100 ячеек на предмет такого совпадения. В результате получим массив из 100 значений ИСТИНА или ЛОЖЬ, в случае совпадения или несовпадения соответственно. А затем этот массив умножается на исходный диапазон, причем ИСТИНУ Excel интерпретирует как 1, а ЛОЖЬ как 0, так что остаются в итоге только числа с диагонали, которые потом и суммирует функция СУММ. 37 Мастер Формул www.PlanetaExcel.ru Легко сообразить, что если таблица расположена в другом месте листа (не начиная с А1), то необходимо будет всего лишь ввести поправку на отступ в виде количества пустых строк и столбцов от начала листа до первой ячейки с данными: 38 Мастер Формул www.PlanetaExcel.ru Суммирование по «окну» на листе Иногда возникает необходимость просуммировать значения из определенного диапазона в таблице – своего рода «окна» заданного размера, расположенного в определенном месте на листе. Рассмотрим для примера калькулятор расчета стоимости проезда в пригородной электричке: Предполагается, что пользователь выбирает из выпадающих списков в ячейках G6 и G8 станции отправления и назначения, а в ячейке G10 автоматически должна вычисляться стоимость проезда. Другими словами, нужно рассчитать стоимость проезда, просуммировав числа в «окне» В8:В11, соответствующем выбранным перегонам между станциями. Для решения этой задачи, кроме банальной СУММ, нам потребуются всего две функции – ПОИСКПОЗ (MATCH) и СМЕЩ (OFFSET). Сначала определим порядковые номера строк для станций отправления и назначения с помощью функций ПОИСКПОЗ (MATCH): Теперь используем наш главный козырь – функцию СМЕЩ (OFFSET), которая умеет выдавать ссылку на заданный диапазон «окна». У этой функции пять аргументов: 1. 2. 3. 4. Стартовая ячейка (нужна как точка отсчета – обычно берут первую ячейку списка). Сдвиг окна вниз на А строк. Сдвиг вправо на B столбцов. Высота диапазона окна – C. 39 Мастер Формул www.PlanetaExcel.ru 5. Ширина диапазона окна – D. Если брать в качестве стартовой ячейки A4, то наше окно, выделенное на предыдущей иллюстрации, сдвинуто вниз на 4 строки, вправо – на 1 столбец и имеет размеры 4 строки × 1 столбец. Таким образом, финальная формула для расчета стоимости будет выглядеть как: Или в англоязычном варианте: =SUM(OFFSET(A4;H6+1;1;H8-H6;1)) Само собой, все вышеперечисленное можно уложить и в одну формулу, не используя промежуточных вычислений в ячейках H6 и H8, а вложив функции ПОИСКПОЗ прямо в СМЕЩ (я использовал сочетание Alt+Enter для переноса аргументов на разные строки для наглядности): =СУММ(СМЕЩ(A4; ПОИСКПОЗ(G6;A5:A51;0)+1; 1; ПОИСКПОЗ(G8;A5:A51;0)-ПОИСКПОЗ(G6;A5:A51;0); 1)) 40 Мастер Формул www.PlanetaExcel.ru Суммирование только видимых ячеек Если у нас имеется таблица, по которой должны считаться промежуточные или общие итоги, то важную роль играет, какой именно функцией они вычисляются, т.к. в таблице могут быть: Включены фильтры – надо ли учитывать в итогах только отфильтрованные данные или брать все? Скрыты некоторые строки – то же самое: нужно ли считать в итогах только видимые строки или все имеющиеся? Свернуты сгруппированные строки – аналогично. Промежуточные итоги внутри таблицы – если в таблице уже есть внутренние итоги, а мы считаем общий итог – не получится ли, что мы просуммируем уже имеющиеся итоги вместе с данными, получив задвоенные результаты? Ошибки в формулах – как повлияет на итоги наличие в таблице ошибок (#Н/Д, #ЗНАЧ, #ДЕЛ/0 и других)? Некоторые из приведенных ниже способов чувствительны к этим факторам, некоторые – нет. Это нужно учитывать при выполнении вычислений. СУММ (SUM) – тупо суммирует все в выделенном диапазоне без разбора, т.е. и скрытые строки в том числе. Если хотя бы в одной ячейке есть любая ошибка – перестает считать и тоже выдает ошибку на выходе. ПРОМЕЖУТОЧНЫЕ.ИТОГИ (SUBTOTALS) с кодом 9 – суммирует все видимые после фильтра ячейки. Игнорирует другие функции ПРОМЕЖУТОЧНЫЕ.ИТОГИ, которые могут считать внутренние подытоги в исходном диапазоне. ПРОМЕЖУТОЧНЫЕ.ИТОГИ (SUBTOTALS) с кодом 109 – суммирует все видимые после фильтра и группировки (или скрытия) ячейки. Также игнорирует функции ПРОМЕЖУТОЧНЫЕ.ИТОГИ, которые могут считать внутренние подытоги в исходном диапазоне. АГРЕГАТ (AGREGATE) – самая мощная функция, появившаяся в Office 2010, имеет множество опций по суммированию, которые можно указать вторым аргументом: 41 Мастер Формул www.PlanetaExcel.ru 42 Мастер Формул www.PlanetaExcel.ru Суммирование ячеек по цвету, шрифту, формату и т.д. Фильтровать и сортировать ячейки по цвету Microsoft Excel научился с 2007 версии, а вот суммировать до сих пор (2016 год, на момент написания этой книги) не умеет. Обычно этот недостаток восполняют с помощью нехитрых макросов, но если их использование по каким-либо причинам нежелательно, то можно попробовать обойтись и без них – только с помощью формул. Основная трудность здесь в том, что в Excel изначально не существует инструмента или функции для определения цвета заливки ячеек. Если бы мы смогли определить код цвета заливки нужных нам ячеек, то дальнейший подсчет свелся бы к банальному суммированию по условию с помощью уже знакомых нам функций СУММЕСЛИ (SUMIF), СУММЕСЛИМН (SUMIFS) и им подобных, которые мы подробно разбирали в предыдущих главах. Так что задача сводится, по сути, к созданию такой функции. Оживляем призрака Откройте вкладку Формулы (Formulas) и нажмите кнопку Диспетчер имен (Name Manager). Обычно при помощи этого диалогового окна создают и редактируют именованные диапазоны, которые затем можно использовать в формулах вместо обычных ссылок на ячейки в стиле «морской бой». Создайте новый диапазон, введите его имя (например, ЦветЯчейки) и вот такую формулу в поле Диапазон (Reference): =ПОЛУЧИТЬ.ЯЧЕЙКУ(63;ДВССЫЛ("RC[-1]";0)) В английском варианте это будет соответственно: =GET.CELL(63;INDIRECT("RC[-1]";0)) Несмотря на краткость, в этой формуле скрыто много нюансов. Давайте разберем ее по кусочкам: Функция ПОЛУЧИТЬ.ЯЧЕЙКУ (GET.CELL) – это очень древняя функция, появившаяся в Excel в начале девяностых годов, когда для создания макросов еще не использовали Visual Basic, а делали это на специальных листах (XL4 macro sheets). На данный момент в Excel уже не осталось упоминаний об этой и других подобных функциях в справке или Мастере Функций, но, на самом деле, Excel все еще умеет с ними работать (для обеспечения обратной совместимости). Этим мы и воспользуемся. В общем, эта функция выдает информацию о состоянии заданной ячейки и имеет следующий синтаксис: =ПОЛУЧИТЬ.ЯЧЕЙКУ(код_сведений; адрес_ячейки) Где первый аргумент – это число (1-66), которое определяет, какую именно информацию о ячейке нам нужно получить. Из наиболее полезных значений для него можно упомянуть: Код 6 7 Параметр ячейки Формула ячейки в текстовом виде Числовой формат ячейки в виде текста, например «Основной» или «ДД.ММ.ГГГГ» 43 Мастер Формул 9-12 14 17 18 19 20 21 22 28 29 33 53 62 63 66 www.PlanetaExcel.ru Тип линии, используемой для обрамления ячейки слева (9), справа (10), сверху (11) и снизу (12) Защищенная ячейка или нет Высота ячейки (в пунктах) Имя шрифта, применяемого для текста в ячейке Размер шрифта (в пунктах) Выделен ли текст в ячейке жирным Выделен ли текст в ячейке курсивом Подчеркнут ли текст в ячейке Уровень вложенности при группировке строк Уровень вложенности при группировке столбцов Включен ли в ячейке перенос по словам Содержимое ячейки, как оно выглядит на экране (с учетом разрядности и числового формата) Имя текущей книги и листа в виде «[Книга1.xlsx]Лист1» Код цвета заливки ячейки Имя текущей книги с расширением Как видно из приведенной выше таблицы, наш выбор тут 63 – код цвета заливки. Второй аргумент функции ПОЛУЧИТЬ.ЯЧЕЙКУ – это адрес ячейки, которую мы проверяем. Само собой, здесь можно не изощряться, а задать ссылку жестко, в виде стандартного адреса (A1, E4 и т.п.), но нам хотелось бы получить универсальный инструмент, способный определять цвет любой ячейки. Поэтому вместо адреса здесь используется функция ДВССЫЛ (INDIRECT), превращающая текст своего первого аргумента в живую ссылку. В режиме R1C1, когда столбцы на листе обозначаются не буквами, а цифрами, ссылка на соседнюю слева ячейку всегда выглядит как: Именно этот вариант мы и используем. Второй аргумент функции ДВССЫЛ, равный нулю, как раз уточняет, что адрес задан в режиме R1C1, а не в привычном «морском бое». Таким образом, на выходе мы получаем формулу, которая определяет цвет заливки ячейки слева от текущей. Применение на практике Использовать созданный инструмент очень просто. Выделите ячейку справа от залитой цветом и введите в нее знак «равно» и имя нашей формулы, а затем скопируйте ячейку вниз: 44 Мастер Формул www.PlanetaExcel.ru Теперь с помощью стандартных функций выборочного подсчета можно легко вычислить сумму, среднее или количество ячеек с определенным цветом: Естественно, подобным же образом можно подсчитывать ячейки не только по цвету заливки, но и по числовому формату, имени шрифта, выделению жирным и т.п., подставляя в нашу формулу вместо 63 другие коды параметров ячейки. Ложка дегтя У созданной нами формулы есть, к сожалению, и несколько заметных недостатков: В старых версиях Excel (до 2007 года) было только 56 цветов, поэтому наша функция умеет определять только их. В последних версиях Excel количество возможных оттенков заливки превышает 4 млн, поэтому наша функция может определять их не всегда корректно, например: 45 Мастер Формул www.PlanetaExcel.ru Хорошо видно, что ячейки A3 и A4 залиты разным цветом, но наша функция этого, к сожалению, не определяет. Вывод: если планируете использовать этот инструмент для суммирования по цвету, то лучше применять только базовую палитру цветов для заливки (лучше посмотреть ее «вживую» в оригинальных цветах в файле-примере к этой главе): Microsoft Excel не считает изменение цвета ячейки изменением данных и, как следствие, не запускает пересчет формул на листе. Поэтому, например, перекрашивание ячеек в столбце A не приведет к автоматическому изменению кодов заливки в столбце B. Для этого нужно либо ввести нашу формулу еще раз, либо нажать на клавиатуре сочетание клавиш Ctlr+Alt+F9, запускающее принудительный пересчет листа. Не забудьте в конце сохранить документ в формате с поддержкой макросов (XLSM), т.к. хоть в нашей книге и нет ни строчки кода на Visual Basic, но для Excel это уже формально макрофункция. 46 Мастер Формул www.PlanetaExcel.ru Суммирование чисел, написанных через дробь Это одна из реальных задач, с которой мне пришлось столкнуться недавно. Врачи в одной небольшой частной клинике вели учет пациентов вот в такой таблице: Как видно из картинки, число детских и взрослых пациентов записывалось в одну ячейку через дробь, а чтобы Excel не преобразовывал такие дроби в дату (3/5 в 3 мая и т.п.), для ячеек диапазона B3:F5 установили текстовый формат. Если оставить в стороне вопрос адекватности таблицы, то главной задачей становится подсчитать сумму чисел до и после дроби, т.е. общее число детей и взрослых среди пациентов. Сделать это, например, для ячейки G2 можно с помощью вот такой формулы массива: =СУММПРОИЗВ(--ЛЕВСИМВ(B3:F3;ПОИСК("/";B3:F3)-1)) В английской версии эта формула будет выглядеть как: =SUMPRODUCT(--LEFT(B3:F3;SEARCH("/";B3:F3)-1)) Давайте разберем ее логику: 1. ПОИСК("/";B3:F3) – ищет в каждой ячейке положение символа дроби. 2. ЛЕВСИМВ(B3:F3;ПОИСК("/";B3:F3)-1) – берет из каждой ячейки слева символы от начала строки до символа дроби. 3. Чтобы преобразовать полученные символы в число, перед функцией ЛЕВСИМВ стоят два минуса. Это равносильно двойному умножению на -1, что не меняет результат, но заставляет относиться к нему Excel как к числу (ведь умножать можно только числа!). 4. И, наконец, функция СУММПРОИЗВ суммирует получившиеся числа. В принципе, можно было бы использовать и обычное суммирование (т.е. функцию СУММ), но тогда пришлось бы вводить нашу формулу с помощью сочетания клавиш Ctrl+Shift+Enter. Для подсчета сумм чисел после дроби (взрослых) можно использовать похожую конструкцию, заменив только функцию ЛЕВСИМВ (LEFT) на ПСТР (MID) для извлечения данных начиная со следующего символа после дроби и до конца строки: 47 Поиск и подстановка Искать нужные значения по одному или нескольким (иногда очень сложным) критериям и подставлять найденное потом в другие таблицы – очень частая задача при анализе данных в Excel. В базовом варианте она решается известной функцией ВПР (VLOOKUP), но в очень многих чуть более сложных случаях эта функция пасует и приходится искать решение другими способами. В этой главе мы разберем: 12 секретов использования «легендарной» функции ВПР (VLOOKUP). Как реализовать двумерный поиск на листе и трехмерный поиск сразу по нескольким листам или таблицам. Как находить не только первое встретившееся значение при нескольких совпадениях. Как искать ближайшее (наименьшее, наибольшее) при неточном поиске. Как искать наиболее похожий текст при ошибках и опечатках в исходных данных. Мастер Формул www.PlanetaExcel.ru Секреты функции ВПР (VLOOKUP) Секреты – это та роскошь, которую мы себе больше позволить не можем. (Дэн Браун) Функция ВПР (VLOOKUP), наверное, одна из самых известных функций Excel. При правильном применении она способна сэкономить вам многие часы и миллионы нервных клеток. Если вы не использовали ее раньше, то эта глава станет настоящим откровением. Если уже применяли, то должны были замечать, то функция ВПР, порой, ведет себя весьма капризно, странно и неочевидно. Давайте разберем все ее явные и скрытые возможности. Стандартное использование В базовом варианте эта функция предназначена для поиска и подстановки данных из одной таблицы в другую по совпадению заданного параметра. У нее четыре аргумента: =ВПР(Искомое_значение; Массив; Номер_столбца; Интервальный_просмотр) … где: Искомое_значение – то, что мы ищем. Массив – диапазон ячеек, в первом столбце которого мы ищем искомое значение. Номер_столбца в массиве, из которого мы извлекаем результат. Интервальный_просмотр – точный (0) или приблизительный (1) поиск нужно использовать. Так, например, эта функция в ячейке B2 ищет название товара (из ячейки А2) в прайс-листе (диапазон D2:E7) и затем выдает из второго столбца (третий аргумент функции =2) прайс-листа найденную там в той же строке цену (56): Обратите внимание на абсолютные ссылки во втором аргументе функции (массиве). Они нужны, чтобы ссылка на прайс не соскользнула при копировании функции ВПР с первой ячейки B2 вниз. Символы подстановки При поиске с помощью ВПР можно использовать стандартные символы подстановки, как и в некоторых других функциях Excel, например СУММЕСЛИ, СЧЕТЕСЛИ и т.д. * (звездочка) – любое количество любых символов (в том числе и их полное отсутствие) ? (вопросительный знак) – один любой символ Так, например, если мы хотим искать в прайс-листе не точное совпадение, а те строки, которые просто содержат нужный нам текст, то можно подклеить к искомому значению (A2) символы звездочки перед и после с помощью оператора склеивания (&): 49 Мастер Формул www.PlanetaExcel.ru Само собой, подобный вариант предполагает отсутствие повторений: если в правой таблице есть, например, несколько разных типов вишни, то такая функция ВПР с символами подстановки выдаст просто первое совпадение, т.е. первую встретившуюся вишню. Интервальный просмотр Последний четвертый аргумент функции ВПР называется Интервальный просмотр (Range Lookup) и позволяет задать режим поиска, в котором ВПР должна работать – точный или приблизительный. Это логический параметр, т.е. он может принимать два возможных значения: 0 или ЛОЖЬ – интервальный просмотр выключен (поиск точного совпадения) 1 или ИСТИНА – интервальный просмотр включен (поиск приблизительного совпадения) В подавляющем большинстве случаев используется точный поиск: если в прайс-листе найдется точное совпадение названия товара, то функция выведет его цену. В противном случае мы получим ошибку #Н/Д: Интервальный просмотр используется гораздо реже – обычно в двух типовых случаях. Во-первых, при поиске не текста, а чисел ВПР в режиме приблизительного поиска находит ближайшее наименьшее число. Это очень удобно при проверке попадания исходного числового значения в один из нескольких интервалов. Например, когда процент скидки ступенчато зависит от количества купленного товара: 50 Мастер Формул www.PlanetaExcel.ru Точно так же можно приблизительно искать и даты, т.к. они в Microsoft Excel представляют собой числа. Во-вторых, ВПР в режиме интервального просмотра ищет гораздо быстрее – в зависимости от конструкции таблиц ускорение может составлять 10 и более раз! Поэтому при связывании большого количества крупных таблиц имеет смысл включать Интервальный просмотр = 1. При этом важно помнить два щекотливых момента: При использовании приблизительного поиска таблица, в которой производится поиск (прайс), должна быть обязательно отсортирована по возрастанию по столбцу наименования. Если вы используете точный поиск, то сортировка роли не играет, а для интервального просмотра она принципиальна. Если вы ищете не числа, а текст и искомое значение отсутствует в таблице, то при точном поиске ВПР выдаст просто ошибку #Н/Д, а при приблизительном – значение фактически «с потолка», т.к. будет искать товар с ближайшими наименьшими кодами символов из его названия. Перехват ошибок #Н/Д Если функция ВПР не находит точного совпадения или искомого объекта просто пока нет в таблице, то она выдает ошибку #Н/Д. Иногда это не очень удобно, т.к. такие ошибки потом порождают ошибки в итогах, попадают в распечатку и т.д. Можно легко перехватить ошибки и заменить их на любое другое подходящее значение (например, на ноль) с помощью функции ЕСЛИОШИБКА (IFERROR): У этой функции два аргумента: 1. Проверяемая формула, выражение или ячейка (наша ВПР в данном случае). 2. Значение, которое надо вывести, если в первом аргументе возникает любая ошибка (0). Если ошибки не будет, то функция просто выведет результат работы ВПР. 51 Мастер Формул www.PlanetaExcel.ru Левый ВПР Как многим известно, функция ВПР (VLOOKUP) может выдавать в качестве результата значения, которые находятся строго правее того столбца, где производится поиск. Это обусловлено тем, что третий аргумент функции, который задает номер столбца результатов, не может быть отрицательным. На практике же сплошь и рядом возникают ситуации, когда искать данные надо в столбце, который находится правее, а не левее столбца результатов, например: На моих тренингах я слышу такой вопрос регулярно в формулировке: «А как сделать левый ВПР?» Способ 1. ВПР и ВЫБОР В любой версии Microsoft Excel есть штатная функция ВЫБОР (CHOOSE). Основное ее предназначение – выбирать нужный элемент из списка по заданному номеру. Ее, например, можно использовать для замены номера дня недели на его текстовый аналог: Ничего сверхъестественного, на первый взгляд, но тут есть пара хитрых моментов. Во-первых, вместо текстовых названий выбираемых элементов списка можно использовать адреса диапазонов. И тогда функция вернет ссылку на выбранный диапазон. Так, например, формула: =ВЫБОР(2;A1:A10;D1:D10;B1:B10) … выдаст на выходе ссылку на второй указанный диапазон (D1:D10). Во-вторых, вместо простого одиночного номера извлекаемого элемента в первом аргументе функции ВЫБОР можно задать массив констант в фигурных скобках, например, так: =ВЫБОР({1;2};A1:A10;D1:D10;B1:B10) Тогда на выходе мы получим два первых диапазона (A1:A10 и D1:D10), склеенных в единое целое. И вот теперь все это можно вложить внутрь нашей ВПР, чтобы реализовать «левый поиск»: 52 Мастер Формул www.PlanetaExcel.ru По сути, функция ВЫБОР виртуально меняет местами наши столбцы прайс-листа, чтобы потом ВПР могла стандартно их обработать. Способ 2. ИНДЕКС и ПОИСКПОЗ Другой способ реализовать «левый ВПР» - это использовать связку функций ИНДЕКС (INDEX) и ПОИСКПОЗ (MATCH): Тут логика работы формулы немного другая. Функция ПОИСКПОЗ ищет порядковый номер ячейки со словом Бананы в столбце Товар (т.е. выдаст нам 4). Затем ИНДЕКС вытаскивает из столбца Цена ячейку с порядковым номером, который определила ПОИСКПОЗ, т.е. четвертое число – цену бананов. Способ 3. СУММЕСЛИ Еще один вариант – использовать вместо ВПР функцию выборочного суммирования СУММЕСЛИ (SUMIF). Технически эта функция предназначена не для выбора, а для суммирования чисел по условию. Но если товар встречается в прайс-листе только один раз (а обычно так и есть), то СУММЕСЛИ просто выдаст его цену. Диапазоны проверки условия и суммирования в этой функции задаются отдельно, так что ей будет все равно, что в нашей таблице они поменяны местами: 53 Мастер Формул www.PlanetaExcel.ru Важный нюанс этого способа состоит в том, что он подходит только для нахождения чисел, в то время как предыдущие способы могут извлекать данные любого типа. Несовпадение форматов Иногда причиной возникновения ошибок #Н/Д при использовании ВПР бывает несовпадение форматов данных. Обычно это встречается при поиске чисел, т.к. в Microsoft Excel число в ячейке может быть в двух принципиально разных состояниях – как число и как текст. Причем зачастую визуально их различить почти невозможно. Например, в исходной таблице числовой артикул в некоторых ячейках хранится в виде текста (иногда на таких ячейках видно пометку зеленым уголком), а в поисковой таблице – в виде числа (или наоборот): Можно, конечно, долго и тщательно зачищать исходные данные, а можно преобразовать формат «на лету» прямо в самой формуле. Для преобразования числа-как-текст в нормальное число можно использовать двойной минус или двойное бинарное отрицание. Фактически это то же самое, что два раза умножить число на -1. Само число при этом не изменится, но сам факт проведения математической операции преобразует данные в число: 54 Мастер Формул www.PlanetaExcel.ru Если же числа-как-текст у нас не в исходной (левой) таблице, а в поисковом диапазоне справа, то для обратного преобразования из числа в текст можно использовать похожую хитрость - подклеивать к числу пустую строку с помощью оператора склейки (&): Идея та же: приклеивание к данным пустой строки их не меняет, но сам факт проведения с числом чисто текстовой операции превращает число в текст. Просто и элегантно. Ну а если в обеих таблицах творится полный ад и числовой и текстовый форматы беспорядочно перемешаны? Тогда можно скомбинировать оба приведенных способа, вложив функции ВПР внутрь функции ЕСЛИОШИБКА (IFERROR): Другой способ: использовать формулу массива с функциями ИНДЕКС (INDEX) и ПОИСКПОЗ (MATCH), которая будет в обеих таблицах все сначала принудительно приводить к текстовому формату, а потом уже производить поиск нужной цены: 55 Мастер Формул www.PlanetaExcel.ru Не забудьте после ввода этой формулы в ячейку нажать сочетание клавиш Ctrl+Shift+Enter, чтобы ввести ее как формулу массива. Непечатаемые символы и лишние пробелы Иногда причиной возникновения проблем при поиске с ВПР бывают лишние пробелы «для красоты» поставленные другими пользователями либо невидимые непечатаемые символы, попадающие в наши таблицы из внешнего мира (при копировании данных из Word, интернета, 1С и т.д.). Для борьбы с ними можно использовать функции СЖПРОБЕЛЫ (TRIM) и ПЕЧСИМВ (CLEAR): В английской версии эта формула будет выглядеть как: =VLOOKUP(TRIM(CLEAN(A2));$D$2:$E$7;2;0) Функция СЖПРОБЕЛЫ убирает из исходного текста все лишние пробелы (начальные, концевые, двойныетройные и т.д.), оставляя только одиночные пробелы между словами. Функция ПЕЧСИМВ убирает из текста непечатаемые символы (например, невидимый символ переноса строки, появляющийся, когда мы используем сочетание Alt+Enter, чтобы разместить текст в ячейке в несколько строк). Вычисление номера столбца Третий аргумент функции ВПР – это номер столбца в поисковой таблице (прайс-листе), из которого необходимо извлечь найденное значение. Если таблица небольшая, то определить номер легко, но если прайс содержит десятки столбцов, да они еще и могут меняться местами с течением времени, то определять номер столбца лучше не вручную, а с помощью функции ПОИСКПОЗ (MATCH): 56 Мастер Формул www.PlanetaExcel.ru ПОИСКПОЗ ищет заданное значение (название столбца из B1) в определенном диапазоне (шапка прайс-листа) и выдает порядковый номер ячейки, где она это значение нашла, т.е. фактически номер столбца в прайсе, который называется Цена. Побочным эффектом от такого способа будет то, что при изменении текста в ячейке B1 со слова Цена на, например, Цена розн, функция ВПР автоматически будет выдавать уже оптовую цену из другой колонки и т.д. Поиск и подстановка с учетом регистра Все подстановочные функции Excel из категории Ссылки и массивы (Lookup and Reference), такие как ВПР (VLOOKUP), ГПР (HLOOKUP), ПОИСКПОЗ (MATCH), не учитывают регистр символов (т.е. разницу между прописными и строчными буквами) при поиске данных. Таким образом, при использовании, например, функции ВПР для поиска суммы, соответствующей клиенту с кодом Exo в данной таблице: … мы получим 8222, а не 3215, как изначально требовалось при точном совпадении. Если регистр необходимо учитывать, то функция ВПР не поможет и придется пойти другим путем. В Microsoft Excel есть встроенная функция СОВПАД (EXACT), которая проверяет идентичность двух текстовых строк (с учетом регистра) и выдает на выходе логическое значение ИСТИНА или ЛОЖЬ соответственно. Давайте добавим к нашей таблице временный вспомогательный столбец, где проверим точное совпадение с помощью этой функции: 57 Мастер Формул www.PlanetaExcel.ru Как и ожидалось, логическая ИСТИНА получилась там, где регистр совпадает с искомым значением один в один. Теперь используем функцию ПОИСКПОЗ (MATCH), чтобы найти порядковый номер строки с ИСТИНОЙ, и добавим функцию ИНДЕКС (INDEX), чтобы извлечь из столбца с суммами элемент с порядковым номером, который для нас перед этим нашла ПОИСКПОЗ: От вспомогательного столбца тоже можно избавиться, добавив проверку функцией СОВПАД прямо в нашу формулу. Только не забудьте ввести ее уже как формулу массива, т.е. с помощью Ctrl+Shift+Enter: Еще один вариант заключается в использовании функции ПРОСМОТР (LOOKUP): 58 Мастер Формул www.PlanetaExcel.ru Фрагмент формулы 1/СОВПАД(A2:A7;F2) проверяет точное совпадение с учетом регистра, как и раньше, но при этом дополнительно производится деление 1 на полученное значение ИСТИНА или ЛОЖЬ. Поскольку Excel интерпретирует ИСТИНУ как 1, а ЛОЖЬ как 0, то мы получаем в результате массив: Ошибки деления на ноль соответствуют несовпадениям, а числа – точному соответствию с искомым значением. Если совпадений несколько, то вместо 1 в массиве будут дроби. Затем функция ПРОСМОТР (LOOKUP) ищет ближайшее наименьшее к 2 число и выдает соответствующее ему по положению значение из массива C2:C7, т.е. нужную нам сумму. Особенно приятно, что эту формулу можно ввести уже как обычную (не формулу массива), т.е. без Ctrl+Shift+Enter. Использование «умных таблиц» в связке с ВПР Я уже упоминал про умные таблицы во второй главе этой книги, но стоит отдельно уточнить это еще раз в случае с функцией ВПР. Бывает очень удобно сначала преобразовать поисковую таблицу (прайс-лист) в «умную» с помощью команды Главная – Форматировать как таблицу (Home – Format as Table) и затем указать во втором аргументе функции ВПР имя созданной таблицы: В этом случае размеры таблицы нас уже не будут беспокоить в будущем – при добавлении новых товаров в прайс-лист, либо их удалении размеры «умной таблицы» подстроятся автоматически. Имя таблицы всегда можно посмотреть/изменить на вкладке Конструктор (Design), которая появится, если щелкнуть левой кнопкой мыши в любую ячейку созданной умной таблицы. 59 Мастер Формул www.PlanetaExcel.ru Извлечение сразу нескольких столбцов Изначально функция ВПР (VLOOKUP) может вытащить значение только из одного (указанного в третьем аргументе) столбца таблицы с данными. Иногда же возникает необходимость сделать это сразу для нескольких столбцов. Например, нужно извлечь и просуммировать все значения для второго квартала по каждому городу: Само собой, можно не изощряться, а решить задачу «в лоб», просто сделав три ячейки с ВПР, каждая из которых будет извлекать данные из своего столбца, а потом сложить получившиеся результаты. А можно использовать изящную формулу массива, подставив вместо номера столбца массив констант {5;6;7}. Тогда на выходе мы получим массив из трех значений-результатов, который потом и суммируем с помощью функции СУММ. В английской версии это будет: =SUM(VLOOKUP(A2;$D$2:$J$7;{5;6;7};0)) И не забудьте после ввода формулы нажать сочетание Ctrl+Shift+Enter, чтобы ввести ее как формулу массива. Сравнение быстродействия разных видов ВПР Скорость вычислений в приведенных выше способах весьма различается. Если в вашей таблице до 1000 строк, то по этому поводу можно особо не напрягаться. Если же в ваших списках число строк исчисляется десятками тысяч, то время ожидания пересчета листа может доходить до десятков секунд, что создает ощутимые неудобства в работе. Для тестирования я взял список товаров в 500 000 строк (слева), куда подставлялись цены из прайс-листа размером в 600 строк (справа): 60 Мастер Формул www.PlanetaExcel.ru Делалось по 3 повтора для вычислений для каждого способа, затем бралось среднее арифметическое время. Замер производился специальным макросом-таймером. Результаты получились следующие: Способ ВПР (Интервальный просмотр = 0) ВПР (Интервальный просмотр = 1) ВПР с ЕСЛИОШИБКА для перехвата #Н/Д ИНДЕКС и ПОИСКПОЗ вместо ВПР СУММЕСЛИ вместо ВПР «Левый ВПР» с ВЫБОР Длительность, сек 5,44 0,53 5,43 5,46 19,25 34,54 Конкретные числовые значения зависят от многих факторов (конфигурации ПК, версии Excel и т.д.) и большой роли не играют, но соотношение полученных результатов весьма показательно. Выводы можно сделать следующие: ВПР с включенным интервальным просмотром минимум на порядок быстрее любых других способов. Но при этом нужно помнить, что таблица, в которой производится поиск (прайс-лист в нашем примере), обязательно должна быть отсортирована по возрастанию. Также необходимо помнить, что если в прайсе не окажется какого-то из товаров, то ВПР с интервальным просмотром уже не выдаст ошибку #Н/Д, а подставит цену ближайшего похожего товара (что вряд ли хорошо). ВПР с точным поиском не отличается от связки ИНДЕКС+ПОИСКПОЗ по скорости. Но ИНДЕКС+ПОИСКПОЗ могут искать значения и левее ключевого столбца, в отличие от ВПР, которая выдает результаты только правее. Функция ЕСЛИОШИБКА, добавляемая к ВПР для перехвата ошибки #Н/Д практически не влияет на скорость. Экзотические способы поиска и подстановки типа ВПР+ВЫБОР или СУММЕСЛИ – самые медленные. Причем СУММЕСЛИ еще и работает только с числами. Лучше ими не увлекаться или заменять потом формулы на значения, чтобы ускорить пересчет книги. 61 Мастер Формул www.PlanetaExcel.ru Поиск по нескольким условиям Если нужно подставить данные из одной таблицы в другую по одному условию, то замечательно сгодится функция ВПР (VLOOKUP) или связка функций ПОИСКПОЗ+ИНДЕКС (MATCH+INDEX). Но что делать, если нужно найти и подставить данные не по одному, а по совпадению сразу нескольких параметров? Обычное решение, к которому приходит большинство пользователей в этом случае, – склеить нужные столбцы с помощью функции СЦЕПИТЬ (CONCATENATE) или символа &, чтобы получить необходимый уникальный столбец с ключом, по которому потом подтягивать данные классическим ВПР (VLOOKUP). Это, безусловно, вариант, но есть и другие способы – в частности, использовать формулы массива. Предположим, что нам нужно подставить в правую таблицу с рецептурой цены из базы данных по ингредиентам, причем каждый продукт определяется двумя параметрами – типом и наименованием: Для решения достаточно будет ввести в первую ячейку H4 и скопировать потом на весь столбец следующую формулу массива, состоящую из связки двух функций – ИНДЕКС и вложенной в нее ПОИСКПОЗ: =ИНДЕКС($C$4:$C$90;ПОИСКПОЗ(F4&G4;$A$4:$A$90&$B$4:$B$90;0)) Давайте разберем ее «по косточкам»: F4&G4 – склеивает содержимое двух ячеек с искомыми типом и наименованием, чтобы получить уникальный ключ «активыкофеин», по которому потом будет произведен поиск в базе ингредиентов; ПОИСКПОЗ(F4&G4;$A$4:$A$90&$B$4:$B$90;0) – ищет склеенный ключ «активыкофеин» в паре склеенных столбцов типа и наименования A4:A90&B4:B90 и выдает порядковый номер строки в базе, где наш ключ найдется, т.е. число 5; Функция ИНДЕКС выдает содержимое 5-й ячейки из столбца C4:C90, т.е. стоимость для связки «активыкофеин». Не забудьте после ввода формулы в ячейку H4 нажать сочетание клавиш Ctrl+Shift+Enter, т.к. это формула массива. Фигурные скобки дописывать руками не нужно – они добавятся автоматически. Затем формулу можно скопировать вниз на достаточное количество строк. Чтобы наша конструкция не выдавала ошибку #Н/Д на пустых строчках в рецептуре, можно воспользоваться функцией ЕСЛИОШИБКА (IFERROR), которая будет перехватывать #Н/Д и заменять на пустую строку: =ЕСЛИОШИБКА(ИНДЕКС($C$7:$C$97;ПОИСКПОЗ(F7&G7;$A$7:$A$97&$B$7:$B$97;0));"") 62 Мастер Формул www.PlanetaExcel.ru Двумерный поиск (ВПР 2D) Чем дальше, тем любопытственнее… (Макс Фрай) Функции ВПР (VLOOKUP) и ее горизонтальный аналог ГПР (HLOOKUP) ищут информацию только по одному параметру и в одномерном массиве - по строке или по столбцу. А если нам необходимо выбирать данные из двумерной таблицы по совпадению сразу двух параметров - и по строке и по столбцу одновременно? Предположим, что у нас имеется вот такой двумерный массив данных по городам и товарам: Пользователь вводит (или выбирает из выпадающих списков) в желтых ячейках нужный товар и город. В зеленой ячейке нам нужно формулой найти и вывести число из таблицы, соответствующее выбранным параметрам. Фактически мы хотим найти значение ячейки с пересечения определенной строки и столбца в таблице. В такой ситуации можно использовать два принципиально разных подхода. Способ 1. Функции ИНДЕКС и ПОИСКПОЗ Для наглядности разобьём задачу на три этапа. Во-первых, нам нужно определить номер строки, соответствующей выбранному пользователем в желтой ячейке J2 товару. Это поможет сделать функция ПОИСКПОЗ (MATCH) из категории Ссылки и массивы (Lookup and Reference). В частности, формула =ПОИСКПОЗ(J2;A2:A10;0) … даст нам нужный результат (для Яблока это будет число 6). Первый аргумент этой функции - искомое значение (Яблоко из желтой ячейки J2), второй - диапазон ячеек, где мы ищем товар (столбец с товарами в таблице - A2:A10), третий аргумент задает тип поиска (0 - точное совпадение наименования). Во-вторых, совершенно аналогичным способом мы должны определить порядковый номер столбца в таблице с нужным нам городом. Функция =ПОИСКПОЗ(J3;B1:F1;0) сделает это и выдаст, например, для Киева, выбранного пользователем в желтой ячейке J3, значение 4. И, наконец, в-третьих, нам нужна функция, которая умеет выдавать содержимое ячейки из таблицы по номеру строки и столбца - функция ИНДЕКС (INDEX) из той же категории Ссылки и массивы (Lookup and Reference). 63 Мастер Формул www.PlanetaExcel.ru Первый аргумент этой функции - диапазон ячеек (в нашем случае это вся таблица, т.е. B2:F10), второй - номер строки, третий - номер столбца (а их мы определили выше с помощью функций ПОИСКПОЗ). Итого, соединяя все вышеперечисленное в одну формулу, получаем для зеленой ячейки решение: =ИНДЕКС(B2:F10;ПОИСКПОЗ(J2;A2:A10;0);ПОИСКПОЗ(J3;B1:F1;0)) или в английском варианте =INDEX(B2:F10;MATCH(J2;A2:A10;0);MATCH(J3;B1:F1;0)). Способ 2. Пересечение именованных диапазонов Этот способ гораздо экзотичнее и не так универсален, как первый, но тоже по-своему красив. Суть его заключается в том, что мы дадим имена товаров и городов нашим строкам и столбцам и будем искать пересечение двух именованных диапазонов – нужного товара и города. Для начала выделим весь наш диапазон с данными и подписями к ним, т.е. A1:F10. Затем на вкладке Формулы (Formulas) выберем команду Создать из выделенного (Create from selection) и в открывшемся окне включим флажки В строке выше (Top row) и В столбце слева (Left column): После нажатия на ОК Excel автоматически присвоит каждому столбцу имя, взяв его из верхней строки, и каждой строке – взяв его из левого столбца. Например, диапазон B2:B10 будет называться Москва, D2:D10 – Самара, B2:F2 – Банан и т.д. Увидеть все созданные имена можно в Диспетчере имен на вкладке Формулы (Formulas – Name Manager): 64 Мастер Формул www.PlanetaExcel.ru А дальше начинается самое интересное. Что вы знаете о пробеле? Да-да, тот самый пробел. Длинная клавиша на клавиатуре. На самом деле, в Microsoft Excel он играет не только роль привычного разделителя между словами. Пробел, если его использовать в формуле, может выполнять роль оператора пересечения диапазонов. Например, вот такая формула: … выдаст нам в качестве результата число 13 – содержимое пересечения вертикального и горизонтального диапазонов B7:F7 и E2:E10. Теперь осталось подменить фиксированные диапазоны на именованные, взяв их названия из ячеек J2 и J3: 65 Мастер Формул www.PlanetaExcel.ru Функция ДВССЫЛ (INDIRECT) нужна, чтобы преобразовать текстовые названия именованных диапазонов в настоящие ссылки. 66 Мастер Формул www.PlanetaExcel.ru Трехмерный поиск сразу по нескольким листам (ВПР 3D) Продолжая развивать идею предыдущего пункта, давайте рассмотрим решение задачи поиска не в двух, а в трех измерениях, когда к нахождению нужной строки и столбца добавляется еще и лист. Рассмотрим следующий пример. Допустим, у нас есть несколько листов по городам с данными продаж по товарам и магазинам: Причем в таблицах товары и магазины перемешаны, т.е. их последовательность различается. Количество строк и столбцов тоже может быть разным. На отдельном листе создана форма ввода, куда пользователь с помощью выпадающих списков вводит желаемый город, товар и магазин в желтые ячейки D5, D7 и D9: 67 Мастер Формул www.PlanetaExcel.ru Содержимое выпадающих списков автоматически подгружается из трех таблиц справа. Необходимо в зеленой ячейке D11 получить сумму, соответствующую заданному товару и магазину, причем с нужного листа. Для решения нам потребуется всего три функции: ПОИСКПОЗ (MATCH), ИНДЕКС (INDEX) и ДВССЫЛ (INDIRECT). ПОИСКПОЗ(искомое_значение; массив; тип_поиска) – ищет заданное значение в диапазоне (строка или столбец) и выдает порядковый номер ячейки, где оно было найдено. Нам эта функция поможет найти порядковые номера строки и столбца в таблице, где расположено нужное число. Для примера, формула: =ПОИСКПОЗ("Альфа";A2:G1;0) … вычислит номер столбца в таблице, где расположен столбец Альфа. Последний аргумент этой функции (0) означает, что нам нужен точный поиск. ИНДЕКС(диапазон; номер_строки; номер_столбца) – выбирает значение из диапазона по номеру строки и столбца. Так, например, формула: =ИНДЕКС(B2:G9;3;2) … выдаст нам содержимое ячейки в 3-й строке 2-го столбца из диапазона B2:G9. ДВССЫЛ(адрес_как_текст) – превращает адресную строку в виде текста в настоящий адрес. Причем адрес запросто может склеиваться из фрагментов с помощью оператора сцепки &. Например, формула: =ДВССЫЛ(A1&"!B3") … берет имя листа из ячейки A1, приклеивает к нему восклицательный знак-разделитель и адрес ячейки B3. Если в ячейке A1 будет лежать слово Москва, то на выходе мы получим ссылку Москва!B3, т.е. содержимое ячейки B3 с листа Москва. Теперь сводим все в единое целое для решения нашей задачи (я использовал сочетание клавиш Alt+Enter, чтобы разнести аргументы нашей формулы на разные строки для наглядности): =ИНДЕКС(ДВССЫЛ(D5&"!B2:G9"); ПОИСКПОЗ(D7;ДВССЫЛ(D5&"!A2:A9");0); ПОИСКПОЗ(D9;ДВССЫЛ(D5&"!B1:G1");0)) Единственный оставшийся нюанс в том, что по синтаксису Excel, если в именах листов есть пробел, то их нужно дополнительно заключать в апострофы (одинарные кавычки), т.е. ссылка на ячейку A1 на листе Нижний Новгород, например, должна выглядеть так: =’Нижний Новгород’!A1 Таким образом, для универсальности нужно добавить апострофы и к нашей формуле: 68 Мастер Формул www.PlanetaExcel.ru В английской версии наша формула будет выглядеть аналогично: =INDEX(INDIRECT("'"&D5&"'!B2:G9"); MATCH(D7;INDIRECT("'"&D5&"'!A2:A9");0); MATCH(D9;INDIRECT("'"&D5&"'!B1:G1");0)) 69 Мастер Формул www.PlanetaExcel.ru Поиск данных в нескольких таблицах — У девушки небольшой беспорядок. — Да формула Мандельброта всего лишь кучка цифр, если это небольшой беспорядок! (Шелдон, The Big Bang Theory) По аналогии с поиском на нескольких листах давайте разберем поиск нужных данных, когда они разделены на несколько таблиц. Принципиально важным моментом здесь будет - одинаковы ли эти таблицы по структуре или нет? Одинаковые таблицы Предположим, что у нас есть четыре однотипных по конструкции таблицы с данными по продажам товаров в трех странах (России=RU, Казахстане=KZ и Беларуси=BY): В трех ячейках на этом или любом другом листе задаются название товара, страны и номер квартала, и наша задача – найти в нужной таблице данные по продажам заданного товара в указанной стране. Для начала нам нужно найти два вспомогательных параметра: номер строки с требуемым товаром и номер столбца со страной. Для этого можно применить две функции ПОИСКПОЗ (MATCH), используя в качестве основы для поиска любую из наших таблиц, например четвертую: А затем в качестве «главного калибра» используем функцию ИНДЕКС (INDEX) – одну из самых многоликих функций Excel. Один из ее вариантов использования как раз и умеет извлекать данные из набора нескольких таблиц. Ее синтаксис таков: =ИНДЕКС((несколько_диапазонов);номер_строки; номер_столбца; номер_диапазона) Т.е. в нашем случае это будет: =ИНДЕКС((C4:E8;H4:J8;M4:O8;R4:T8);X3;X4;W5) Обратите внимание, что все поисковые диапазоны должны быть перечислены в скобках. Ну и, само собой, можно обойтись без вспомогательных ячеек X3 и X4, вставив функции ПОИСКПОЗ прямо внутрь нашей формулы: 70 Мастер Формул www.PlanetaExcel.ru Если использовать сочетание Alt+Enter, то можно удобно разделить аргументы функции ИНДЕКС по разным строчкам: =ИНДЕКС((C4:E8;H4:J8;M4:O8;R4:T8); ПОИСКПОЗ(W3;Q4:Q8;0); ПОИСКПОЗ(W4;R3:T3;0);W5) В английской версии это будет, соответственно: =INDEX((C4:E8;H4:J8;M4:O8;R4:T8); MATCH(W3;Q4:Q8;0); MATCH(W4;R3:T3;0);W5) Разные таблицы Продолжим разбором более сложного случая, когда таблицы, в которых нужно искать данные, не одинаковые по структуре и размеру: Обратите внимание, что: Одни и те же товары могут находиться в разных таблицах в разных строчках. То же самое со странами-столбцами. В 3-м и 4-м кварталах ассортимент товаров увеличился. Сначала дадим таблицам имена, т.е. создадим именованные диапазоны, которые на них указывают. Для этого нажмите на вкладке Формулы кнопку Диспетчер имен (Formulas – Name Manager) и создайте четыре именованных диапазона: Имя Ссылка Квартал1 Квартал2 Квартал3 Квартал4 B3:E8 G3:J8 L3:O9 Q3:T10 Как и в предыдущем случае, основой нашего решения будет функция ИНДЕКС, извлекающая данные из диапазона по номеру строки и столбца. Чтобы найти номер строки с нужным нам товаром, придется использовать вот такую формулу: 71 Мастер Формул www.PlanetaExcel.ru =ПОИСКПОЗ(W4;ИНДЕКС(ДВССЫЛ(W3);0;1);0) Разберем ее подробно, т.к. в ней скрыты два неочевидных, но принципиально важных момента. Во-первых, функция ДВССЫЛ(W3) в данном случае представляет собой ссылку на именованный диапазон 4-го квартала. Прямую ссылку на ячейку с именем W3 использовать нельзя, т.к. Excel будет воспринимать ее как текст. Чтобы превратить текст «Квартал4» в живую ссылку на именованный диапазон «Квартал4», и нужна функция ДВССЫЛ (INDIRECT). Во-вторых, фрагмент: ИНДЕКС(ДВССЫЛ(W3);0;1) … представляет собой ссылку на первый столбец именованного диапазона «Квартал4», т.е. на Q3:Q10. Как это получилось? Классический вариант использования функции ИНДЕКС на одной двумерной таблице, напомним, предполагает три аргумента: =ИНДЕКС(диапазон; номер_строки; номер_столбца) В этом случае мы получим содержимое ячейки в указанном диапазоне с пересечения строки и столбца с заданными номерами. Хитрость в том, что если номер строки равен 0, то ИНДЕКС выдает уже не содержимое ячейки, а ссылку на весь столбец с указанным номером, т.е. на первый столбец именованного диапазона заданного ДВССЫЛ(W3), т.е. на ячейки Q3:Q10. Ну а затем уже знакомая нам функция ПОИСКПОЗ (MATCH) ищет в этом диапазоне требуемый товар (Рис) и возвращает его позицию (4 строка, т.к. пустая Q3 тоже считается). Совершенно аналогично можно найти номер столбца с нужной страной: Только в этом случае нулю равен не номер строки, а номер столбца, чтобы получить ссылку на первую строку именованного диапазона «Квартал4», где затем функция ПОИСКПОЗ будет искать «BY». И, наконец, останется вытащить нужную нам сумму функцией ИНДЕКС: 72 Мастер Формул www.PlanetaExcel.ru Вот так. Не самая простая логика, но позволяет находить данные в любых разношерстных таблицах. Единственное условие: заголовки строк и столбцов (названия товаров и стран) должны быть идентичными во всех таблицах. 73 Мастер Формул www.PlanetaExcel.ru Поиск ближайшего числового значения В случае поиска среди числовых значений иногда возникает необходимость найти не точное, а ближайшее число, т.е. число, минимально отличающееся от искомого значения. Допустим, у нас имеется в наличии в прайс-листе несколько насосов разной номинальной мощности. К нам приходит покупатель со своим, требуемым по его проекту, значением мощности, под которое нужно подобрать подходящий насос. Если нет точного попадания в одну из моделей, то нужно будет подобрать максимально подходящую, но остается открытым вопрос округления. Давайте рассмотрим разные варианты решения этой задачи. Поиск ближайшего наименьшего Быстро найти ближайшее наименьшее число в массиве по отношению к искомому значению можно с помощью функции ВПР (VLOOKUP) с включенным приблизительным поиском, т.е. с четвертым аргументом Интервальный просмотр = 1 (Range Lookup). Таблица, в которой производится поиск, обязательно должна быть отсортирована по возрастанию по тому столбцу, где производится поиск, т.е. по мощности: Поиск ближайшего наибольшего Если нужно найти ближайшее наибольшее, чтобы гарантированно перекрыть требования по мощности, то можно использовать связку функций ИНДЕКС и ПОИСКПОЗ (INDEX и MATCH). В отличие от ВПР, функция ПОИСКПОЗ умеет искать не только ближайшее наименьшее, но и ближайшее наибольшее – для этого третий аргумент функции ПОИСКПОЗ, который называется Тип_сопоставления, нужно задать равным минус единице: 74 Мастер Формул www.PlanetaExcel.ru Функция ПОИСКПОЗ найдет порядковый номер строки в таблице с ближайшим наибольшим значением, а затем ИНДЕКС выведет это значение по номеру из столбца с мощностью. Также необходимо помнить, что таблица в этом случае должна быть обязательно отсортирована по убыванию мощности. Естественно, можно использовать этот способ и для поиска ближайшего наименьшего – достаточно заменить Тип_сопоставления с -1 на +1 и отсортировать таблицу по возрастанию. И выводить можно не само значение мощности из столбца B2:B13, а модель насоса из столбца A2:A13: Поиск ближайшего значения (точно) Если же нужно найти просто ближайшее значение к заданному, то придется немного «пошаманить». Для понимания сначала добавим справа от таблицы столбец, где вычислим разницу между мощностью каждой модели насоса и тем, что требуется клиенту: 75 Мастер Формул www.PlanetaExcel.ru Чтобы не учитывать знак, а брать разницу только по модулю, используется функция ABS. Самая подходящая модель будет той, где вычисленное отклонение минимально. Чтобы найти в добавленном столбце порядковый номер ячейки с наименьшим числом, можно использовать функцию ПОИСКПОЗ (MATCH): =ПОИСКПОЗ(МИН(C2:C13);C2:C13;0) И, наконец, извлечь ближайшее число из столбца мощности можно с помощью функции ИНДЕКС (INDEX), используя порядковый номер, который перед этим найдет ПОИСКПОЗ: =ИНДЕКС(B2:B13;ПОИСКПОЗ(МИН(C2:C13);C2:C13;0)) Всю описанную выше логику можно завернуть в одну формулу массива, чтобы не делать дополнительный столбец (я использовал сочетание клавиш Alt+Enter, чтобы разложить формулу на несколько строк для наглядности): {=ИНДЕКС(B2:B13; ПОИСКПОЗ(МИН(ABS(B2:B13-E2)); ABS(B2:B13-E2); 0))} 76 Мастер Формул www.PlanetaExcel.ru Сортировка таблицы при этом роли не играет. В английской версии эта формула будет: {=INDEX(B2:B13;MATCH(MIN(ABS(B2:B13-E2));ABS(B2:B13-E2);0))} Аналогично предыдущему способу можно немного изменить формулу, чтобы она находила не мощность, а модель насоса – достаточно подправить первый аргумент в функции ИНДЕКС на A2:A13. 77 Мастер Формул www.PlanetaExcel.ru Поиск последнего значения Как многим известно, функция ВПР (VLOOKUP) выводит первое встретившееся ей совпадение в таблице. Иногда же задача меняется на прямо противоположную – нужно найти, не первое, а последнее значение. Допустим, что у нас имеется таблица с продажами наших клиентов в хронологическом порядке. Причем покупать они могли несколько раз, т.е. фамилия клиента в списке запросто может повторяться. Нужно найти сумму последней покупки заданного клиента: Для понимания зайдем немного издалека. Добавим к нашей таблице еще один столбец справа с формулой, которая проверяет каждого клиента на предмет совпадения с нужным и выводит затем номер текущей строки: Если выбрать из получившегося столбца первое наибольшее число с помощью функции НАИБОЛЬШИЙ (LARGE), то мы получим как раз номер строки с последним вхождением нужного нам менеджера: 78 Мастер Формул www.PlanetaExcel.ru Теперь останется вытащить из столбца стоимости значение по полученному номеру строки с помощью функции ИНДЕКС (INDEX): Ну и, само собой, можно свернуть все вышеописанное в одну формулу массива, не используя вспомогательных столбцов и вычислений: 79 Мастер Формул www.PlanetaExcel.ru В английском Excel эта формула выглядела бы как: =INDEX(B2:B16;LARGE(IF(A2:A16=F4;ROW(A2:A16)-1);1)) Если таблица, в которой производится поиск, расположена начиная не с первой строки листа, то нашу формулу лучше немного скорректировать для универсальности, добавив отсчет номеров строк не с 1, а с первой ячейки таблицы: 80 Мастер Формул www.PlanetaExcel.ru Поиск сразу всех значений (МультиВПР) Чтобы найти иголку в стоге сена, достаточно сжечь сено и провести магнитом над пеплом. (Бернар Вербер) Функция ВПР (VLOOKUP) и ей подобные выдают при поиске только одно значение – первое найденное в списке соответствие. Зачастую же в списке нужный нам объект (например, товар) может встречаться несколько раз и хочется, чтобы на выходе мы видели сразу все найденные результаты, а не только первый. Функция ВПР с таким не справится, но для формул массива пределов возможного нет. Предположим, что у нас имеется вот такой список сделок по различным товарам: В ячейке F2 создан выпадающий список, из которого пользователь выбирает нужный товар (например, Киви). Нужно найти и вывести все суммы сделок по выбранному товару (на рисунке эти сделки подсвечены для наглядности). Чтобы решить задачу, для начала давайте найдем номера строк в таблице, где расположены сделки по Киви. Добавим к нашей таблице справа дополнительный столбец, где с помощью функций ЕСЛИ проверим товар и выведем номер строки в таблице, если это Киви: 81 Мастер Формул www.PlanetaExcel.ru В английской версии это было бы: =IF($F$2=A2;ROW(A2)-1) Из получившегося столбца нужно выбрать только числа – это может легко сделать функция НАИМЕНЬШИЙ (SMALL), которая выберет последовательно первое наименьшее число (3), потом второе наименьшее (11), затем третье (17) и т.д.: На ошибки #ЧИСЛО!, возникающие в лишних ячейках, куда мы протянули формулу «про запас», можно пока внимания не обращать – мы их потом скроем. 82 Мастер Формул www.PlanetaExcel.ru Теперь можно вытащить из столбца сумм нужные нам значения по их номерам с помощью функции ИНДЕКС (INDEX): Теперь свернем все описанные выше операции в одну формулу массива: Чтобы спрятать ошибку #ЧИСЛО!, возникающую, когда найденных значений меньше, чем формул, можно использовать функцию ЕСЛИОШИБКА (IFERROR). Она будет выводить пустую строку вместо ошибки: В английской версии наша формула будет выглядеть как: {=IFERROR(INDEX($B$2:$B$27;SMALL(IF($F$2=$A$27;ROW($A$2:$A$27)-1);F4));"")} 83 Мастер Формул www.PlanetaExcel.ru Поиск заданной последовательности в списке Предположим, что у нас есть хронологический список с городами, которые посещает наш водитель, доставляя товары. Также допустим, что «Москва» в этом списке означает возвращение на склад за новой партией товара. Задача: найти ближайший заказ, который водитель повезет из Москвы в Коломну, т.е., другими словами, найти первое вхождение последовательности Москва - Коломна в нашем списке: Как видно из предыдущей картинки, для решения потребуется всего одна знакомая нам уже функция ПОИСКПОЗ (MATCH), но в слегка непривычном варианте применения, а именно: Искомое значение – это два склеенных между собой города из ячеек E2 и E3. В качестве массива, где производится поиск, мы используем, опять же, два склеенных диапазона B2:B16 и B3:B17. На практике это даст нам массив попарно сцепленных значений городов, который можно легко увидеть, если выделить второй аргумент нашей функции в строке формул и нажать клавишу F9: Ну и поскольку обычные формулы не позволяют склеивать целые столбцы, то нашу функцию необходимо ввести как формулу массива, т.е. с использованием сочетания клавиш Ctrl+Shift+Enter. Легко сообразить, что подобным же образом можно искать вхождения и из трех элементов и более. 84 Мастер Формул www.PlanetaExcel.ru Подстановка из ниоткуда Фокусы — это, всего лишь, ловкость рук и никакого мошенства! (Поросенок Фунтик) Это несложный, но интересный прием, позволяющий подставлять данные из небольших таблиц без использования ячеек вообще. Его суть в том, что можно «зашить» массив подстановочных значений прямо в формулу, используя массивы констант или именованные диапазоны. Рассмотрим несколько способов это сделать. Функция ВЫБОР Если нужно подставить данные из одномерного массива по номеру, то можно использовать функцию ИНДЕКС (INDEX) или ее более простой и подходящий в данном случае аналог – функцию ВЫБОР (CHOOSE). Она выводит элемент массива по его порядковому номеру. Так, например, если нам нужно вывести название дня недели по его номеру, то можно использовать вот такую конструкцию: Аналогичным образом можно преобразовать и номер месяца в его название. Массив констант в формуле Предположим, что у нас есть список городов, куда с помощью функции ВПР (VLOOKUP) подставляются значения коэффициентов зарплаты из второго столбца желтой таблицы справа: Хитрость в том, что можно заменить ссылку на диапазон с таблицей $E$3:$F$5 массивом констант прямо в формуле, и правая таблица будет уже не нужна. Чтобы не вводить константы вручную, можно пойти на небольшую хитрость. Выделите любую пустую ячейку. Введите с клавиатуры знак «равно» и выделите диапазон с таблицей – в строке формул должен отобразиться его адрес: 85 Мастер Формул www.PlanetaExcel.ru Выделите с помощью мыши ссылку E3:F5 в строке формул и нажмите клавишу F9 – ссылка превратится в массив констант: Осталось скопировать получившийся массив и вставить его в нашу формулу с ВПР, а саму таблицу удалить за ненадобностью: Массив констант с именем Развивая идею предыдущего способа, можно попробовать еще один вариант – сделать именованный диапазон констант, который использовать затем в формуле. Для этого нажмите на вкладке Формулы (Formulas) кнопку Диспетчер Имен (Name Manager). Затем нажмите кнопку Создать, придумайте и введите имя (пусть будет, например, Города) и в поле Диапазон (Reference) вставьте скопированный в предыдущем способе массив констант: 86 Мастер Формул www.PlanetaExcel.ru Нажмите ОК и закройте Диспетчер имен. Теперь добавленное имя можно смело использовать на любом листе книги в любой формуле – например, в нашей функции ВПР: Компактно, красиво и можно использовать как один из способов защиты от непрофессионалов. Ну, а от профессионала не спасет ничего. 87 Мастер Формул www.PlanetaExcel.ru Поиск частичных текстовых совпадений А «обедня» — это то же, что и «обед»? (Альф) Очень часто (к сожалению!) встречаемая бизнес-задача в Microsoft Excel. Есть криво заполненный несколькими пользователями список клиентов, где одна и та же компания может быть введена несколько раз, но поразному: Нужно превратить «плохой» список в «хороший», найдя соответствие каждому нестандартному названию компании по таблице подстановки. Легко догадаться, что функции а-ля ВПР (VLOOKUP) тут не помогут, т.к. умеют искать только точные совпадения, а нам нужно, чтобы подстановка происходила, если требуемое ключевое слово из первого столбца таблицы подстановки содержится в элементе плохого списка (а не точно ему равно!). Чтобы выкрутиться в такой ситуации, можно использовать небольшую, но очень эффективную формулу массива, введенную в первую ячейку B2 и скопированную затем вниз на всю длину хорошего списка: Давайте разберем эту магическую формулу из B2 «по косточкам» на примере первой ячейки (B2): 88 Мастер Формул www.PlanetaExcel.ru Функция ПОИСК (FIND) ищет в ячейке A2 (а при копировании формулы вниз затем в А3, А4 и т.д.) каждый элемент из первого столбца таблицы подстановки. Если нашла, то выдает порядковый номер символа, начиная с которого искомый текст был обнаружен. В нашем случае это будет число 10, т.к. в строке «Компания Морозко ОАО» слово «Морозко» встречается начиная с 10-го символа. В случае если нужный текст не найден (для слов «Ромашка» и «Булкина»), функция ПОИСК выдаст ошибку #ЗНАЧ. Таким образом, на выходе функции ПОИСК мы получаем массив-столбец из числа и двух ошибок: {#ЗНАЧ!:10:#ЗНАЧ!}. Затем в дело вступает функция ПРОСМОТР (LOOKUP). Она похожа по принципу на известную ВПР (VLOOKUP). Ее синтаксис: =ПРОСМОТР(Искомое_значение; Просматриваемый_массив; Массив_результатов) Эта функция ищет заданное значение в Просматриваемом массиве, и если нашла, то выдает соответствующее ему значение из Массива результатов. Просматриваемый массив в нашем случае – это полученный на предыдущем шаге {#ЗНАЧ!:10:#ЗНАЧ!}, а Массив результатов – правильные названия компаний из второго столбца Таблицы подстановки. Поскольку функция ПРОСМОТР при поиске игнорирует ошибки #ЗНАЧ! и берет ближайшее наименьшее числовое значение, то мы можем искать любое заведомо большое число, например 2 15=32768, что равно максимальному количеству символов в ячейке листа Excel в принципе. Тогда ПРОСМОТР найдет в нашем входном массиве {#ЗНАЧ!:10:#ЗНАЧ!} ближайшее наименьшее к 32768 число 10 и выдаст второй элемент из массива результатов, т.е. для кривого «Компания Морозко ОАО» мы получим правильно-эталонное ОАО «Морозко». Шикарная формула, выручавшая меня не раз в реальных проектах. 89 Мастер Формул www.PlanetaExcel.ru Точный поиск с учетом регистра символов Все подстановочные функции Excel из категории Ссылки и массивы (Lookup and Reference), такие как ВПР (VLOOKUP), ГПР (HLOOKUP), ПОИСКПОЗ (MATCH), не учитывают регистр символов (т.е. разницу между прописными и строчными) при поиске данных. В большинстве случаев это не создает проблем, но иногда все же требуется именно полноценный точный поиск - с учетом регистра. Тогда при использовании, например, функции ВПР для поиска суммы, соответствующей клиенту с кодом aC7 в данной таблице: ...в итоге мы получим 90, а не 100 - ибо функция не видит разницы между aC7 и AC7 и выводит первое встретившееся значение из таблицы. Формула, которая нам нужна, выглядит следующим образом: Внутренняя логика ее работы следующая: Функция СОВПАД (EXACT) проверяет каждый код заказа из диапазона A2:A10 на предмет совпадения с F2 (с учетом регистра!) и выдает на выходе логическую ИСТИНУ или ЛОЖЬ как результат. {ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ} ИСТИНУ Excel интерпретирует как 1, а ЛОЖЬ как 0, поэтому массив превращается в: {0:0:0:0:0:0:0:1:0} 90 Мастер Формул www.PlanetaExcel.ru А затем элементы этого массива попарно умножаются на значения стоимости из диапазона B2:B10, т.е. {0:0:0:0:0:0:0:1:0} … умножается на: {31:96:98:21:90:74:26:100:33} … и мы получаем нули везде, кроме точного совпадения, т.е. {0:0:0:0:0:0:0:100:0} И, наконец, все элементы полученного массива суммируются с помощью функции СУММПРОИЗВ (SUMPRODUCT). Эта функция выполняет здесь двойную функцию. Во-первых, очевидно, суммирует, а вовторых, позволяет обойтись без ввода формулы массива обязательным сочетанием Ctrl+Shift+Enter. Благодаря СУММПРОИЗВ достаточно будет обычного Enter. Если же нужно извлекать не числа, а текст, то суммирование уже не подходит и формулу нужно будет немного изменить: Здесь функция ПОИСКПОЗ (MATCH) будет искать порядковый номер первого вхождения логической ИСТИНЫ (т.е. совпадения) в массиве результатов проверки функцией СОВПАД, а затем функция ИНДЕКС извлечет из столбца с именами клиентов нужного человека по вычисленному номеру. 91 Мастер Формул www.PlanetaExcel.ru Поиск первого или последнего значения в строке или столбце Кто не знает начала — не поймет и конца. (Грузинская пословица) Если таблица заполняется не монолитно и содержит внутри пустые ячейки, то иногда возникает необходимость извлечь из определенной строки или столбца первое или же последнее непустое значение. Решение в данном случае сильно будет зависеть от того, с чем мы имеем дело в таблице – с числами или с текстом. Давайте разберем оба варианта. Текст Допустим, что у нас имеется вот такой график командировок, где указано, кто из менеджеров в каком месяце в какой из наших филиалов поедет: Для нахождения первого имени в каждой строке можно использовать младшего брата общеизвестной функции ВПР (VLOOKUP) – функцию ГПР (HLOOKUP): Заметьте, что в качестве первого аргумента функции (искомого значения) указан символ звездочки в кавычках. Звездочка – символ подстановки, подразумевающий, что в этом месте может быть любое количество любых символов, т.е., другими словами, нам все равно, что будет в ячейке. К сожалению, такой подход не сработает, если в ячейке число (см. строчку с Ижевском), но с текстом он работает «на ура». Последнее текстовое значение в строке проще всего найти с помощью функции ПРОСМОТР (LOOKUP): 92 Мастер Формул www.PlanetaExcel.ru В английской версии это будет: =LOOKUP("яяяяяяя";B2:M2) Эта функция работает аналогично ВПР или ГПР, т.е. выполняет поиск заданного значения в указанном диапазоне (по строке – слева направо, по столбцу – сверху вниз). Причем если точного совпадения с искомым значением не было, то функция выдаст ближайшее наименьшее значение (это примерно как Интервальный просмотр =1 у функции ВПР, если вы понимаете, о чем я). Т.к. мы ищем не числа, а текст, то ПРОСМОТР будет работать вместо символов с их внутренним компьютерным представлением - кодами. Так, например, в стандартной кодировке английская заглавная буква «A» имеет код 65, а строчная русская «ж» - 230. Самый большой код 255 у последней буквы в алфавите - маленькой русской «я». Если ПРОСМОТР не найдет точного совпадения, то будет искать слово с ближайшими наименьшими кодами символов. Тогда если в качестве поисковой строки задать «слово» из нескольких букв «я», то любое другое нормальное слово или фраза будет «меньше». Таким образом, наша функция выдаст содержимое последней заполненной ячейки, чем бы оно ни было. Формально функция ПРОСМОТР устарела и оставлена в новых версиях Excel больше для совместимости, но в данном случае отлично выполняет свою задачу. Числа Что делать, если наша таблица содержит числовые данные и много пустых ячеек внутри? Последнее числовое значение можно легко найти, используя ту же логику, что и в предыдущем пункте, т.е. искать ближайшее наименьшее к заведомо большему, чем есть, числу с помощью функции ПРОСМОТР (LOOKUP): Перебирая в поисках совпадения все значения и не найдя точного соответствия, функция ПРОСМОТР выдаст последнее встретившееся число в строке. Если вы маньяк-астроном, считаете расстояния до звезд и не знаете даже примерно верхнего предела ваших данных, то можно использовать значение 9,999 999 999 999 99E+307, 93 Мастер Формул www.PlanetaExcel.ru т.е. 9,999 999 999 999 99*10307 - максимально возможное число, которое может обработать Microsoft Excel, его «потолок». Ну или любое число поменьше :) Другой весьма изящный способ найти последнее ненулевое значение в строке также использует функцию ПРОСМОТР, но в другом варианте: В данном случае функция ищет первый аргумент (число 2) в массиве дробей 1/(B2:M2) и выдает, при совпадении, соответствующий по номеру элемент из третьего аргумента – диапазона B2:M2. Логику хорошо видно, если выделить, например, второй аргумент нашей функции и нажать клавишу F9, чтобы увидеть, чему именно равен внутри Excel: При делении на пустую ячейку возникает ошибка деления на ноль #ДЕЛ/0. Если в ячейке есть числа, то в результате получается дробь меньше единицы. Если искать заведомо большее, чем любая получившаяся дробь, число 2, то ПРОСМОТР найдет последнее ненулевое значение и выдаст его нам. Единственное ощутимое отличие от предыдущей формулы состоит в том, что нулевые значения этот вариант не воспринимает и считает пустыми ячейкам (см. строку Москва). Иногда это хорошо, иногда плохо – по ситуации. Первое же непустое значение найти будет чуть сложнее: Давайте разберем эту формулу массива поподробнее: 1. Функция ЕПУСТО (ISBLANK) проверяет по очереди каждую из ячеек строки B2:M2, выдавая на выходе значения ИСТИНА (1) или ЛОЖЬ (0). 94 Мастер Формул www.PlanetaExcel.ru 2. Вычитая из единицы полученное значение, мы получим массив, где первая 1 будет соответствовать первой непустой ячейке в строке: 3. Функция ПОИСКПОЗ (MATCH) ищет позицию единицы в этом массиве, но, в отличие от ПРОСМОТР, останавливается после первого совпадения, т.е. выдаст число 4 – номер первой непустой ячейки. 4. Функция ИНДЕКС (INDEX) извлекает из диапазона B2:M2 значение с пересечения строки (1) и столбца (4) с заданными номерами. Не забудьте после ввода этой формулы нажать сочетание клавиш Ctrl+Shift+Enter, чтобы ввести ее как формулу массива. Обычные формулы так не умеют! Универсальный вариант Если же ваша таблица не чисто текстовая или числовая, а содержит числа и текст вперемешку, то придется думать над универсальным вариантом. Первое непустое значение в строке можно извлечь с помощью уже упоминавшейся в предыдущем пункте формулы массива – она для этого отлично подходит. А вот чтобы извлечь последнее непустое значение, придется «шаманить» вот с такой формулой массива: Логика ее работы следующая: 1. Формула C3:N3<>"" проверяет каждую ячейку диапазона C3:N3 на предмет пустоты. Для пустых ячеек выдается логическая ЛОЖЬ (или 0), для заполненных – логическая ИСТИНА (или 1). 2. Полученный набор нулей и единиц умножается на порядковый номер столбца в таблице, который получается вычитанием номера столбца для текущей ячейки из номера первого столбца в таблице формулой СТОЛБЕЦ(C3:N3)-СТОЛБЕЦ(B3). Таким образом, номера столбцов с пустыми ячейками будут умножаться на ноль и останутся только номера столбцов, где ячейки непустые: 95 Мастер Формул www.PlanetaExcel.ru 3. Затем функция МАКС (MAX) выбирает наибольший номер столбца, т.е. мы получаем номер последней заполненной ячейки в строке. Ну а потом функция ИНДЕКС (INDEX) извлекает по этому номеру содержимое ячейки. 96 Мастер Формул www.PlanetaExcel.ru Фильтрация формулами Нет ничего интереснее, чем пробовать новое. (Ганнибал Лектер) Классический Фильтр с вкладки Данные (Data – Filter) – безусловно, одна из самых востребованных и часто используемых возможностей Microsoft Excel при работе со списками. Однако встречаются ситуации, где хотелось бы проводить фильтрацию автоматически, т.е. при изменении исходных данных или критериев результаты отбора должны обновляться «на лету». Если не использовать для этого тяжелое оружие в виде макросов на VBA, то можно попробовать обойтись несколькими формулами. Допустим, что у нас есть диапазон с исходными данными (A3:D22), справа от него – критерии (J3 и L3), и в ячейках I8:L14 нужно получить результаты отбора (подсвечены в таблице условным форматированием для наглядности): Давайте рассмотрим два принципиально разных способа решения такой задачи. Способ 1. Без формул массива, но с дополнительным столбцом Добавим справа от таблицы исходных данных вспомогательный столбец, с помощью значений которого потом можно будет извлечь нужные нам строки. Введем в ячейку E4 и скопируем вниз следующую формулу: 97 Мастер Формул www.PlanetaExcel.ru Как легко сообразить, эта формула проверяет для каждой строки наши условия и выдает логическое значение ИСТИНА или ЛОЖЬ. Используется функция И (AND), а не ИЛИ (OR), т.к. нам важно, чтобы оба условия выполнялись одновременно. Теперь немного изменим нашу формулу в E4, добавив к ней функцию суммирования с предыдущей ячейкой в столбце: Технически Excel воспринимает логическое значение ЛОЖЬ как 0, а ИСТИНА - как 1. Поэтому мы получаем возрастающую последовательность чисел, которые увеличиваются на единицу на каждом совпадении с критериями. Другими словами, для каждой извлекаемой строки мы получаем уникальный номер, используя 98 Мастер Формул www.PlanetaExcel.ru который можно извлечь нужные нам данные. Это можно сделать буквально при помощи одной формулы, введенной в ячейку I8 и скопированной потом на весь диапазон результатов вправо и вниз: Давайте разберем ее подробнее: Функция ПОИСКПОЗ (MATCH) ищет первое вхождение номера строки в созданном нами вспомогательном столбце E и выдает порядковый номер ячейки, где она нашла совпадение (для строки 1 это будет 5). Функция ИНДЕКС (INDEX) извлекает из очередного столбца исходных данных содержимое ячейки с порядковым номером, который перед этим нашла функция ПОИСКПОЗ. Для пущей красоты можно скрыть ошибки #Н/Д, которые образуются в лишних строчках диапазона результатов. Для этого можно использовать, например, функцию перехвата ошибок ЕСЛИОШИБКА (IFERROR), которая заменит их на пустую строку: 99 Мастер Формул www.PlanetaExcel.ru Способ 2. Формулой массива без дополнительных столбцов Этот способ будет ощутимо сложнее, но не требует создания вспомогательного столбца. Для начала давайте найдем номера строк, которые нужно извлечь. Это можно сделать с помощью хитрой формулы массива, введенной в ячейку I8 и скопированной потом вниз на весь столбец: Давайте разберем ее пошагово. Сначала функция ЕСЛИ (IF) проверяет оба наши условия на столбцах Менеджер и Город: ЕСЛИ(($A$4:$A$22=$J$3)*($B$4:$B$22=$L$3) Каждое проверяемое выражение в скобках даст на выходе набор логических значений ИСТИНА или ЛОЖЬ. Первое условие: ($A$4:$A$22=$J$3) …превратится в: {ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ: ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ} А второе условие: ($B$4:$B$22=$L$3) …превратится в: {ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ:ИСТИНА:ЛО ЖЬ:ИСТИНА:ИСТИНА:ЛОЖЬ} Как я уже неоднократно упоминал ранее, Excel воспринимает ЛОЖЬ как ноль и ИСТИНУ как единицу. Так что перемножение этих двух массивов, в свою очередь, даст нам массив, где 1 будет соответствовать выполнению обоих условий (т.е. будет стоять в 5-й, 13-й и 18-й позиции). Это легко увидеть, если выделить этот фрагмент формулы и нажать на клавишу F9: 100 Мастер Формул www.PlanetaExcel.ru Если мы получаем 1, то вступает в дело функция СТРОКА (ROW), которая будет выдавать номер очередной строки за вычетом 3, т.к. наша таблица расположена на листе начиная с 3-й строчки. Таким образом, на выходе функции ЕСЛИ мы получим массив, где ЛОЖЬ соответствует ненужным строчкам, а для строк, которые надо отобрать, мы получаем их номер в таблице. Наконец, чтобы вытащить полученные номера (5,13 и 18) по порядку, мы используем функцию НАИМЕНЬШИЙ (SMALL). Эта функция выдает N-е по счету наименьшее значение из набора, т.е. для N=1 мы получим самое маленькое число, для N=2 – второе по счету наименьшее и т.д. Логические значения ЛОЖЬ эта функция игнорирует. Дальше все проще. Теперь, когда у нас есть порядковые номера нужных нам строк, можно извлечь нужные данные из таблицы при помощи все той же функции ИНДЕКС, как и в первом способе: Только не забудьте правильно расставить знаки $ для закрепления ссылок при копировании формулы. Ну и ошибки можно скрыть аналогичным образом – добавив функцию ЕСЛИОШИБКА (IFERROR) для перехвата #ЧИСЛО! и замены ее на пустую строку: 101 Мастер Формул www.PlanetaExcel.ru Формула получается, конечно, жутковатая, но задачу свою она выполняет. Единственный серьезный ее минус (кроме сложности) - это скорость. Формула массива из второго способа будет в 40-50 раз (!) медленнее считать, чем в варианте со вспомогательным столбцом из способа 1. На больших таблицах этот фактор может быть решающим. Для ускорения можно избавиться от медленной функции ЕСЛИОШИБКА (IFERROR), которая, на самом деле, ощутимо ухудшает быстродействие. Добавим одну вспомогательную ячейку, где с помощью штатной функции СЧЁТЕСЛИМН (COUNTIFS) посчитаем количество строк, которое должно получиться в результате: Теперь можно заменить медленную ЕСЛИОШИБКА, на гораздо более быструю ЕСЛИ, чтобы скрыть ошибки: Такой вариант формулы массива уже примерно в 5-6 раз быстрее, чем предыдущий. 102 Анализ предельных значений В бизнесе очень часто приходится выявлять и анализировать предельные значения: Товары, которые лучше всего продаются Лучших клиентов Искать наименьшую цену на товар/услугу на рынке среди поставщиков и т.д. Это можно делать разными способами, при наличии условий и ограничений и без. В этой главе мы разберем: Как быстро находить наименьшие и наибольшие значения и выстраивать рейтинги с помощью функций НАИБОЛЬШИЙ и НАИМЕНЬШИЙ. Как искать максимальное и минимальное по одному или нескольким условиям. Как выявлять самые часто встречающиеся значения (для чисел и текста). Как выполнить частотный анализ данных одной формулой массива с функцией ЧАСТОТА. Мастер Формул www.PlanetaExcel.ru Выявление топовых значений Скорее всего вам известны простые функции МИН (MIN) и МАКС (MAX), позволяющие быстро найти минимальное или максимальное значение в таблице. Но что если нам требуется найти, например, не самое большое, а 2-е или 5-е значение в ТОПе? Здесь помогут функции НАИБОЛЬШИЙ (LARGE) и НАИМЕНЬШИЙ (SMALL). Синтаксис этих функций похож: НАИБОЛЬШИЙ(диапазон; позиция) НАИМЕНЬШИЙ(диапазон; позиция) Диапазон – диапазон ячеек с числами, которые мы проверяем. Позиция – целое число, представляющее собой позицию (ранг, номер в рейтинге) извлекаемого элемента. где Например, если у нас есть таблица с прибылями по товарам, то с помощью функции НАИБОЛЬШИЙ можно легко определить максимальное (первое в рейтинге) значение из диапазона прибыли (B2:B22), которое фактически будет тождественно формуле МАКС(B2:B22): Аналогичным образом, функция =НАИБОЛЬШИЙ(B2:B22;2) … выдаст следующее за ним максимальное (2-е в рейтинге) и т.д. Что интересно, аргумент Позиция может быть не просто числом. Так, например, для получения суммы первых трех максимальных значений в диапазоне можно использовать формулу массива с прописанным внутри массивом констант для первых трех позиций (сочетание Ctrl+Shift+Enter в конце можно не нажимать): 104 Мастер Формул www.PlanetaExcel.ru Если же нам нужно извлечь не числовые значения, а соответствующие им названия товаров (имена клиентов), то придется использовать более сложную конструкцию, похожую на разобранный ранее пример с «левым ВПР» (я использовал перенос строк с помощью Alt+Enter для наглядности): {=ИНДЕКС($A$5:$A$25; ПОИСКПОЗ(НАИБОЛЬШИЙ($B$5:$B$25;G10); $B$5:$B$25; 0))} В английской версии это будет: {=INDEX($A$5:$A$25;MATCH(LARGE($B$5:$B$25;G10);$B$5:$B$25;0))} Разберем эту формулу по частям: НАИБОЛЬШИЙ($B$5:$B$25;G10) – ищет наибольшее значение с заданным рейтингом (1) в столбце Прибыль. ПОИСКПОЗ(НАИБОЛЬШИЙ($B$5:$B$25;G10);$B$5:$B$25;0) – определяет порядковый номер ячейки в столбце Прибыль, где лежит наибольшее значение (это будет число 17, т.к. наибольшее значение 9539 лежит в 17-й по счету ячейке в столбце Прибыль). ИНДЕКС($A$5:$A$25;ПОИСКПОЗ(НАИБОЛЬШИЙ($B$5:$B$25;G10);$B$5:$B$25;0)) – выдает содержимое 17-й ячейки из столбца Наименования, т.е. Мука. 105 Мастер Формул www.PlanetaExcel.ru Поиск минимального/максимального по условию В Microsoft Excel давно есть в стандартном наборе функции СЧЁТЕСЛИ (COUNTIF), СУММЕСЛИ (SUMIF) и СРЗНАЧЕСЛИ (AVERAGEIF) и их аналоги СЧЁТЕСЛИМН (COUNTIFS), СУММЕСЛИМН (SUMIFS) и СРЗНАЧЕСЛИМН (AVERAGEIFS), позволяющие искать количество, сумму и среднее в таблице по одному или нескольким условиям. Но только в июньском обновлении последней версии Microsoft Excel 2016 появились функции, которые умеют искать по условию максимум и минимум - они называются МАКСЕСЛИМН (MAXIFS) и МИНЕСЛИМН (MINIFS). Но что же делать, если у вас не последняя версия Excel? Чтобы обойти это ограничение и решить проблему, можно использовать небольшую формулу массива. Предположим, нам нужно найти минимальную цену для каждого товара в базе данных по поставщикам: В английской версии это будет соответственно {=MIN(IF(A7=$F$7:$F$34;$H$7:$H$34))} Разберем логику работы этой формулы. Функция ЕСЛИ проверяет каждую ячейку массива из столбца Товар (F7:F34) на предмет равенства текущему товару. Если это так, то выдается соответствующее ему значение из столбца Цена (H7:H34). В противном случае – логическое значение ЛОЖЬ, которое игнорируется потом функцией МИН. Для наглядности можно выделить мышью всю функцию ЕСЛИ(…) и нажать на клавиатуре F9, чтобы увидеть результирующий массив, из которого потом функция МИН и выбирает минимальное значение: 106 Мастер Формул www.PlanetaExcel.ru Если же нужно найти не только значение цены, но и название поставщика, то можно использовать уже не формулу массива, а простую связку функций ИНДЕКС-ПОИСКПОЗ (INDEX-MATCH), для реализации поиска минимальной цены в столбце H и вывода имени поставщика для нее из столбца левее: Функция ПОИСКПОЗ (MATCH) ищет порядковый номер ячейки в столбце Цена, где лежит найденная нами ранее минимальная цена, а функция ИНДЕКС (INDEX) выдает содержимое ячейки с этим номером из столбца Поставщик. Такая конструкция сработает, правда, только в том случае, если в столбце с ценами нет дубликатов, т.к. если будет существовать несколько одинаковых минимальных цен, то связка ИНДЕКС-ПОИСКПОЗ выдаст поставщика для первого попавшегося совпадения. Например, если в третьей строке базы данных по поставщикам будет число 127, то наша формула выдаст поставщика Кобальт, хотя его цена по чаю совсем не минимальная, но случайно с ней совпала. Чтобы исключить такую возможность, придется использовать более сложную формулу массива: 107 Мастер Формул www.PlanetaExcel.ru Она работает аналогично предыдущей, но ищет склеенную с помощью оператора конкатенации «&» пару Чай127 (A7&B7) в склеенных столбцах ТоварЦена ($F$7:$F$34&$H$7:$H$34). 108 Мастер Формул www.PlanetaExcel.ru Поиск минимального/максимального по нескольким условиям При поиске минимальных или максимальных значений по двум, трем и более условиям можно использовать конструкцию, похожую на предыдущий пример. Предположим, что у нас есть вот такая таблица с данными по продажам автомобилей: Чтобы найти, например, минимальную прибыль по KIA в Москве, можно использовать вот такую формулу: Она полностью аналогична разобранной в предыдущем пункте, за исключением того, что первым аргументом функции ЕСЛИ здесь служит не одно равенство, а перемножение двух проверок - модели машины и города: (D5:D28=L14)*(E5:E28=N14) Поскольку в данном случае Excel интерпретирует логическую ЛОЖЬ как 0, а ИСТИНУ как 1, то такое выражение даст на выходе попарное перемножение двух массивов нулей и единиц, так что на выходе единицы останутся только там, где продается именно KIA и именно в Москве: 109 Мастер Формул www.PlanetaExcel.ru И в итоге функция МИН будет выбирать минимальное не из всех значений, а только из отобранных функцией ЕСЛИ: Максимальное по условию можно найти совершенно аналогичным образом, просто заменив функцию МИН (MIN) на МАКС (MAX). Если условий для поиска совсем много, то, возможно, самым удобным вариантом окажется использование функций баз данных ДМИН (DMIN) и ДМАКС (DMAX). Эти функции очень похожи на функцию выборочного суммирования БДСУММ (DSUM), которую мы разбирали ранее: 110 Мастер Формул www.PlanetaExcel.ru Поиск самых часто встречающихся значений Иногда приходится искать в таблицах не самые большие, а наиболее часто встречающиеся значения. Применительно к магазину, это могут быть не самые дорогие, а самые часто покупаемые товары или самое часто встречающееся количество позиций в заказе. Иногда такую процедуру называют частотным анализом. В этом случае нужно по-разному решать задачу в зависимости от того, с чем мы имеем дело – с числами или с текстом. Поиск самых часто встречающихся чисел функцией МОДА Предположим, перед нами стоит задача проанализировать имеющиеся данные по продажам в магазине, с целью определить наиболее часто встречающееся количество купленных товаров. В нашем распоряжении имеется статистика в следующей таблице: Для определения самого часто встречающегося числа в диапазоне можно использовать функцию МОДА (MODE): Т.е., согласно нашей статистике, чаще всего покупатели приобретают 3 шт. товара. Если существует не одно, а сразу несколько значений, встречающихся одинаково максимальное количество раз (несколько мод), то для их выявления можно использовать функцию МОДА.НСК (MODE.MULT). Ее нужно вводить как формулу массива, т.е. выделить сразу несколько пустых ячеек, ввести в строку формул: =МОДА.НСК(B2:B100) … и нажать сочетание клавиш Ctrl+Shift+Enter. На выходе мы получим список всех мод из наших данных: 111 Мастер Формул www.PlanetaExcel.ru Т.е., судя по нашим данным, часто берут не только по 3, но и по 16 шт. товаров. Обратите внимание, что в наших данных только две моды (3 и 16), поэтому третья ячейка, выделенная «про запас», будет с ошибкой #Н/Д. Частотный анализ по диапазонам функцией ЧАСТОТА Если же нужно проанализировать не целые, а дробные числа, то правильнее будет оценивать не количество одинаковых значений, а попадание их в заданные диапазоны. Например, нам необходимо понять, какой вес чаще всего бывает у покупаемых товаров, чтобы правильно выбрать для магазина тележки и упаковочные пакеты подходящего размера. Другими словами, нам нужно определить, сколько чисел попадает в интервал 1..5 кг, сколько в интервал 5..10 кг и т.д. Для решения подобной задачи можно воспользоваться функцией ЧАСТОТА (FREQUENCY). Для нее нужно заранее подготовить ячейки с интересующими нас интервалами (карманами) и затем выделить пустой диапазон ячеек (G2:G5), по размеру на одну ячейку больший, чем диапазон карманов (F2:F4), и ввести ее как формулу массива, нажав в конце сочетание Ctrl+Shift+Enter: Поиск самого часто встречающегося текста Если мы имеем дело не с числами, а с текстом, то подход к решению будет принципиально другой. Предположим, что у нас есть таблица из 100 строк с данными о проданных в магазине товарах: 112 Мастер Формул www.PlanetaExcel.ru Нужно определить, какие товары покупались наиболее часто? Самым простым и очевидным решением будет добавить рядом столбец с функцией СЧЁТЕСЛИ (COUNTIF), чтобы подсчитать количество вхождений каждого товара в столбце А: Затем, само собой, отсортировать получившийся столбец по убыванию и посмотреть на первые строчки. Или же вместо всех перечисленных действий использовать небольшую формулу массива: Если использовать Alt+Enter для разнесения аргументов формулы на разные строки, то получится более наглядно: =ИНДЕКС(A2:A100; ПОИСКПОЗ(МАКС(СЧЁТЕСЛИ(A2:A100;A2:A100)); СЧЁТЕСЛИ(A2:A100;A2:A100); 0)) Давайте разберем ее по кусочкам: 113 Мастер Формул www.PlanetaExcel.ru СЧЁТЕСЛИ(A2:A100;A2:A100) – формула массива, которая ищет по очереди количество вхождений каждого товара в диапазоне A2:A100 и выдаст на выходе массив {2,18,17,1,19,13 и т.д.}, т.е. фактически заменяет собой дополнительный столбец. МАКС – находит в массиве вхождений {2,18,17,1,19,13 и т.д.} самое большое число, т.е. товар, который покупали чаще всего. ПОИСКПОЗ – вычисляет порядковый номер строки в таблице, где МАКС нашла самое большое число. ИНДЕКС – выдает из таблицы содержимое ячейки с номером, который нашла ПОИСКПОЗ. В англоязычном варианте наша формула будет выглядеть как: =INDEX(A2:A100; MATCH(MAX(COUNTIF(A2:A100;A2:A100)); COUNTIF(A2:A100;A2:A100); 0)) 114 Дубликаты и уникальные Есть ли повторы в моем списке? Сколько уникальных элементов в нем, на самом деле, содержится? Как их вывести отдельным списком? Похожие вопросы регулярно возникают, пожалуй, перед всеми пользователями Microsoft Excel. И если инструмент удаления дубликатов был добавлен, начиная с версии Excel 2007, то по остальным задачам придется импровизировать. В этой главе мы подробно разберем: Как при помощи формул массива быстро подсчитать количество уникальных элементов в списке. Как извлечь из большого списка набор уникальных значений без дубликатов. Как удалить дубликаты (формулами и без них) в наших таблицах. Мастер Формул www.PlanetaExcel.ru Подсчет количества уникальных значений в списке Одна из первых задач при работе с большими таблицами, содержащими повторы, – подсчет количества уникальных значений, которые присутствуют в списке. Это можно сделать разными способами, в зависимости от ситуации. Предположим, что у нас имеется вот такой список с повторяющимися в нем значениями: Легко заметить, что, на самом деле, в нем упоминается всего лишь 5 городов. Чтобы вычислить это количество, можно использовать простую, но красивую технику. Для понятности сначала добавим к нашей таблице еще один столбец с функцией СЧЁТЕСЛИ (COUNTIF), которая вычислит количество вхождений каждого элемента в общем списке: Теперь добавим рядом еще один столбец, где с помощью простой формулы вычислим значение обратной дроби 1/Число вхождений: 116 Мастер Формул www.PlanetaExcel.ru Если теперь просуммировать все значения по этому столбцу, то мы как раз и получим количество уникальных элементов в списке! Теперь, когда логика вычислений стала понятна, можно свернуть все вышеперечисленные действия в одну компактную формулу массива без дополнительных столбцов (не забудьте нажать Ctrl+Shift+Enter в конце): Если в диапазоне могут встречаться пустые ячейки, то нашу формулу придется немного модернизировать, т.к. на пустых ячейках будет возникать ошибка деления на ноль. С помощью функций ЕСЛИ (IF) и ЕПУСТО (ISBLANK) придется дополнительно проверять ячейку на заполненность: 117 Мастер Формул www.PlanetaExcel.ru В английской версии это будет, соответственно: {=SUM(IF(ISBLANK(A2:A15);0;1/COUNTIF(A2:A15;A2:A15)))} 118 Мастер Формул www.PlanetaExcel.ru Извлечение уникальных значений Продолжением предыдущего пункта является не подсчет количества, а извлечение уникальных элементов. Предположим, что у нас есть список, где каждое из значений может встречаться более одного раза, т.е. с повторениями: Легко заметить, что, как и в прошлом примере, в этом списке встречаются, на самом деле, всего лишь 5 городов (Тамбов, Воронеж, Калуга, Смоленск и Тверь) – их отдельным списком нам и нужно получить. Необходимое вступление Прежде чем рассматривать решение этой задачи с помощью формул, необходимо честно отметить, что во многих случаях другие способы могут оказаться удобнее и про них не стоит забывать. А именно: Удаление дубликатов. Вкладка Данные – Удалить дубликаты (Data – Remove Duplicates) удаляет из списка все повторы, оставляя только по одному вхождению каждого элемента. Плюс этого способа в очевидной простоте – не нужны формулы, а лишь два движения мышью. Минусы же в том, что мы удаляем элементы (это не всегда хорошо), и в том, что при изменении исходного списка придется заново повторять всю процедуру. Формулы для удаления дубликатов не самые простые и быстрые, но пересчитываются автоматически – иногда это принципиально важно. Сводная таблица. Если построить на основе исходного списка сводную таблицу (вкладка Вставка – Сводная таблица) и затем поместить поле Города в область строк, то мы также получим желаемое, т.к. сводная таблица всегда отображает список элементов без повторов: 119 Мастер Формул www.PlanetaExcel.ru При большом размере исходного списка этот способ может оказаться гораздо эффективнее, т.к. формулы (особенно формулы массива) пересчитываются относительно медленно. Отрицательный момент состоит в том, что сводные таблицы не пересчитываются автоматически и их придется вручную обновлять (щелчок правой кнопкой мыши по сводной – Обновить) при изменении исходных данных. Если же перечисленные выше способы вас не устраивают, то можно попробовать решить задачу удаления дубликатов с помощью формул. Способ 1. Вспомогательный столбец Для понимания зайдем немного издалека. Добавим к нашей таблице еще один столбец с функцией СЧЁТЕСЛИ (COUNTIF), которая будет подсчитывать порядковый номер вхождения очередного элемента: 120 Мастер Формул www.PlanetaExcel.ru Обратите внимание, что в адресе проверяемого диапазона ($A$1:A2) первая ссылка закреплена, а вторая – нет. Таким образом, при копировании формулы вниз на весь столбец будет выдаваться порядковый номер каждого города с начала списка. Среди полученных чисел нас интересуют первые вхождения, т.е. единички. Если мы сумеем отобрать все города, напротив которых 1, то успешно решим нашу задачу. Для этого немного модернизируем нашу предыдущую формулу: При помощи функции ЕСЛИ (IF) мы в ней проверяем номер вхождения и в случае, если он равен 1, выводим порядковый номер текущей строки в списке, полученный с помощью функции СТРОКА (ROW). Единицу из номера строки вычитаем, т.к. наша таблица содержит шапку и фактические данные начинаются со второй строчки. Если вхождение не первое, то ничего особого не делаем, и функция ЕСЛИ будет выдавать ЛОЖЬ (FALSE). Теперь сделаем рядом с нашим списком городов мини-табличку для вывода результатов с порядковыми номерами строк и извлечем туда номера из столбца В с помощью функции НАИМЕНЬШИЙ (SMALL): 121 Мастер Формул www.PlanetaExcel.ru Как мы уже разбирали ранее, эта функция выдает N-e по счету наименьшее число из списка (см. главу Анализ предельных значений). Таким образом, мы получаем последовательно по возрастанию все номера строк первых вхождений каждого города. Осталось с помощью функции ИНДЕКС (INDEX) извлечь названия городов из первого столбца по известным номерам строк: Для маскировки ошибок #ЧИСЛО, возникающих на избыточных ячейках, можно использовать классический способ их перехвата с помощью функции ЕСЛИОШИБКА (IFERROR) с заменой на пустую текстовую строку: 122 Мастер Формул www.PlanetaExcel.ru В английской версии: =IFERROR(INDEX($A$2:$A$13;SMALL($B$2:$B$13;E3));"") Если же принципиально хочется не использовать дополнительных столбцов и сделать все одной формулой, то придется пойти немного другим путем. Способ 2. Формула массива Чтобы понять главную идею, сначала добавьте к исходному списку еще один столбец с простой формулой: Функция ПОИСКПОЗ (MATCH) выдает порядковый номер заданного элемента в таблице. Если таких элементов несколько, то выдается номер первого из них. Т.к. наша таблица имеет шапку и данные начинаются со второй строки, то мы прибавляем дополнительную единичку. Обратите внимание на важный нюанс: результат работы этой формулы для первых вхождений каждого города совпадает с номером строки (подсвеченные ячейки). Этот момент и можно использовать в дальнейшем для извлечения уникальных значений. Добавим еще один столбец с проверкой на совпадение с номером строки с помощью функции ЕСЛИ (IF), чтобы вывести номера нужных нам строк: 123 Мастер Формул www.PlanetaExcel.ru По аналогии с предыдущим примером добавим рядом таблицу для результатов и используем функцию НАИМЕНЬШИЙ (SMALL), чтобы извлечь из столбца С номера строк по возрастанию: Теперь осталось вытащить названия городов из столбца А по известным номерам строк. Это можно сделать с помощью функции ИНДЕКС (INDEX): 124 Мастер Формул www.PlanetaExcel.ru Ну и, наконец, всю описанную выше логическую цепочку можно свернуть в одну формулу массива, чтобы не использовать вспомогательных столбцов (не забудьте нажать Ctrl+Shift+Enter): Если разнести аргументы на разные строки с помощью сочетания Alt+Enter, то станет нагляднее: {=ИНДЕКС($A$2:$A$13; НАИМЕНЬШИЙ(ЕСЛИ((ПОИСКПОЗ($A$2:$A$13;$A$2:$A$13;0)+1)=СТРОКА($A$2:$A$13); СТРОКА($A$2:$A$13)); E3)-1)} Опять же, если в списке могут встречаться пустые строки, то необходимо будет еще дополнительно добавить проверку с помощью функции ЕСЛИОШИБКА (IFERROR), т.к. функция ПОИСКПОЗ (MATCH) в нашей формуле будет выдавать #Н/Д: {=ИНДЕКС($A$2:$A$13; НАИМЕНЬШИЙ(ЕСЛИ((ЕСЛИОШИБКА(ПОИСКПОЗ($A$2:$A$13;$A$2:$A$13;0);0)+1)=СТРОКА($A$2:$A$13); СТРОКА($A$2:$A$13)); E3)-1)} Не самая приятная для ввода и весьма медленная формула, прямо скажем. Так что, особенно для больших таблиц, стоит рассмотреть альтернативные варианты со сводными таблицами или расширенным фильтром. 125 Мастер Формул www.PlanetaExcel.ru Удаление дубликатов Жизнь – это не кино. Дублей не будет. (Брюс Уиллис) Если в списке есть повторы, которые надо удалить, но не сдвигать при этом нижестоящие элементы вверх на освободившееся после удаления место, то можно воспользоваться относительно простой формулой: Все очень просто. Функция СЧЁТЕСЛИ (COUNTIF) подсчитывает количество вхождений очередного элемента списка, начиная с первой его ячейки. Если это количество = 1, т.е. элемент встретился первый раз, то мы выводим его в соседний столбец, иначе выводим пустую строку. В английской версии это будет: =IF(COUNTIF($A$1:A2;A2)=1;A2;"") 126 Сравнение списков Вопрос из Топ-10 на любом тренинге – «как сравнить два списка между собой?». Задача, с которой сталкивается абсолютно любой пользователь, а некоторые – не один раз в день. В этой главе мы разберем: Как быстро найти отличия-совпадения в двух таблицах и подсветить их цветом. Как определить, совпадают или нет два набора элементов. Если не совпадают, то как вывести отличия отдельным списком. Как выявлять совпадения в двух, трех и более списках. Мастер Формул www.PlanetaExcel.ru Совпадают или нет? Теперь ты детектив, сынок. Отныне тебе запрещается верить в совпадения. (Джим Гордон. Темный рыцарь: Возрождение легенды) Прежде чем искать различия, ответим на фундаментальный вопрос – совпадают ли два списка или нет, в принципе? Может и сравнивать ничего не нужно? Для начала рассмотрим простой случай, когда в наших списках нет дубликатов, они одинакового размера и отсортированы (т.е. элементы в них синхронизированы в одинаковом порядке). В этом случае найти количество несовпадений можно с помощью одной формулы массива: Фрагмент формулы A2:A10<>C2:C10 попарно сравнивает ячейки из двух списков и выдает на выходе результаты проверки в виде логических значений ИСТИНА (если пара не совпадает) и ЛОЖЬ (если совпадает): Чтобы преобразовать их в более удобные для подсчета 1 и 0, используется двойной минус. Фактически это умножение на -1 дважды, что не меняет результат, но конвертирует его в число. И, наконец, для суммирования полученных нулей и единиц используется функция СУММПРОИЗВ (SUMPRODUCT), которая к тому же позволяет ввести нашу формулу массива без нажатия Ctrl+Shift+Enter. Если же списки не отсортированы, т.е. элементы в них расположены в отличающемся порядке? Тогда нам поможет функция СЧЁТЕСЛИ (COUNTIF), которая подсчитывает количество совпадений с заданным значением в проверяемом диапазоне: 128 Мастер Формул www.PlanetaExcel.ru Так, в приведенном выше примере в дополнительных столбцах В и E подсчитывается количество вхождений каждого элемента в другом списке. Если списки полностью совпадают, то результатом работы этой формулы для каждого товара будет 1. Если какой-либо элемент будет отсутствовать, то напротив него мы увидим 0. Если попарно перемножить эти два набора чисел и сложить произведения (с помощью функции СУММПРОИЗВ), то в результате (если списки совпадают и везде единички) мы должны получить число, которое равно количеству элементов в одном из списков. Используя эту логику, нашу проверку можно свернуть в одну формулу без использования дополнительных столбцов: В английской версии это будет, соответственно: =SUMPRODUCT(COUNTIF(D2:D10;A2:A10);COUNTIF(A2:A10;D2:D10))=COUNTA(A2:A10) Если же усугубить ситуацию и предположить, что в списках могут быть повторы и количество элементов в них может отличаться, то для решения задачи придется пойти немного другим путем. Нам потребуется функция ПОИСКПОЗ (MATCH), которая ищет заданное значение в диапазоне и выдает на выходе порядковый номер ячейки, где оно было найдено, либо ошибку #Н/Д, если искомого значения в диапазоне нет. Сначала давайте применим эту функцию в дополнительных столбцах – для понятности: 129 Мастер Формул www.PlanetaExcel.ru Формула в ячейке B2 ищет первый элемент из Списка1 (т.е. Клубнику) во втором списке и выдает ее порядковый номер (2). Аналогичным образом, формула в ячейке E2 выдает порядковый номер Сливы в Списке1. Последний аргумент функции ПОИСКПОЗ, равный нулю, означает, что мы ведем поиск точного совпадения. То, что списки не одинакового размера и в них могут несколько раз повторяться одни и те же товары, в данном случае уже роли не играет, т.к. при нескольких вхождениях ПОИСКПОЗ просто выдает порядковый номер первого встретившегося элемента. Обратите также внимание на то, что наша функция выдала ошибку #Н/Д на Манго в первом списке, т.к. этого товара нет в Списке2 – именно этот нюанс мы и будем дальше использовать. Итоговая формула без «костылей» в виде дополнительных столбцов будет выглядеть так: В английском варианте: {=AND(ISNUMBER(MATCH(A2:A10;D2:D13;0)); ISNUMBER(MATCH(D2:D13;A2:A10;0)))} Функция ЕЧИСЛО (ISNUMBER) проверяет, является ли результат ПОИСКПОЗ числом или чем-то иным (например, ошибкой), и выдает соответственно логические значения ИСТИНА или ЛОЖЬ. А дальше все 130 Мастер Формул www.PlanetaExcel.ru полученные результаты проверяются с использованием функции И (AND), поскольку нам необходимо полное совпадение, т.е. в результате везде должна быть только ИСТИНА. Хотя бы одна ЛОЖЬ – и функция просигнализирует нам о присутствии различий. 131 Мастер Формул www.PlanetaExcel.ru Подсветка отличий-совпадений в двух списках Начнем с простого. Предположим, что у нас есть два частично пересекающихся списка без дубликатов: Эта книга про формулы, но, откровенно говоря, самый простой способ найти отличия в двух таблицах – это вовсе не формулы, а условное форматирование. Если выделить оба диапазона (удерживая Ctrl) и выбрать на вкладке Главная – Условное форматирование – Правила выделения ячеек – Повторяющиеся значения (Home – Conditional formatting – Highlight cell rules – Duplicate values) и затем использовать опцию Уникальные (Unique), то Excel подсветит все ячейки, у которых нет повторов, т.е. отличия списков: Если же выбрать вариант «повторяющиеся», то цветом будут выделены, наоборот, совпадения: Плюс такого способа в простоте и наглядности. Минусы же в невозможности таким образом сравнить списки с разных листов, сравнить больше двух списков и отсутствии автоматического обновления. Поэтому давайте перейдем к более сложным, но эффективным инструментам – формулам. 132 Мастер Формул www.PlanetaExcel.ru Выявление различий в двух списках Предположим, что у нас есть два списка значений и нам необходимо выяснить различия между ними. Например, какие элементы из второго списка отсутствуют в первом? Есть несколько способов решения этой задачи. Способ 1. Простой - функция СЧЁТЕСЛИ В качестве самого простого варианта можно использовать функцию СЧЁТЕСЛИ (COUNTIF) для подсчета количества вхождений каждого элемента из второго списка в первом: Все просто: если напротив элемента получаем 1, то он есть в первом списке; если 0, то его там нет (т.е. это и есть отличие). Естественно, к полученному столбцу можно потом применить фильтр, чтобы отобрать нужные строки и работать дальше только с ними. Способ 2. Продвинутый – получаем отличия отдельным списком Это способ существенно сложнее, чем предыдущий, но позволяет получить список отличающихся значений сразу, без создания дополнительного столбца с подсчетом вхождений и последующей ручной фильтрацией. Для наглядности и понимания зайдем немного издалека. Добавим ко второму списку столбец с формулой, которая будет проверять количество вхождений с помощью функции СЧЁТЕСЛИ (как в предыдущем способе), и если оно равно 0, то выводить номер строки для текущего элемента функцией СТРОКА (ROW): 133 Мастер Формул www.PlanetaExcel.ru Сделаем небольшую заготовку с нумерацией справа от наших списков, куда с помощью функции НАИМЕНЬШИЙ (SMALL) выведем последовательно сначала самое наименьшее число в столбце D, потом 2-е по счету наименьшее, 3-е и т.д.: Таким образом мы получили номера строк отличающихся элементов. Чтобы извлечь их самих, можно использовать функцию ИНДЕКС (INDEX), которая вытаскивает значение из массива-столбца по порядковому номеру: 134 Мастер Формул www.PlanetaExcel.ru Теперь избавимся от вспомогательного столбца. Для этого в нашу формулу вместо диапазона D2:D10 вставим логическую проверку количества вхождений с помощью функций ЕСЛИ и СЧЁТЕСЛИ, которую мы применили в самом начале: После ввода эту формулу нужно будет ввести уже как формулу массива – с помощью сочетания Ctrl+Shift+Enter и скопировать потом на весь наш результирующий диапазон G2:G9. После этого вспомогательный столбец D можно смело очистить – он больше не нужен. Для пущей красоты можно спрятать ошибки #ССЫЛКА!, возникающие в избыточных ячейках, используя функцию ЕСЛИОШИБКА (IFERROR): {=ЕСЛИОШИБКА(ИНДЕКС($C$2:$C$10; НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($A$2:$A$9;$C$2:$C$10)=0; СТРОКА($C$2:$C$10)); F2)-1); "")} В английской версии наша формула будет: {=IFERROR(INDEX($C$2:$C$10; SMALL(IF(COUNTIF($A$2:$A$9;$C$2:$C$10)=0; ROW($C$2:$C$10)); F2)-1); "")} 135 Мастер Формул www.PlanetaExcel.ru Поиск совпадений в двух и более списках Обратной стороной сравнения списков обычно является задача выявления не различий, а наоборот – общих элементов, присутствующих в двух (и более) списках. Давайте попробуем красиво ее решить. Само собой, можно использовать тот же подход, который мы применяли в предыдущих пунктах, но искать не разницу, а совпадение. Для большинства разобранных выше формул это означает замену 0 на 1 при проверке результата функции СЧЁТЕСЛИ (COUNTIF) с помощью ЕСЛИ (IF): Однако такой способ трудно масштабируется: если надо вытащить общие элементы не из двух, а из трех, четырех и более списков, то формула принимает совсем уж устрашающий вид. Тут лучше использовать немного другой подход. Во-первых, для наглядности и компактности давайте дадим нашим спискам имена, чтобы затем использовать их в формулах. Выделите оба диапазона с их названиями, удерживая клавишу Ctrl и выберите на вкладке Формулы – Создать из выделенного (Formulas – Create from selection). В открывшемся окне включите только галочку В строке выше (First Row) и нажмите ОК: Excel даст нашим спискам имена, взяв их из первых строк выделенных диапазонов, т.е. Список1 и Список2. Проверить получившиеся именованные диапазоны можно с помощью Диспетчера Имен на вкладке Формулы (Formulas – Name Manager): 136 Мастер Формул www.PlanetaExcel.ru Здесь же можно впоследствии подкорректировать и размеры диапазонов, если количество элементов в списках будет меняться. Нужная нам формула для поиска и вывода общих элементов в этих двух списках будет выглядеть следующим образом: {=ИНДЕКС(Список1; ПОИСКПОЗ(1; СЧЁТЕСЛИ(Список2;Список1)*НЕ(СЧЁТЕСЛИ($H$1:H1;Список1)); 0))} Или в английском варианте: {=INDEX(Список1; MATCH(1; COUNTIF(Список2;Список1)*NOT(COUNTIF($H$1:H1;Список1)); 0))} Давайте разберем ее пошагово из середины наружу. 1. Функция СЧЁТЕСЛИ(Список2;Список1) ищет во втором списке каждый элемент первого списка по очереди. На выходе получим массив нулей и единиц, отражающий элементы в Списке1, совпадающие со Списком2, т.е. {1:0:1:0:0:1:1:0}. 2. СЧЁТЕСЛИ($H$1:H1;Список1) ищет каждый элемент Списка1 в списке предыдущих найденных общих элементов. Так, например, в ячейке H4 эта формула примет вид СЧЁТЕСЛИ($H$1:H3;″Клубника″) и выдаст на выходе массив {1:0:1:0:0:0:0:0}, где единицы соответствуют уже найденным выше общим элементам (Арбуз и Клубника). Этот фрагмент формулы нужен, чтобы второй раз не вывести уже 137 Мастер Формул www.PlanetaExcel.ru обнаруженные совпадающие значения, поэтому далее мы используем функцию НЕ (NOT), которая инвертирует результат (меняет местами нули и единицы). 3. Перемножение двух описанных выше функций СЧЁТЕСЛИ(Список2;Список1) и НЕ(СЧЁТЕСЛИ($H$1:H1;Список1)) фактически представляет собой попарное перемножение массивов. Например, для все той же ячейки H4 это массив совпадений {1:0:1:0:0:1:1:0} и инвертированный массив уже обнаруженных общих элементов {0:1:0:1:1:1:1:1}. В результате получим массив {0:0:0:0:0:1:1:0}, где единицы соответствуют еще не выведенным совпадениям. 4. Функция ПОИСКПОЗ выдает порядковый номер первой единицы в полученном массиве, т.е. число 6. 5. И, наконец, функция ИНДЕКС выводит элемент Списка1 по вычисленному номеру, т.е. извлекает очередное совпадение (если оно не было выведено ранее). Прелесть такого способа в том, что при увеличении количества списков достаточно будет добавить еще один именованный диапазон (Список3) и множитель в нашу формулу – массив проверки совпадений с помощью еще одной функции СЧЁТЕСЛИ (COUNTIF): 138 Трансформация таблиц формулами Иногда таблицы, которые достаются нам для работы, необходимо бывает перестроить: отсортировать, изменить их размеры, повернуть, сжать и т.п. Причем иногда хочется сделать это с помощью формул, а не ручным перетаскиванием-копированием. В этой главе мы разберем: Как отсортировать формулой таблицу с текстом или числами. Как разместить элементы списка в обратном порядке. Как транспонировать таблицу (поменять местами строки и столбцы). Как получить монолитную таблицу, удалив из нее пустые ячейки. Как разделить один столбец на несколько. Как реализовать случайную выборку из списка формулами. Мастер Формул www.PlanetaExcel.ru Размещение элементов списка в обратном порядке Банальная задача, периодически встречающаяся в работе почти любого пользователя Microsoft Excel, – расположить элементы списка в обратном порядке. Решается с помощью одной простой формулы: Выражение СТРОКА($A$9)-СТРОКА(A2)+1 даст, при протягивании формулы в D2 вниз, обратный отсчет 9,8,7,6…2, а функция ИНДЕКС извлекает из исходного списка элементы с этими номерами, т.е. в обратном порядке. В английской версии это будет: =INDEX($A$2:$A$9;ROW($A$9)-ROW(A2)+1) Если заранее неизвестно, сколько именно элементов будет в списке, то можно слегка изменить нашу формулу, чтобы она проверяла сразу весь столбец «с запасом»: Номер последней ячейки (строки) вычисляет в данном случае функция СЧЁТЗ (COUNTA), сканируя весь столбец А. Единственный минус такого варианта в том, что список обязательно должен быть без пустых ячеек. Если же они могут встречаться, то для решения задачи потребуется уже формула массива: 140 Мастер Формул www.PlanetaExcel.ru Как легко заметить, это вариация первого способа, где диапазон взят «с запасом» сразу до сотой строки и номер строки последней заполненной ячейки задается не жестко, а вычисляется с помощью фрагмента: МАКС(($A$2:$A$100<>"")*СТРОКА($A$2:$A$100)) Каждая ячейка в диапазоне A2:A100 проверяется на заполненность с помощью выражения ($A$2:$A$100<>""), что даст на выходе массив значений ИСТИНА и ЛОЖЬ. Затем этот массив поэлементно умножается на массив номеров строк, получаемый с помощью функции СТРОКА($A$2:$A$100). Поскольку логическую ИСТИНУ Excel интерпретирует как 1, а ЛОЖЬ – как 0, то после умножения мы получим массив номеров заполненных ячеек. А уже из него функция МАКС выбирает самое большое число, т.е. номер последней заполненной строки. 141 Мастер Формул www.PlanetaExcel.ru Транспонирование (поворот) таблиц В математике транспонированием называют процедуру, когда в матрице (двумерная таблица с числами) строки и столбцы меняются местами. В Microsoft Excel часто возникает необходимость делать такое с диапазонами, т.е. то, что располагалось в строке, пустить по столбцу и наоборот. Самый простой и известный способ – это транспонирование с помощью специальной вставки. Выделяем и копируем исходную таблицу, затем щелкаем правой кнопкой мыши по пустой ячейке и выбираем среди желтых значков вариантов специальной вставки опцию Транспонировать (Transpose): Это работает вполне надежно, но что если вам нужно транспонировать диапазон, не теряя при этом связи с исходными ячейками? Чтобы потом при изменении данных в начальном диапазоне (A1:C5) – автоматически обновлялся бы транспонированный (F1:J3)? В этом случае без формул не обойтись. Способ 1. Функция ТРАНСП Выделите нужное количество пустых ячеек (т.е. если, например, исходная таблица была из 3 строк и 5 столбцов, то выделить обязательно нужно диапазон из 5 строк и 3 столбцов) и введите в первую ячейку функцию ТРАНСП (TRANSPOSE), указав для нее в качестве аргумента исходную таблицу: После ввода функции необходимо нажать не Enter, а Ctrl+Shift+Enter, чтобы ввести ее сразу во все выделенные ячейки как формулу массива. Если в исходной таблице были пустые ячейки, то при таком способе они будут отображаться как нули: 142 Мастер Формул www.PlanetaExcel.ru Обойти этот момент можно, если добавить проверку на заполненность в нашу формулу: В английской версии эта формула будет выглядеть как: =TRANSPOSE(IF(ISBLANK(A1:C5);"";A1:C5)) Также необходимо помнить, что технически это одна формула массива, которая вычисляет содержимое сразу всех ячеек в диапазоне F1:J3, поэтому нельзя будет потом менять содержимое отдельных ячеек в транспонированной таблице. Так, например, если попробовать очистить любую ячейку клавишей Delete, то мы получим сообщение об ошибке: Если этот момент вас сильно расстраивает, то следующий способ – для вас. Способ 2. Формируем адрес сами Этот подход к решению задачи транспонирования отчасти похож на предыдущий, но позволяет свободно редактировать значения во второй таблице и вносить в нее любые правки при необходимости. Для создания ссылок на строки и столбцы нам понадобятся четыре функции из категории Ссылки и массивы: Функция АДРЕС(номер_строки; номер_столбца) выдает адрес ячейки по номеру строки и столбца на листе, т.е. АДРЕС(2;3) выдаст, например, ссылку на ячейку C2. Функция ДВССЫЛ(ссылка_в_виде_текста) преобразует текстовую строку, например, "F3" в настоящую ссылку на ячейку F3. Функции СТРОКА(ячейка) и СТОЛБЕЦ(ячейка) выдают номер строки и столбца для заданной ячейки, например =СТРОКА(A3) выдаст 1, а =СТОЛБЕЦ(А3) выдаст 3. Теперь соединяем эти функции, чтобы получить нужную нам ссылку, т.е. вводим в любую свободную ячейку вот такую формулу: =ДВССЫЛ(АДРЕС(СТОЛБЕЦ(A1);СТРОКА(A1))) 143 Мастер Формул www.PlanetaExcel.ru Т.е. вместо строк берем столбцы, а вместо столбцов – строки. В английской версии Excel эта формула будет выглядеть соответственно: =INDIRECT(ADDRESS(COLUMN(A1),ROW(A1))) А затем копируем (протягиваем) формулу на соседние ячейки как обычно черным крестом. В итоге должно получиться примерно следующее: Т.е. при копировании формулы вниз по столбцу она выдает ссылку, которая «уходит» вправо по строке. А когда формулу копируем вправо, то она берет следующие строки, сдвигаясь вниз. Причем это обычная формула (не формула массива), со всеми вытекающими плюсами, легкостью редактирования и т.д. 144 Мастер Формул www.PlanetaExcel.ru Удаление пустых ячеек в списке Одним из частых случаев преобразования является избавление от пустых ячеек, чтобы сформировать на выходе монолитный список без пробелов: Для начала добавим еще один столбец, где с помощью функции ЕСЛИ проверим – пуста ли ячейка, и выведем либо логическое значение ЛОЖЬ, либо номер строки: В английской версии эта формула соответственно будет выглядеть как: =IF(ISBLANK(A1);FALSE;ROW(A1)) Теперь добавим справа область для результатов с номерами и вытащим из столбца B полученные числа по возрастанию с помощью функции НАИМЕНЬШИЙ (SMALL): 145 Мастер Формул www.PlanetaExcel.ru Ну а зная номера строк, можно извлечь и названия товаров из столбца A с помощью функции ИНДЕКС (INDEX): В первом приближении задача решена. Для полноты картины можно добавить еще парочку улучшений. Если таблицы начинаются не с первой строки листа или имеют «шапки», то функция СТРОКА в столбце B будет выдавать неправильное значение. Лучше заменить ее на разность СТРОКА(текущая ячейка)-СТРОКА(первая ячейка в таблице): Аналогичным образом можно поступить и в таблице результатов – не добавлять столбец E с ручной нумерацией, а заменить это на разницу в номерах строк между текущей ячейкой и началом таблицы: 146 Мастер Формул www.PlanetaExcel.ru Ну и в качестве апофеоза можно свернуть все в одну формулу массива, подставив формулу из B3 в функцию НАИМЕНЬШИЙ вместо $B$3:$B$13: Для наглядности, разложим ее на несколько строк с помощью сочетания клавиш Alt+Enter в строке формул: {=ИНДЕКС($A$3:$A$13; НАИМЕНЬШИЙ(ЕСЛИ(ЕПУСТО($A$3:$A$13); ЛОЖЬ; СТРОКА($A$3:$A$13)-СТРОКА($A$2)); СТРОКА(E5)-СТРОКА($E$4)))} В англоязычном варианте наша формула будет: {=INDEX($A$3:$A$13; SMALL(IF(ISBLANK($A$3:$A$13); FALSE; ROW($A$3:$A$13)-ROW($A$2)); ROW(E5)-ROW($E$4)))} 147 Мастер Формул www.PlanetaExcel.ru Сортировка формулой Безусловно, сортировать списки можно и стандартными средствами Microsoft Excel – кнопки сортировки на вкладке Данные (Data) никто не отменял. Тем не менее, иногда принципиально, чтобы сортировка происходила без участия пользователя, «на лету». А вот тут уже придется либо использовать макросы (а это отдельный разговор), либо обратиться за помощью к формулам, ибо они, как известно, пересчитываются автоматически. Давайте рассмотрим несколько способов реализации такой сортировки. Для чисел Если список содержит только числовую информацию, то его сортировку можно легко сделать с помощью функций НАИМЕНЬШИЙ (SMALL) и СТРОКА (ROW): Функция НАИМЕНЬШИЙ (SMALL) выдает из массива n-й по счету наименьший элемент. Т.е. НАИМЕНЬШИЙ(A2:A10;1) - это самое маленькое число из исходного списка, НАИМЕНЬШИЙ(А2:А10;2) - второе по счету наименьшее и т.д. Функция СТРОКА (ROW) выдает порядковый номер строки для указанной ячейки, т.е. СТРОКА(А1)=1, СТРОКА(A2)=2 и т.д. В данном случае разница СТРОКА(A2)-СТРОКА($A$1) используется просто как генератор последовательности чисел 1,2,3… для нашего отсортированного списка. С тем же успехом можно было сделать дополнительный столбец, заполнить его вручную числовой последовательностью 1,2,3… и ссылаться на него вместо функции СТРОКА. Для текста Если в списке не числа, а текст, то функция НАИМЕНЬШИЙ (SMALL) уже не сработает, поэтому придется пойти другим, чуть более длинным, путем. Как обычно, зайдем для понятности издалека. Добавим к нашим данным служебный столбец с формулой, где будет вычисляться порядковый номер каждого элемента в будущем отсортированном списке с помощью функции СЧЁТЕСЛИ (COUNTIF): 148 Мастер Формул www.PlanetaExcel.ru Технически это функция подсчета количества ячеек, которые меньше текущей. Применительно к тексту понятие «меньше» означает «выше по алфавиту», т.е. ближе к началу отсортированного списка. Таким образом, мы получаем, по сути, порядковые номера, по которым и нужно расставить элементы для упорядочивания. Одно «но»: если в нашем списке есть повторы (см. Елена), то они получат одинаковый номер, что не есть хорошо. Чтобы выкрутиться, добавим еще одно слагаемое к нашей формуле: Или в английском варианте: =COUNTIF($A$2:$A$10;"<"&A2)+COUNTIF($A$2:A2;A2) Этим мы решаем сразу две проблемы: добавляем единицу ко всем номерам, избавляясь от нулевого Андрея, и корректируем номер для повторов, чтобы они имели не одинаковые, а последовательно возрастающие номера. Теперь полученные числа надо расставить последовательно по возрастанию. Для этого можно использовать функцию НАИМЕНЬШИЙ (SMALL) из первого способа: 149 Мастер Формул www.PlanetaExcel.ru =SMALL($B$2:$B$10;ROW(B2)-ROW($B$1)) И, наконец, осталось просто вытащить из списка имена по их номерам. Для этого можно использовать такую конструкцию: =INDEX($A$2:$A$10;MATCH(C2;$B$2:$B$10;0)) Функция ПОИСКПОЗ (MATCH) ищет в столбце В нужный порядковый номер (1, 2, 3 и т.д.) и выдает порядковый номер ячейки, где находится это число. Затем функция ИНДЕКС (INDEX) вытаскивает из исходного списка содержимое ячейки по этому номеру. Формулой массива на «умной таблице» В качестве апофеоза давайте рассмотрим еще и случай автоматической сортировки с помощью всего одной формулы массива, без вспомогательных столбцов. Для пущего удобства давайте еще и отформатируем исходный список в виде «умной таблицы», чтобы впоследствии легко добавлять к нему новые элементы и не задумываться уже о его размерах. Выделите исходные данные (A1:A10) и выберите на вкладке Главная – Форматировать как таблицу (Home – Format as Table). На появившейся дополнительной вкладке Конструктор (Design) можно будет увидеть (и изменить, если нужно) имя созданной таблицы – по умолчанию это Таблица1: 150 Мастер Формул www.PlanetaExcel.ru Теперь выделим первую ячейку отсортированного списка (С2), введем в нее нашу формулу массива для сортировки (не забудьте нажать Ctrl+Shift+Enter в конце) и скопируем вниз: Нагляднее будет разложить нашу формулу по строкам с помощью сочетания клавиш Alt+Enter: {=ИНДЕКС(Таблица1; ПОИСКПОЗ(НАИМЕНЬШИЙ(СЧЁТЕСЛИ(Таблица1;"<"&Таблица1); СТРОКА(1:1)); СЧЁТЕСЛИ(Таблица1; "<"& Таблица1); 0))} Как легко сообразить, эта формула реализует тот же подход, что мы разбирали в предыдущем пункте, а именно: Функция СЧЁТЕСЛИ(Таблица1;"<"&Таблица1) определяет порядковый номер каждой ячейки исходных данных в отсортированном списке. Функция НАИМЕНЬШИЙ выстраивает эти номера по порядку (по возрастанию). Функции ИНДЕКС и ПОИСКПОЗ извлекают из исходного списка значения в соответствии с вычисленными номерами. Созданную формулу нужно будет протянуть вниз с запасом - с расчетом на вводимые в будущем в «умную таблицу» дополнительные данные. При этом формула массива начнет выдавать ошибку #ЧИСЛО на избыточных ячейках. Чтобы ее скрыть, можно использовать функцию ЕСЛИОШИБКА (IFERROR), которую нужно дописать "вокруг" нашей формулы: 151 Мастер Формул www.PlanetaExcel.ru =ЕСЛИОШИБКА(ИНДЕКС(Таблица1; ПОИСКПОЗ(НАИМЕНЬШИЙ(СЧЁТЕСЛИ(Таблица1;"<"&Таблица1); СТРОКА(1:1)); СЧЁТЕСЛИ(Таблица1; "<"& Таблица1); 0)); "") Она будет перехватывать возникающие ошибки и заменять их на пустую текстовую строку. В английском варианте это будет: =IFERROR(INDEX(Таблица1; MATCH(SMALL(COUNTIF(Таблица1;"<"&Таблица1); ROW(1:1)); COUNTIF(Таблица1; "<"& Таблица1); 0)); "") 152 Мастер Формул www.PlanetaExcel.ru Случайная выборка элементов из списка При помощи случайных совпадений бог сохраняет анонимность. (Альберт Эйнштейн) Предположим, что вам нужно случайно выбрать из списка заданное количество элементов. Например, определить победителей в лотерее среди клиентов или отобрать «счастливчиков» из числа ваших сотрудников для дежурств по выходным в офисе. Простой вариант Первое, что приходит в голову в такой ситуации, – это генерирование случайных чисел в интервале от 1 до числа сотрудников с помощью функции СЛУЧМЕЖДУ (RANDBETWEEN) и вытаскивание потом из списка элементов с полученными случайными номерами. Что-то типа: Или в английском варианте: =INDEX($A$2:$A$15;RANDBETWEEN(1;14)) Как всегда, при нажатии клавиши F9, Excel будет инициировать пересчет формул и заново формировать нам случайный список уже с другими именами. И с ходу же возникает нюанс: рано или поздно случайные числа могут совпасть и в нашей выборке могут появиться повторы, т.е. одного и того же человека мы можем выбрать дважды (а если особо повезет, то трижды). Если принципиально извлекать в случайную выборку элементы без повторов, то решение будет немного посложнее. Без повторов Добавим вспомогательный столбец, где сгенерируем случайные числа от 1 до 14 с небольшой «добавкой»: 153 Мастер Формул www.PlanetaExcel.ru Теперь определим ранг (положение в ТОПе) каждого из получившихся чисел в наборе с помощью функции РАНГ (RANG): У нее всего два аргумента: число, для которого определяем ранг и диапазон с числами, среди которых считается рейтинг. Прибавление дроби к функции СЛУЧМЕЖДУ нужно, как легко догадаться, для обеспечения уникальности, чтобы все ранги получились различными. А теперь осталось лишь вытащить имена сотрудников из таблицы по полученным номерам с помощью функции ИНДЕКС (INDEX): Одной формулой массива Если же принципиально решить задачу без использования вспомогательных столбцов, то придется подключать «тяжелую артиллерию Excel» в виде формул массива. 154 Мастер Формул www.PlanetaExcel.ru Для начала нам нужно сгенерировать нужное количество целых случайных неповторяющихся чисел в заданном интервале (с 1 до 14, т.к. у нас в списке 14 человек). Это можно сделать с помощью вот такой формулы массива: {=НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($E1:E1;СТРОКА($1:$14))=0; СТРОКА($1:$14)); СЛУЧМЕЖДУ(1:15-СТРОКА(A1)))} В английской версии это будет соответственно: {=SMALL(IF(COUNTIF($E1:E1;ROW($1:$14))=0; ROW($1:$14)); RANDBETWEEN(1:15-ROW(A1)))} Давайте разберем ее механику. Функция СТРОКА($1:$14) создает базовую последовательность чисел 1,2,3… 14. При копировании формулы вниз конструкция: ЕСЛИ(СЧЁТЕСЛИ($E$1:E3;СТРОКА($1:$14))=0;СТРОКА($1:$14)) … проверяет, какие именно числа из последовательности 1-14 уже найдены, и заменяет их на логическую ЛОЖЬ. Так, например, для третьей ячейки это будет выглядеть как: Затем функция НАИМЕНЬШИЙ (SMALL) выбирает из оставшихся чисел случайное по счету наименьшее. Ну а когда случайные числа выбраны, то дальше можно легко вытащить из нашего исходного списка элементы со случайными позициями с помощью функции ИНДЕКС (INDEX): 155 Мастер Формул www.PlanetaExcel.ru 156 Мастер Формул www.PlanetaExcel.ru Разделение одного столбца на несколько Весьма типичная ситуация, когда текст из одного столбца нужно разделить на несколько, используя заданный символ-разделитель (пробел, запятую и т.д.). Классическим подходом для решения такого типа задач будет, конечно, использование специального инструмента Текст по столбцам с вкладки Данные (Data – Text to Columns). Этот несложный и интуитивно понятный инструмент очень неплох, но требует постоянного участия пользователя: надо выделять данные, запускать и проходить трехшаговый мастер разбора текста, указывать параметры и т.д. Давайте лучше рассмотрим способ решения такой задачи формулами. Такой подход позволит полностью автоматизировать процесс, достаточно будет ввести формулу один раз – и все. Чтобы понятнее объяснить логику такой формулы, зайдем немного издалека. Предположим, что у нас есть ячейка A1 с текстом, который надо разделить на слова по пробелам: Сделаем немного странную, на первый взгляд, штуку – заменим каждый пробел в нашем тексте на, скажем, 30 дефисов. Реализовать это можно с помощью функции ПОДСТАВИТЬ (SUBST), которая находит нужный текст в строке и заменяет его на заданные символы. Чтобы не вбивать руками двадцать дефисов, используем функцию ПОВТОР (REPT), которая умеет повторять заданный символ N раз: Теперь разделим получившийся текст на три куска по 30 символов каждый с помощью функции ПСТР (MID): Т.е. первый фрагмент – это символы с 1-го по 30-й, второй фрагмент – символы с 31-го по 60-й, третий – с 61-го по 90-й. Как видно, свет в конце тоннеля уже забрезжил, правда? Теперь давайте заменим дефисы, которые я здесь использовал для наглядности, на пробелы, подправив функцию в ячейке A2, а от получившихся лишних пробелов избавимся с помощью функции СЖПРОБЕЛЫ (TRIM): 157 Мастер Формул www.PlanetaExcel.ru Осталось завернуть всю эту логику в одну красивую и компактную формулу, которую можно скопировать потом вправо и вниз на любое необходимое количество столбцов: В англоязычном варианте это будет соответственно: =TRIM(MID(SUBST($A1;" ";REPT(" ";30));COLUMN(A1)*30-29;30)) Открытым остается только один вопрос – откуда взялось число 30? На самом деле, конечно, можно использовать любое другое достаточно большое число. Главное, чтобы оно было больше, чем количество символов в исходном разбиваемом тексте. 158 Формулы для работы с датами Если даты в ваших ячейках не для красоты, и вам периодически приходится выполнять с ними какие-либо хитрые вычислительные операции, то изложенные далее приемы могут весьма пригодиться. В этой главе мы подробно разберем: Как производить вычисления сроков и длительностей в Microsoft Excel. Как определить точную дату по дню и номеру недели. Как можно округлять даты до ближайшего дня недели и рабочего дня. Как быстро найти пересечение двух интервалов дат. Как правильно склеивать даты и текст. Как найти временные интервалы, куда попадает заданная дата или нужный день недели. Как сгенерировать случайную последовательность дат или рабочих дней. Мастер Формул www.PlanetaExcel.ru Необходимое вступление Прежде чем переходить к сложным операциям с датами, необходимо сказать два слова о внутренней логике и принципах хранения и обработки дат в Microsoft Excel. Большинству продвинутых пользователей эти принципы, несомненно, известны (и были подробно описаны в моей предыдущей книге «Microsoft Excel: готовые решения – бери и пользуйся!»), но кратко повторить не помешает. Основные постулаты следующие: За точку отсчета дат в Excel программистами Microsoft было взято 1 января 1900 года – это «День 1» по внутренней нумерации Excel. Каждый последующий день прибавляет по единице, так что 1 января 2016 года, например, это 42370-й день по «календарю Excel». Этот код всегда можно увидеть, если просто сменить формат ячейки с датой на числовой или общий. Ограничение, логично вытекающее из предыдущего принципа: в Microsoft Excel нельзя работать с датами раньше 1 января 1900 года (а оно вам надо?). Поскольку Excel фактически хранит и обрабатывает даты как целые положительные числа, то с ними возможны любые математические операции. Например, можно легко вычислить количество прожитых дней, если просто вычесть из ячейки с сегодняшней датой ячейку с вашей датой рождения: 160 Мастер Формул www.PlanetaExcel.ru Округление дат Округление даты до ближайшего рабочего дня Весьма часто в реальной практике возникает потребность найти к заданной дате в календаре ближайший рабочий день. Допустим, вы выставили сегодня счет клиенту с оплатой в течение 10 дней. Прибавив к текущей дате 10 вы, конечно, получите дату, отстоящую от сегодняшней на 10 суток, но где гарантия, что этот день не выпадет на субботу или воскресенье? Если иметь ввиду классическую рабочую неделю (пн-пт – работаем, сб-вс – отдыхаем), то первое, что приходит в голову для нахождения ближайшего предыдущего рабочего дня к заданной дате, - это использовать формулу, подобную этой: Или в английском варианте: =IF(WEEKDAY(A2;2)=6;A2-1;IF(WEEKDAY(A2;2)=7;A2-2;A2)) То есть сначала с помощью функций ЕСЛИ (IF) и ДЕНЬНЕД (WEEKDAY) проверяем, на какой день недели выпадает заданная дата, и если это число от 1 до 5, т.е. дни с понедельника по пятницу, то ничего не делаем – просто выводим дату как есть. Если же исходная дата – суббота или воскресенье (функция ДЕНЬНЕД вернет 6 или 7), то вычитаем из даты 1 или 2 дня соответственно, чтобы получить предыдущую пятницу. Или же добавляем 1 или 2 дня, чтобы получить следующий понедельник. Такой подход, конечно, имеет право на жизнь, и это будет не самая сложная формула в этой книге, но улучшить можно почти все и всегда! В данном случае сильно сократит формулу применение вместо вложенных ЕСЛИ функции РАБДЕНЬ (WORKDAY): 161 Мастер Формул www.PlanetaExcel.ru По идее, эта функция нужна, чтобы откладывать N рабочих дней от заданной даты, причем N может быть как положительным (сдвиг в будущее), так и отрицательным числом (сдвиг в прошлое). Таким образом, если взять следующий календарный день после исходной даты и сдвинуть на один рабочий день в прошлое, то мы получим либо ближайшую пятницу (если исходной датой была суббота или воскресенье), либо тот же самый день (если были будни). Для округления до ближайшего следующего рабочего дня можно использовать аналогичную конструкцию: При необходимости, можно учитывать и наши российские государственные праздники, указывая их списком в третьем аргументе функции РАБДЕНЬ: 162 Мастер Формул www.PlanetaExcel.ru Округление даты до заданного дня недели Продолжая развивать идею из предыдущего пункта, давайте рассмотрим более общий случай: способы поиска не ближайшего рабочего, а любого произвольного ближайшего заданного дня недели. Допустим, что в нашей компании вторник и четверг – платежные дни. Нам выставляют счета и необходимо найти ближайшие дни, когда их можно подать на оплату, т.е., другими словами, округлить нашу дату до ближайшего вторника или четверга. За основу реализации возьмем международный вариант функции РАБДЕНЬ из прошлого пункта – функцию РАБДЕНЬ.МЕЖД (WORKDAY.INTL), впервые появившуюся в Excel 2013. В отличие от РАБДЕНЬ, эта функция рассчитана на использование не только с классической европейской или американской рабочей неделей. В ОАЭ, например, выходными официально считаются не суббота и воскресенье, как у нас, а пятница и суббота. В Алжире и Саудовской Аравии рабочая неделя продолжается с субботы до среды и т.д. Чтобы задать эти варианты, в функции РАБДЕНЬ.МЕЖД используется специальный третий аргумент Выходные, представляющий собой текстовую строку из нулей и единиц. Ноль обозначает рабочий день, а единица выходной. Так, наша рабочая неделя выглядела бы в этом представлении как "0000011", а алжирская как "0001100". Суть же трюка в том, что мы можем представить наши платежные дни как единственные рабочие дни в неделе и искать ближайший из них (предыдущий или следующий) точно так же, как делали в прошлом пункте: 163 Мастер Формул www.PlanetaExcel.ru Ну и праздники, конечно, тоже можно учесть, добавив их список четвертым аргументом. 164 Мастер Формул www.PlanetaExcel.ru Определение даты по дню и номеру недели Если вам известен номер недели в году и день недели (пн, вт, ср…), то как определить точную дату нужного дня? Например, нужно выполнить работы по проекту до понедельника на 3-й неделе 2016 года – какой день это будет? Формула, решающая эту задачу, не суперсложная, но зависит от того, какую неделю года мы возьмем за первую. В некоторых странах (США, Канада) первой неделей года считается та, куда попадает 1 января (даже если оно выпадет на воскресенье). Если использовать такой вариант нумерации недель, то нужная нам формула будет выглядеть так: Давайте-ка разберем ее по кусочкам. 1. Сначала нам надо найти точку отсчета – «нулевой день» года. Первое января 2016 было пятницей, поэтому если мы сдвинем 01.01.2016 на пять дней раньше, то получим такую точку. Это осуществляется вычитанием из B1 результата функции ДЕНЬНЕД (WEEKDAY), которая возвращает порядковый номер дня недели для заданной даты (т.е. в нашем случае для пятницы 01.01.2016 это будет число 5). 2. Затем к «нулевому дню» года мы прибавляем нужное количество недель с помощью выражения 7*(B21). 3. И, наконец, сдвигаемся на нужный день недели, добавляя еще и B3. Не самая сложная логика. Проблема в том, что в большинстве стран Европы и Азии (и России в том числе) принято использовать другую нумерацию недель (по ISO), где первой неделей считается та, что содержит минимум 4 дня нового года. Поэтому для России проще всего будет указать в ячейке B1 не 1-е, а 4-е января – точку отсчета недель, принятую у нас. Формула при этом остается той же самой. 165 Мастер Формул www.PlanetaExcel.ru Сколько заданных дней недели попадает в интервал дат Иногда возникает необходимость определить, сколько именно определенных дней недели выпадает на заданный интервал дат. Например: Вторник и четверг у вашей компании – платежные дни. Сколько таких дней до конца года? Вы хотите купить абонемент в бассейн по средам и субботам. Одно занятие стоит 100 рублей. Сколько будет стоить абонемент на этот квартал? Каждую пятницу вы с друзьями ходите в бар и тратите по 1000 рублей. Сколько денег спрятать от жены отложить на следующий год? Есть несколько способов решения такого типа задач. Способ 1. Формула массива Давайте подсчитаем, для примера, сколько каждого дня недели (понедельников, вторников, сред и т.д.) будет в интервале, например, с 1 января по 20 декабря 2016 года: Можно, конечно, пойти простым путем и начать решать нашу задачу «в лоб». Т.е. сделать столбец с датами на весь год (протягиванием за «черный крестик» вниз) и использовать функцию ТЕКСТ, чтобы преобразовать дату из классического формата ДД.ММ.ГГГГ в день недели: Ну а потом останется только подсчитать количество нужных значений в диапазоне B5:B359, например, с помощью функции СЧЁТЕСЛИ (COUNTIF) или сводной таблицы. 166 Мастер Формул www.PlanetaExcel.ru При внешней простоте минусы такого способа решения нашей задачи очевидны: много ручной работы, а значит велика вероятность ошибки; при изменении начальной и конечной дат придется заново формировать цепочку дат в столбце А; если интервал дат большой (лет 5-10 хотя бы), то все становится очень громоздко и т.д. На самом деле все можно сделать с помощью одной хитрой формулы, которая к тому же сама будет пересчитываться «на лету», без всяких вспомогательных столбцов и лишних действий. Для начала, чтобы понять всю последующую логику объяснения, вспомним, как Excel на самом деле хранит даты – как целые положительные числа, представляющие собой количество дней от точки отсчета дат в Excel (1 января 1900 года). Поменяем-ка для наглядности формат ячеек B1 и B2 на общий или числовой, чтобы это увидеть: Таким образом, с точки зрения Excel, мы должны проверить интервал дат с 42370-го по 42724-й дни. Кроме дат, числами в Excel обозначается еще одна знакомая вам вещь – номера строк. Попробуйте, для примера, начать вводить в любую свободную ячейку вот такую формулу: … и Excel сделает ссылку на указанные строки, выделив их целиком. Это мы и используем. Выделим ячейку D2 для подсчета понедельников и ведем в строку формул вот такую конструкцию: 167 Мастер Формул www.PlanetaExcel.ru Фрагмент B1&":"&B2 склеивает числовые коды начальной и конечной дат, добавляя между ними двоеточие, а функция ДВССЫЛ (INDIRECT) превращает все это из текста в живую ссылку (как на предыдущей картинке). Нам нужны не сами строки, а их номера, которые соответствуют дням 2016 года, поэтому добавим к нашей конструкции функцию СТРОКА (ROW), которая будет выдавать номера указанных строк: Чтобы убедиться в правильности, можно выделить нашу формулу от знака равно и до конца и нажать клавишу F9 (только не пугайтесь): Как видите, мы получили коды дат всех нужных нам дней 2016 года, которые можно далее проверять. Только не забудьте сначала нажать сочетание Ctrl+Z, чтобы вернуться к формуле. Теперь добавим функцию ТЕКСТ (TEXT) для преобразования даты в день недели: Аналогично, можно проверить то, что получилось, выделив формулу и нажав F9. Получим названия дней недели: И осталось добавить проверку с помощью функции ЕСЛИ (IF) и суммирование – и наша формула готова: 168 Мастер Формул www.PlanetaExcel.ru В английской версии это будет: {=SUM(IF(TEXT(ROW(INDIRECT($B$1&":"&$B$2));"DDD")=D1;1;0))} Только не забудьте закрепить знаками доллара ссылки на исходные даты в ячейках B1 и B2, прежде чем копировать ее вправо, и нажать после ввода Ctrl+Shift+Enter, т.к. это формула массива. Способ 2. Новая функция ЧИСТРАБДНИ.МЕЖД Начиная с 2013 года в Microsoft Excel добавили функцию с забавно звучащим для русского человека названием ЧИСТРАБДНИ.МЕЖД (NETWORKDAYS.INTL), которая может помочь решить нашу задачу еще компактнее. Эта функция чем-то похожа на уже упомянутую нами функцию РАБДЕНЬ.МЕЖД в главе про округление дат. Но если РАБДЕНЬ.МЕЖД сдвигает дату на N-е количество рабочих дней, то ЧИСТРАБДНИ.МЕЖД вычисляет количество рабочих дней в заданном интервале дат. Прибавка .МЕЖД означает «международный» и говорит о том, что для этой функции можно задавать разные типы рабочих недель, отличающихся от нашей классической «понедельник-пятница». Этим фактом мы и воспользуемся. Допустим, вы купили абонемент на 2016 год в фитнесс-клуб по вторникам и четвергам. Сколько занятий вы посетите, если не будете пропускать тренировки? Первый и второй аргументы нашей функции ЧИСТРАБДНИ.МЕЖД – это начальная и конечная даты, с ними все просто. А вот третий аргумент – это текстовая строка, которая описывает рабочую неделю: нули воспринимаются как рабочие дни, а единицы – как выходные. Если представить на минуту, что мы не ходим в фитнесс-клуб заниматься по вторникам и четвергам, а там работаем в эти же дни, то наша рабочая неделя выглядела бы как «1010111» и наша функция как раз и посчитала бы количество нужных нам дней в 2016 году. 169 Мастер Формул www.PlanetaExcel.ru Вычисление нужной даты каждого месяца Предположим, что каждый третий понедельник каждого месяца у вас проходит планерка по проекту. Как быстро найти все даты таких планерок в 2016 году? Сначала для простоты понимания давайте создадим набор ячеек с первыми днями каждого месяца. Проще всего это сделать введя руками в ячейку A2 дату 01.01.2016, а затем скопировать ее вниз на 12 ячеек и нажать на появившийся в правом нижнем углу выделенного диапазона значок и выбрать Заполнить по месяцам (Fill Months): Теперь в ячейку B2 напротив первого месяца введем формулу массива для вычисления каждого третьего понедельника (я использовал сочетание Alt+Enter, чтобы разбить ее на строки для наглядности): {=НАИМЕНЬШИЙ(ЕСЛИ(ДЕНЬНЕД(A2+СТРОКА($1:$31)-1;2)=$F$2; A2+СТРОКА($1:$31)-1; ""); $F$3)} В английском варианте это будет: {=SMALL(IF(WEEKDAY(A2+ROW($1:$31)-1;2)=$F$2; A2+ROW($1:$31)-1; ""); $F$3)} 170 Мастер Формул www.PlanetaExcel.ru Разберем логику этой формулы. Фрагмент СТРОКА($1:$31) генерирует последовательность чисел 1,2,3,4…31 для каждого дня в месяце. Добавляя эти числа к ячейкам из столбца A, мы получим последовательность дат в каждом месяце. Функции ЕСЛИ (IF) и ДЕНЬНЕД (WEEKDAY) проверяют день недели для каждого такого дня, и если он совпадает с требуемым ($F$2), то выводит нашу дату, иначе – пустую текстовую строку. Таким образом, на выходе мы получим массив всех понедельников в каждом месяце. Это легко увидеть своими глазами, если выделить фрагмент нашей формулы с функцией ЕСЛИ() … и нажать на клавиатуре F9: Код 4237 соответствует 04.01.2016, т.е. первому понедельнику января 2016 года, код 42380 – второму понедельнику и т.д. Чтобы выбрать третий по счету понедельник, мы используем функцию НАИБОЛЬШИЙ (LARGE), которая умеет извлекать из массива чисел N-е по счету наименьшее число, где N берем из ячейки $F$3. 171 Мастер Формул www.PlanetaExcel.ru Пересечение двух интервалов дат Одна из типичных задач для пользователя Microsoft Excel. Имеем два диапазона дат вида «начало-конец». Задача состоит в том, чтобы определить, пересекаются ли эти диапазоны, и если да, то на сколько дней. Пересекаются или нет? Начнем с решения вопроса о том, есть ли пересечение интервалов в принципе? Предположим, что у нас есть таблица рабочих смен сотрудников: Визуально хорошо видно, что рабочие смены Ярослава и Елены пересекаются, но как это вычислить, не прибегая к построению полного графика? Вставим в нашу таблицу еще один столбец с функцией СУММПРОИЗВ (SUMPRODUCT), которая это определит: Разберем механизм этой формулы на примере Ивана. Фрагмент формулы (B4<=$C$4:$C$9) будет проверять даты окончания рабочей смены каждого сотрудника, сравнивая их с датой начала смены Ивана. На выходе мы получим массив из логических значений ЛОЖЬ и ИСТИНА, где ИСТИНА означает, что у соответствующего сотрудника дата окончания работы наступила после начала работы у Ивана: {ИСТИНА:ЛОЖЬ:ИСТИНА:ИСТИНА:ЛОЖЬ:ИСТИНА} Вторая проверка (C4>=$B$4:$B$9) происходит аналогично, выявляя тех, у кого дата начала рабочей смены раньше даты окончания ее у Ивана: {ИСТИНА:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ИСТИНА:ЛОЖЬ} Поскольку Excel интерпретирует ЛОЖЬ как 0, а ИСТИНУ как 1, то при попарном перемножении этих двух массивов, остаются только те единички, которые удовлетворяют обоим условиям, т.е. пересечения, которые мы потом суммируем функцией СУММПРОИЗВ (SUMPRODUCT). Как минимум, одно пересечение мы будем получать всегда – это пересечение Ивана с самим собой. Но если пересечений получится больше 1, то это уже говорит о «перехлесте» в датах с другими сотрудниками. 172 Мастер Формул www.PlanetaExcel.ru А поскольку любая дата в Microsoft Excel по сути представляет собой число (количество дней от 01.01.1900), то подобный подход так же хорошо будет работать и для интервалов дат вместо порядковых номеров дней в месяце: Формулу при этом менять совершенно не нужно. Сколько дней в пересечении? Как ни странно, но на помощь в данном случае может прийти такое статистическое понятие, как медиана. Представьте себе отсортированный по возрастанию набор неких случайных чисел, например: 1, 3, 7, 12, 20, 38, 99 Медиана – это такое число из набора, что ровно половина чисел меньшее его, а другая половина – больше. Центральное значение, своего рода. Для нашего вышеупомянутого набора это число 12. Если же количество чисел в наборе четное, то обычно медиану вычисляют как среднее арифметическое двух центральных значений. В Microsoft Excel для расчета медианы существует одноименная функция МЕДИАНА (MEDIAN), аргументом которой и указываются числа из исходного набора: У медианы есть несколько полезных свойств. Например, в статистике часто используют медиану вместо среднего арифметического, поскольку она не так чувствительна к выбросам – редким нетипичным всплескам или провалам значений. Мы же используем медиану для расчета пересечения дат. Поскольку даты в Excel, как известно, представляют собой числа, то начать для понимания можно с них. 173 Мастер Формул www.PlanetaExcel.ru Предположим, что у нас имеются два числовых интервала (3-8 и 7-12), каждый из которых задается числами начала и конца. Нужная нам формула, вычисляющая длину их пересечения, будет выглядеть следующим образом: Если интервалы не пересекаются (например, 3-8 и 10-15), то эта же формула выдаст 0: Если один интервал полностью содержится внутри другого – выдаст длину меньшего из них, поглощенного большим: Если условно обозначить начало первого интервала за Н1, а конец за К1 и начало второго за Н2 и конец за К2, то в общем виде наша формула может быть записана как: =МЕДИАНА(Н1;К1+1;К2+1)-МЕДИАНА(Н1;К1+1;Н2) 174 Мастер Формул www.PlanetaExcel.ru Само собой, наша формула может быть без каких-либо доработок успешно применена и к поиску пересечения не чисел, а дат: 175 Мастер Формул www.PlanetaExcel.ru Выявление временных интервалов, куда входит заданная дата Предположим, что у нас есть таблица, где фиксируются все контракты с клиентами: их имена и даты начала и окончания действия каждого договора: Задача состоит в том, чтобы определить, какие именно контракты действуют на заданную (текущую) дату. Для лучшего понимания зайдем немного издалека. Добавим к нашей таблице еще один вспомогательный столбец со следующей формулой: В английской версии эта формула будет выглядеть как: =IF(($G$2>=B2)*($G$2<=C2);ROW(A2)-1) Эта формула проверяет, попадает ли наша текущая дата в диапазон от начала до конца контракта (т.е. больше начала и меньше конца), и выводит либо ЛОЖЬ (если не попадает), либо номер текущей строки, уменьшенный на 1 (из-за шапки таблицы). Таким образом мы получили столбец, где напротив действующих контрактов есть номера их строк. Чтобы извлечь эти номера, игнорируя ЛОЖЬ, используем функцию НАИМЕНЬШИЙ (SMALL), которая найдет нам последовательно сначала самое наименьшее число 3 в столбце D, потом следующее за ним 6, потом 8 и т.д. 176 Мастер Формул www.PlanetaExcel.ru А чтобы извлечь имена клиентов, используем функцию ИНДЕКС (INDEX), которая выдает из вертикального массива-диапазона содержимое ячейки по номеру: В принципе, мы получили уже работающее решение. Если хочется большей красоты, то можно избавиться от вспомогательного столбца, вложив имеющуюся в нем формулу внутрь функции НАИМЕНЬШИЙ: При этом, однако, она уже должна вводиться как формула массива (с Ctrl+Shift+Enter). Ну и от ошибок #ЧИСЛО! на избыточных ячейках можно избавиться стандартным образом – с помощью функции ЕСЛИОШИБКА (IFERROR), как мы уже неоднократно делали ранее. 177 Мастер Формул www.PlanetaExcel.ru Генерация случайного списка дат На практике весьма часто приходится сталкиваться с необходимостью быстро сгенерировать список из случайного набора дат в заданном временном интервале. Например, вы составляете график обзвона своих клиентов в 2016 году и хотите распределить эти дни в течение года более-менее равномерно и случайно, чтобы клиент не подумал, что вы его целенаправленно преследуете :) Самым простым вариантом будет добавлять к началу года случайные числа от 1 до 365: Такую формулу можно просто ввести в любую ячейку и скопировать вниз на нужное количество ячеек. Однако, как видно из предыдущей иллюстрации, некоторые дни запросто могут выпасть на выходные. Если нужны только рабочие дни, то формула будет посложнее, да еще и вводиться должна как формула массива (с Ctrl+Shift+Enter): Давайте ее разберем детально: {=ДАТА(2016;1;1)+ НАИБОЛЬШИЙ(ЕСЛИ(ДЕНЬНЕД(ДАТА(2016;1;1)+СТРОКА($1:$365);2)<6; СТРОКА($1:$365); ""); СЛУЧМЕЖДУ(1;260))} Сначала, как и в предыдущем случае, нам нужно сгенерировать последовательность чисел от 1 до 365 для прибавления к 1 января 2016, но пропустить при этом выходные. Это делает фрагмент формулы: ЕСЛИ(ДЕНЬНЕД(ДАТА(2016;1;1)+СТРОКА($1:$365);2)<6;СТРОКА($1:$365);"") 178 Мастер Формул www.PlanetaExcel.ru 1. Функция СТРОКА($1:$365) создает последовательность чисел 1, 2, 3 … 365. 2. Затем эти числа прибавляются к 1 января 2016 года, т.е. мы получаем на выходе массив всех дат 2016 года от 1 января до 31 декабря. 3. После этого функция ЕСЛИ (IF) проверяет день недели для каждой даты из полученного массива и заменяет даты, попадающие на субботы и воскресенья, пустыми текстовыми строками. Результат всего описанного выше процесса можно легко увидеть, если выделить первый аргумент функции НАИБОЛЬШИЙ (LARGE) в строке формул …и нажать на клавишу F9: 1 января 2016 года выпало на пятницу, поэтому добавленные к ней 1 и 2 оказываются субботой и воскресеньем, поэтому вместо них мы видим в формуле пустые строки в первых двух элементах массива и т.д. Теперь из созданного массива рабочих дней нужно сделать случайную выборку. Для этого мы используем функцию НАИБОЛЬШИЙ (LARGE), которая выдает из набора чисел (игнорируя пустые строки) N-е по счету наибольшее число. Причем N в нашем случае это любое случайное число от 1 до 260 (кол-во рабочих дней в году) – создается с помощью функции СЛУЧМЕЖДУ (RANDBETWEEN). В английской версии наша итоговая формула выглядит следующим образом: {=DATE(2016;1;1)+ LARGE(IF(WEEKDAY(DATE(2016;1;1)+ROW($1:$365);2)<6; ROW($1:$365); ""); RANDBETWEEN(1;260))} 179 Мастер Формул www.PlanetaExcel.ru Склеивание дат и текста Одним из распространенных вопросов, возникающих при работе с датами, является склейка дат и текста. Само склеивание с помощью функции СЦЕПИТЬ (CONCATENATE) или знака & проблемы не представляет, но поскольку внутри Excel хранит и обрабатывает даты как числовые коды, то при сцепке именно их и видно вместо привычной даты: Эту проблему легко разрешить с помощью функции ТЕКСТ (TEXT), которая умеет представлять даты и числа в заданном формате. В нашем случае это может быть, например, один из вариантов: Как легко сообразить, буквы Д, М и Г отвечают за вывод дней, месяцев и лет соответственно. Причем количество букв позволяет вывести значение нужным образом: Формат Д ДД ДДД ДДДД М ММ МММ ММММ ГГ ГГГГ Как выглядит День месяца в виде 1-31 (без нулей впереди) День месяца в виде 01-31 (с нулем впереди) День недели сокращенно (пн, вт, ср…) День недели полностью (понедельник, вторник…) Номер месяца в виде 1-12 Номер месяца в виде 01-12 Сокращенное название месяца (янв, фев, мар и т.д.) Полное название месяца словом (январь, февраль…) Две последних цифры года Год полностью четырьмя цифрами В английской версии Excel русские буквы Д, М и Г необходимо заменить на английские D, M и Y, соответственно. И общая рекомендация: если вы раньше никогда не сталкивались с функцией ТЕКСТ (TEXT), то очень советую почитать справку по ней (она на русском и на удивление неплохо написана). Эта функция умеет делать очень много полезного не только с датами, но и с представлениями чисел, процентов и т.д. 180 Продвинутое управление связями с помощью формул Если в вашей книге Excel множество листов с таблицами, данные из которых надо подтянуть в один итоговый отчет, то вместо мучительно-монотонного создания ссылок вручную можно воспользоваться несколькими более изящными техниками. В этой главе мы разберем: Различные способы создания ссылок между листами вашей книги (вручную, специальной вставкой). Как собрать данные сразу с нескольких листов сквозными 3D-ссылками. Как консолидировать таблицы из разных файлов и управлять связями между ними. Как создать динамическое оглавление книги с гиперссылками с помощью формул. Как визуализировать сложные связи между листами и книгами с помощью надстройки Inqure. Мастер Формул www.PlanetaExcel.ru Создание внешних ссылок вручную Простой, как карандаш, но весьма трудозатратный способ, известный большинству пользователей, – прописать прямые ссылки на ячейки других листов, откуда нужно взять данные. Т.е. если, например, нам нужно сложить три ячейки (A2, F5 и G4) с трех листов (Москва, Нижний Тагил и Самара соответственно), то придется ввести формулу вида: =Москва!A2+'Нижний Тагил'!F5+Самара!G4 Обратите внимание на то, что имена листов с пробелами нужно заключать в апострофы. Ссылки на ячейки, само собой, можно и нужно не прописывать вручную, а просто: 1. Выделить пустую ячейку, где нужен результат. 2. Войти в режим создания формулы (нажать клавишу = в пустой ячейке). 3. Переходить с листа на лист и щелкать по нужным ячейкам – адрес выделенной ячейки вместе с именем листа автоматически будет добавлен в формулу. Останется только вводить с клавиатуры знаки математических действий (+, -, * и т.д.). 4. В конце, когда формула завершена, очень важно не забыть нажать на клавишу Enter, чтобы закончить ввод, т.к. любые «случайные» щелчки мышью по ячейкам или листам приведут к повреждениям в созданной формуле. Если нужно подтянуть данные из другой (открытой!) книги, то ссылка будет содержать еще имя файла и расширение в квадратных скобках: Если книга закрыта, то к имени добавится еще и путь к файлу (не забудьте про апострофы!): 182 Мастер Формул www.PlanetaExcel.ru 3D-ссылки на группу листов Если мы должны собрать данные из нескольких одинаковых таблиц, расположенных на большом количестве листов в одном и том же месте, то проще всего будет использовать так называемые трехмерные (3D) ссылки, которые позволяют суммировать сразу целую группу листов оптом, а не мучиться с прописыванием кучи ссылок на каждый лист по отдельности. К примеру, мы имеем десять листов с карточками магазинов и данными по их продажам в диапазоне C10:E17 на каждом листе: Для суммирования сразу по всем магазинам можно использовать одну трехмерную формулу: Если в именах листов будут содержаться пробелы (например, между названием магазина и номером), то интервал листов в формуле нужно будет заключить в апострофы: 183 Мастер Формул www.PlanetaExcel.ru =СУММ('Магазин 1:Магазин 10'!C10) Минусы такого способа в том, что листы, с которых собирается информация, должны лежать подряд и внутри одной книги. Плюсом же является то, что в будущем можно просто закидывать мышью новые листы-магазины внутрь этого интервала – и они начнут автоматически учитываться в итогах. Аналогично, если какой-то из магазинов закроется, то достаточно просто удалить ненужный лист – его значения автоматически вычтутся из итогов, не приводя к ошибкам типа #ССЫЛКА. Также, вместо банальной СУММ, можно использовать много других функций (СРЗНАЧ, МИН, МАКС, СЧЁТЗ и т.д.). 184 Мастер Формул www.PlanetaExcel.ru Связывание листов специальной вставкой Если нужно не суммировать, а просто собрать ссылками значения ячеек с большого количества листов и поместить их рядом в одной итоговой таблице, то вместо прописывания ссылок вручную можно воспользоваться одной из опций Специальной Вставки (Paste Special). Для этого: Копируем ячейки на исходном листе, с которого хотим подтягивать ссылками данные: Затем выделяем пустую ячейку на листе, куда хотим собирать, щелкаем правой кнопкой мыши и в разделе Специальная вставка выбираем Вставить связь (Paste Link): В итоге получаем не сами скопированные значения (как при обычной вставке), а автоматически созданные прямые ссылки на скопированные ячейки исходного листа: Причем такой способ отлично работает при копировании из одной книги в другую – автоматически будет создана ссылка в другой файл вида: 185 Мастер Формул www.PlanetaExcel.ru При небольшом количестве листов – вполне себе адекватный способ. Когда листов много, то лучше пойти принципиально другим путем и автоматически формировать ссылки на другие листы формулой. 186 Мастер Формул www.PlanetaExcel.ru Создание ссылок на другие листы формулой Если нужно собрать ссылками значения с большого количества листов внутри книги и поместить их рядом в итоговой таблице на отдельном листе, то проще будет сформировать ссылки на ячейки исходных листов автоматически – с помощью двух инструментов: Символ сцепки & («амперсанд») – знак, склеивающий из нескольких фрагментов одну текстовую строку. Так, например: Обратите внимание, что дополнительный текст или символы должны быть в кавычках. Вместо & также можно использовать функцию СЦЕПИТЬ (CONCATENATE): ДВССЫЛ (INDIRECT) – функция, превращающая свой текстовый аргумент в ссылку. Т.е., например, формула =ДВССЫЛ("Лист1!A1") … даст на выходе ссылку на ячейку А1 с листа Лист1 и выведет содержимое этой ячейки. На практике, если мы захотим, например, собрать с каждого из наших листов-магазинов их адреса, станции метро, телефоны и директоров, находящиеся в шапке каждого листа: … то можно будет использовать вот такую формулу: 187 Мастер Формул www.PlanetaExcel.ru Она склеивает имя магазина (листа) из А3, стандартный разделитель (!) и адрес ячейки из В1. Получившуюся на выходе текстовую строку «Магазин1!B3» функция ДВССЫЛ (INDIRECT) превращает в реальную ссылку и выдает по ней содержимое соответствующей ячейки. Два важных момента, о которых надо помнить: 1. Заранее подготовить адреса собираемых ячеек (В3, В4, В5, В6) во вспомогательной первой строке. 2. Хитрое закрепление знаком $ ссылок в этой формуле. $A3 – зафиксирована буква столбца, а в B$1 – номер строки. Зато потом можно будет смело скопировать функцию ДВССЫЛ из ячейки В3 на весь диапазон B3:E12 и одним движением собрать по 4 ячейки с каждого из 10 (или 100!) листов. 188 Мастер Формул www.PlanetaExcel.ru Консолидация таблиц из разных файлов со связями Еще одним вариантом сборки данных из разных книг с автоматическим созданием связей между ними является консолидация. Допустим, что у нас имеются три файла с тремя таблицами-бюджетами разных подразделений: 189 Мастер Формул www.PlanetaExcel.ru Обратите внимание на то, что: В таблицах разное количество статей расходов, т.е. строк. Какие-то статьи (ФОТ, Налоги и т.д.) есть во всех таблицах, но некоторые (Спецодежда) только в определенных. Последовательность статей расходов в первом столбце не совпадает. В некоторых строках есть формулы (например, вычисляются налоги на ФОТ). Калужский филиал начнет работу только с марта, поэтому первые два месяца заполнены нулями (но не оставлены пустыми и не отсутствуют!). Для сборки и суммирования данных из таких таблиц с созданием связей можно воспользоваться простым алгоритмом: 1. Заранее откройте все книги, откуда хотите собрать данные (у нас это Самара.xlsx, Калуга.xlsx и Новгород.xlsx). 2. Откройте (или создайте) книгу, куда хотите собрать все данные. 3. На чистом листе выделите ячейку, начиная с которой хотите получить итоговый отчет (например, А1). 4. Нажмите кнопку Консолидация (Consolidate) на вкладке Данные (Data). В открывшемся окне установите курсор в поле Ссылка (Reference) и, переключаясь между книгами-филиалами, по очереди выделите каждую из таблиц в каждом файле, добавляя их в общий список диапазонов кнопкой Добавить (Add). В итоге в списке должны оказаться все три диапазона из трех книг-источников: 190 Мастер Формул www.PlanetaExcel.ru Обратите особое внимание на то, что Excel при сборке данных ориентируется на совпадение названий из верхней строки и левого столбца выделенных диапазонов. Так что выделить их нужно так, чтобы в первой строке оказались именно месяцы, а в первом столбце – именно статьи расходов, по которым нужно провести суммирование. Чтобы в итоговой таблице отобразились названия статей расходов бюджета и месяцы, необходимо включить оба флажка Использовать в качестве имен (Use labels). Флаг Создавать связи с исходными данными (Create links to source data) очень важен, т.к. именно благодаря ему в итоговом отчете будут автоматические ссылки на ячейки исходных книг вместо констант. После нажатия на ОК увидим результат консолидации: Легкая грусть из-за отсутствия форматирования при ближайшем рассмотрении с лихвой компенсируется двумя жирными плюсами. Во-первых, каждая статья расходов теперь представляет собой группу, которую можно развернуть с помощью знаков «плюс» слева от строки и увидеть суммы по каждому филиалу и общую сумму с формулой итога: 191 Мастер Формул www.PlanetaExcel.ru Во-вторых, ячейки под группировкой содержат прямые ссылки на исходные файлы с данными и, следовательно, будут автоматически обновляться: А теперь попробуйте представить, сколько времени ушло бы на ручное прописывание ссылок на все эти ячейки в трех файлах, особенно с учетом того, что таблицы не одинаковые! 192 Мастер Формул www.PlanetaExcel.ru Редактирование связей между книгами Кроме создания связей между листами и книгами перед любым пользователем Excel постоянно встает задача их контроля и отслеживания. К сожалению, связи – особенно между книгами – весьма слабое, если не сказать хуже, место Excel. Почти все работающие в Excel сталкиваются с ситуациями, когда при большом количестве ссылок на другие книги файл начинает подвисать, терять данные, вместо значений появляются ошибки #ССЫЛКА (#REF) и т.п. Свою лепту вносят не только программы, но и пользователи, без предупреждения перекладывая общие файлы, откуда вы брали данные, в другие папки и переименовывая их, что приводит к обрывам связей, мертвым ссылкам и т.д. Основным инструментом для управления внешними связями книги является диалоговое окно, которое можно открыть на вкладке Данные кнопкой Изменить связи (Data – Edit Links): В этом окне отображаются все внешние файлы, на которые есть ссылки в текущей книге: В графе Состояние можно увидеть текущий статус связи: ОК – данные из этого файла обновлены. Ошибка: источник не найден – файла, на который есть ссылка, нет в заданной папке. Возможно, он был перемещен, или переименован, или удален. Кнопка Изменить (Change Source) позволит заново указать положение файла для таких случаев. 193 Мастер Формул www.PlanetaExcel.ru Неизвестно – статус неизвестен. Для обновления лучше нажать на кнопку Состояние (Check Status), которая запустит процесс проверки всех ссылок с выдачей результатов по ним в этом же окне: Само собой, для обновления данных по связям можно использовать кнопку Обновить (Update Link), причем перед этим можно выделить сразу несколько связей в списке (удерживая клавишу Ctrl). Здесь же с помощью кнопки Открыть (Open Source) можно сразу же открыть исходные книги и просмотреть или изменить их содержимое. Если какие-то из связей нам больше не нужны, то можно выделить их и нажать кнопку Разорвать связь (Break Link), которая заменит в соответствующих ячейках листа ссылки на значения. Такая возможность является очень ценной альтернативой традиционной массовой замене формул на значения с помощью специальной вставки, т.к. убивает в книге не все формулы, а только внешние ссылки, оставляя в живых внутренние формулы и ссылки между листами. 194 Мастер Формул www.PlanetaExcel.ru Получение имени текущего файла и листа формулой Я назову компанию «Яблоко», если к пяти часам вы не предложите лучшего! (Стив Джобс) Не часто, но весьма регулярно в работе многих пользователей Excel возникает потребность получить имя текущего файла или листа для последующего использования на листе, в формулах, функции ДВССЫЛ (INDIRECT) и т.д. Само собой, это можно реализовать макросом (ими можно реализовать практически все), а можно обойтись и без программирования – только формулами. Главная идея состоит в использовании стандартной функции Microsoft Excel ЯЧЕЙКА (CELL), которая выдает по запросу много полезной информации о заданной ячейке и книге, в которой ячейка находится. Второй аргумент этой функции представляет собой ссылку на ячейку, а первый – тип сведений, который мы хотим о ней получить. При вводе функции в строку формул Excel, как обычно, услужливо подскажет набор возможных вариантов: Нас в данном случае интересует опция имяфайла (filename), которая выведет полный путь к текущему файлу, где содержатся имена текущей книги и листа: Чтобы извлечь из этой строки только имя листа, используем следующий несложный алгоритм: 1. Найдем положение закрывающей квадратной скобки с помощью функции НАЙТИ (FIND). 2. Вычтем его из общей длины (её даст функция ДЛСТР), чтобы получить количество символов в имени листа. 3. Возьмем вычисленное количество символов с правой стороны строки с помощью функции ПРАВСИМВ (RIGHT) =ПРАВСИМВ(D2;ДЛСТР(D2)-НАЙТИ("]";D2)) Очевидно, что можно обойтись и одной ячейкой, если подставить функцию ЯЧЕЙКА в нашу формулу вместо D2: 195 Мастер Формул www.PlanetaExcel.ru Аналогичным образом можно вытащить и имя текущего файла: 1. 2. 3. 4. Найти положение открывающей квадратной скобки функцией НАЙТИ("[";D2). Найти положение закрывающей квадратной скобки НАЙТИ("]";D2). Вычесть второе из первого, чтобы получить длину имени. Извлечь имя с помощью функции ПСТР (MID), начиная со следующего символа после открывающей квадратной скобки: В англоязычном варианте эта функция будет выглядеть как: =MID(D2;FIND("[";D2)+1;FIND("]";D2)-FIND("[";D2)-1) Само собой, для компактности можно подставить функцию ЯЧЕЙКА в формулу вместо D2, как мы это делали ранее. Ну и чтобы было совсем удобно, можно засунуть наши формулы в именованные диапазоны. Для этого нажмите кнопку Диспетчер Имен на вкладке Формулы (Formulas – Name Manager), затем кнопку Создать (New) и введите имя переменной и нашу формулу в открывшееся окно: Теперь для получения, например, имени листа в будущем уже не придется вводить нашу длинную формулу руками или откуда-то копировать – достаточно просто ввести ее имя Имя_листа, где это необходимо. 196 Мастер Формул www.PlanetaExcel.ru Оглавление книги с гиперссылками Если в вашей рабочей книге много листов, то удачным решением будет реализовать лист-оглавление, откуда по гиперссылкам можно будет моментально переходить на нужные листы: Для реализации такого нам потребуется XLM-функция ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ (GET.WORKBOOK), оставленная разработчиками для совместимости со старыми версиями Excel. Эта функция выгружает список всех листов текущей книги в заданную переменную, из которой мы потом можем их извлечь функцией ИНДЕКС (INDEX) и использовать в нашем оглавлении. Шаг 1. Создаем список листов Откройте Диспетчер Имен на вкладке Формулы (Formulas – Name Manager) и создайте новый именованный диапазон с именем, допустим, Оглавление. В поле Диапазон (Reference) введите вот такую формулу: =ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1) Теперь в переменной Оглавление содержатся наши искомые имена. Чтобы извлечь их оттуда на лист, можно воспользоваться функцией ИНДЕКС (INDEX), которая «выдергивает» элементы из массива по их порядковому номеру: =ИНДЕКС(Оглавление; СТРОКА()) Функция СТРОКА (ROW) выдает номер текущей строки и в данном случае нужна только для того, чтобы вручную не создавать отдельный столбец с порядковыми номерами извлекаемых элементов (1,2,3…). Таким образом, в ячейке А1 у нас получится имя первого листа, в А2 – имя второго и т.д. 197 Мастер Формул www.PlanetaExcel.ru Неплохо. Однако, как можно заметить, функция выдает не только имя листа, но и имя книги, которое нам не нужно. Чтобы его убрать, воспользуемся функциями ЗАМЕНИТЬ (SUBST) и НАЙТИ (FIND), которые найдут символ закрывающей квадратной скобки ( ] ) и заменят весь текст до этого символа включительно на пустую строку (""). Откроем еще раз Диспетчер имен с вкладки Формулы (Formulas - Name Manager), двойным щелчком откроем созданный диапазон Оглавление и изменим его формулу на: =ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ("]";ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));"") Или в англоязычном варианте: =SUBST(GET.WORKBOOK(1);1;FIND("]";GET.WORKBOOK(1));"") Теперь наш список листов будет выглядеть существенно лучше: Шаг 2. Добавляем автоматическое обновление Еще одна небольшая побочная трудность заключается в том, что наша формула в именованном диапазоне Оглавление будет пересчитываться только при вводе, либо при принудительном пересчете книги нажатием на сочетание клавиш Ctrl+Alt+F9. Чтобы обойти этот неприятный момент, добавим к нашей формуле небольшой "хвост": =ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ("]";ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));"")&Т(ТДАТА ()) В англоязычном варианте это будет соответственно: =SUBST(GET.WORKBOOK(1);1;FIND("]";GET.WORKBOOK(1));"")&T(NOW()) Функция ТДАТА (NOW) выдает текущую дату (с временем), а функция Т превращает эту дату в пустую текстовую строку, которая затем приклеивается к нашему имени листа с помощью оператора склейки (&). Т.е. имя листа фактически не меняется, но поскольку функция ТДАТА пересчитывается и выдает новое время и дату при любом изменении листа, то и остальная часть нашей формулы вынуждена будет заново пересчитаться тоже и – как следствие – имена листов будут обновляться постоянно. Шаг 3. Скрываем ошибки Для скрытия ошибок #ССЫЛКА (#REF), которые будут появляться, если скопировать нашу формулу с функцией ИНДЕКС на большее количество ячеек, чем у нас есть листов, можно использовать функцию ЕСЛИОШИБКА (IFERROR), которая перехватывает любые ошибки и заменяет их на пустую строку (""): 198 Мастер Формул www.PlanetaExcel.ru Шаг 4. Добавляем гиперссылки И, наконец, для добавления к именам листов "живых" гиперссылок для быстрой навигации, можно использовать функцию ГИПЕРССЫЛКА (HYPERLINK), которая будет формировать адрес для перехода из имени листа: Первый аргумент этой функции – это имя листа с адресом ячейки, куда должен быть переход, например #Москва!A1. Второй аргумент – это текст или символы, которые должны отображаться в ячейке. 199 Мастер Формул www.PlanetaExcel.ru Динамические гиперссылки из одной таблицы в другую Когда ваши данные разнесены на несколько таблиц (а так обычно и бывает!), то часто приходится прыгать между ними, отыскивая нужные строчки. Этот процесс можно упростить и ускорить, если создать динамические гиперссылки, которые будут автоматически перебрасывать вас в нужное место. Допустим, у нас есть две таблицы на разных листах одной книги: таблица с заказами от клиентов (на листе Заказы) и таблица с клиентской базой (лист Клиенты). Работая с таблицей заказов, хочется иметь возможность быстро переходить на таблицу с клиентами, чтобы просмотреть подробные данные по клиенту. То есть, другими словами, хочется в таблице заказов иметь гиперссылку в каждой строке, при щелчке мышью по которой будет происходить переход на лист Клиенты, причем именно на ту строчку, где упоминается данный клиент: Для начала зайдем по традиции немного издалека и введем в ячейку E3 таблицы заказов вот такую формулу: Она берет Михайлова с листа Заказы из ячейки C3 и ищет на листе Клиенты в столбце A3:A8, а затем выдает содержимое совпадающей ячейки, т.е., опять же, Михайлова. Весьма бессмысленное действие, на первый взгляд. Однако же дело в том, что, на самом деле, для создания гиперссылки нам нужно не содержимое ячейки, а ее адрес, а его мы можем легко получить, добавив к нашей формуле функцию ЯЧЕЙКА (CELL) с соответствующим аргументом: В английском варианте: =CELL("address";INDEX(Клиенты!$A$3:$A$8;MATCH(C3;Клиенты!$A$3:$A$8;0))) Тогда мы получим путь к нужной нам ячейке в клиентской базе, состоящий из имени файла, имени листа и адреса необходимой ячейки. 200 Мастер Формул www.PlanetaExcel.ru Неочевидный нюанс состоит в том, что в будущем при создании гиперссылки нам помешают апострофы, поэтому их придется убрать с помощью замены функцией ПОДСТАВИТЬ (SUBST): А затем останется только вставить созданную формулу в функцию ГИПЕРССЫЛКА (HYPERLINK), чтобы создать живую ссылку, которая будет при щелчке по ней перебрасывать нас на лист Клиенты к нужной строке: В английском варианте эта формула будет выглядеть как: =HYPERLINK(SUBSTITUTE(CELL("address";INDEX(Клиенты!$A$3:$A$8;MATCH(C3;Клиенты!$A$3:$A$ 8;0)));"'";"");">>>") При желании, можно заменить внешнее представление гиперссылки с банальных символов ">>" на что-нибудь поинтереснее с помощью функции СИМВОЛ (CHAR), которая умеет выводить нестандартные символы по их кодам. Так, например, если использовать шрифт Wingdings 3 и символ с кодом 117, то можно получить вот такие симпатичные значки гиперссылок: 201 Мастер Формул www.PlanetaExcel.ru Визуализация связей с помощью надстройки Inquire Если в вашей книге много ссылок между листами или внешних ссылок на другие книги, то во всех этих «кружевах» легко запутаться. Внести ясность поможет бесплатная надстройка Inqure, появившаяся в Microsoft Excel начиная с 2013 версии. Для управления всеми надстройками Excel удобнее сначала отобразить вкладку Разработчик (Developer). Если у вас ее не видно (она скрыта по умолчанию), то щелкните правой кнопкой мыши в любое место ленты и выберите команду Настройка ленты (Customize Ribbon). В открывшемся затем окне в правой половине включите флажок Разработчик (Developer) и нажмите ОК. Затем на появившейся вкладке Разработчик найдите и нажмите кнопку Надстройки COM (COM Add-ins): И, наконец, включите флажок напротив Inquire в следующем окне: Больше всю эту процедуру проделывать не нужно, одного раза вполне достаточно. После подключения надстройки у вас должна появиться новая одноименная вкладка с кучей интересных кнопок: Эта надстройка умеет много полезного: Отображать в виде наглядных диаграмм связи между листами, книгами и ячейками Сравнивать книги и наглядно показывать различия 202 Мастер Формул www.PlanetaExcel.ru Удалять избыточное форматирование Проводить анализ книги с выдачей подробной статистики по количеству формул, ячеек, ошибок и т.д. В рамках этой книги и главы нас интересует по большей части первый пункт. Нажатие на кнопку Workbook Relationship отображает наглядную диаграмму связей текущей книги с внешними файлами: Для более детального анализа лучше использовать кнопку Worksheet Relationship, которая отображает диаграмму связей уже на уровне листов: 203 Мастер Формул www.PlanetaExcel.ru Полученная диаграмма является до некоторой степени интерактивной. Листы и книги в ней можно перемещать, а ветви сворачивать и разворачивать с помощью желтых минусов. При наведении мыши на любой лист появляется всплывающая подсказка с подробной информацией: имя файла, расположение, количество ссылок и т.д. Диаграмму также можно распечатать или удобно масштабировать с помощью кнопок управления в правом нижнем углу окна. К сожалению, управления связями (редактирование путей к файлам, разрыв и т.д.) с помощью этой диаграммы реализовать не получится. Но визуализация ссылок - отменная. Пользуйтесь. 204 Другие трюки с формулами В этой главе вы найдете несколько полезных трюков и задач, которые я затруднился отнести к какой-то из предыдущих глав. Так что будет всего понемножку. Мы подробно разберем: Несколько способов сделать динамический диапазон, который будет сам подстраиваться в размерах под имеющееся количество данных. Как правильно вытаскивать данные из сводной таблицы при помощи функции ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ Как извлекать числа из буквенно-цифровой «каши». Мастер Формул www.PlanetaExcel.ru Динамический диапазон с автоподстройкой размеров Есть ли у вас в Microsoft Excel таблицы, размеры которых могут изменяться, т.е. количество строк (столбцов) может увеличиваться или уменьшаться в процессе работы? Если размеры таблицы «плавают», то придется постоянно мониторить этот момент и подправлять: ссылки в формулах отчетов, которые ссылаются на нашу таблицу, исходные диапазоны сводных таблиц, которые построены по нашей таблице, исходные диапазоны диаграмм, построенных по нашей таблице, диапазоны для выпадающих списков, которые используют нашу таблицу в качестве источника данных. Все это в сумме не даст вам скучать. Гораздо удобнее и правильнее будет создать динамический «резиновый» диапазон, который автоматически будет подстраиваться в размерах под реальное количество строк-столбцов данных. Чтобы реализовать такое, есть несколько способов. Способ 1. Умная таблица Выделите ваш диапазон ячеек и выберите на вкладке Главная – Форматировать как Таблицу (Home – Format as Table): Если вам не нужен полосатый дизайн, который добавляется к таблице побочным эффектом, то его можно отключить на появившейся вкладке Конструктор (Design): Каждая созданная таким образом таблица получает имя, которое можно заменить на более удобное там же на вкладке Конструктор (Design): 206 Мастер Формул www.PlanetaExcel.ru Теперь можно использовать динамические ссылки на нашу «умную таблицу»: Таблица1 – ссылка на всю таблицу, кроме строки заголовка (A2:D5). Таблица1[#Все] – ссылка на всю таблицу целиком (A1:D5). Таблица1[Питер] – ссылка на диапазон-столбец без первой ячейки-заголовка (C2:C5). Таблица1[#Заголовки] – ссылка на «шапку» с названиями столбцов (A1:D1). Такие ссылки замечательно работают в формулах, например: =СУММ(Таблица1[Москва]) … вычислит сумму по столбцу «Москва» Или: =ВПР(F5;Таблица1;3;0) … реализует поиск в таблице месяца из ячейки F5 и выдача питерской суммы по нему. Такие ссылки можно успешно использовать при создании сводных таблиц, выбрав на вкладке Вставка – Сводная таблица (Insert – Pivot Table) и введя имя умной таблицы в качестве источника данных: Если выделить фрагмент такой таблицы (например, первые два столбца) и создать диаграмму любого типа, то при дописывании новых строк они автоматически будут добавляться к диаграмме. 207 Мастер Формул www.PlanetaExcel.ru При создании выпадающих списков (вкладка Данные – Проверка данных) прямые ссылки на элементы умной таблицы использовать нельзя, но можно легко обойти это ограничение с помощью тактической хитрости – использовать функцию ДВССЫЛ (INDIRECT), которая превращает текст в ссылку: Т.е. ссылка на умную таблицу в виде текстовой строки (в кавычках!) превращается в полноценную ссылку, а уж ее выпадающий список нормально воспринимает. Способ 2. Динамический именованный диапазон формулами Если превращение ваших данных в умную таблицу по каким-либо причинам нежелательно, то можно воспользоваться чуть более сложным, но гораздо более незаметным и универсальным методом – создать в Excel динамический именованный диапазон, ссылающийся на нашу таблицу. Потом, как и в случае с умной таблицей, можно будет свободно использовать имя созданного диапазона в любых формулах, отчетах, диаграммах и т.д. Для начала рассмотрим простой пример: Задача: сделать динамический именованный диапазон, который ссылался бы на список городов и автоматически растягивался-сжимался в размерах при дописывании новых городов либо их удалении. Нам потребуются две встроенные функции Excel, имеющиеся в любой версии – ПОИКСПОЗ (MATCH) для определения последней ячейки диапазона и ИНДЕКС (INDEX) для создания динамической ссылки. Ищем последнюю ячейку Для начала, нам потребуется ПОИСКПОЗ (MATCH) – функция, которая ищет заданное значение в диапазоне (строке или столбце) и выдает порядковый номер ячейки, где оно было найдено. Например, формула 208 Мастер Формул www.PlanetaExcel.ru =ПОИСКПОЗ(“март”;A1:A5;0) … выдаст в качестве результата число 4, т.к. слово «март» расположено в четвертой по счету ячейке в столбце A1:A5. Хитрость в том, что последний аргумент функции (0) означает, что мы ведем поиск точного соответствия. Если этот аргумент не указать, то функция переключится в режим поиска ближайшего наименьшего значения – это как раз и можно успешно использовать для нахождения последней занятой ячейки в нашем массиве. Суть трюка проста. ПОИСКПОЗ перебирает в поиске ячейки в диапазоне сверху вниз и, по идее, должна остановиться, когда найдет ближайшее наименьшее значение к заданному. Если указать в качестве искомого значение заведомо больше, чем любое имеющееся в таблице, то ПОИСКПОЗ дойдет до самого конца таблицы, ничего не найдет и выдаст порядковый номер последней заполненной ячейки. А нам это и нужно! Если в нашем массиве только числа, то можно в качестве искомого значения указать число, которое заведомо больше любого из имеющихся в таблице: Для гарантии можно использовать число 9E+307 (9 умножить на 10 в 307 степени, т.е. 9 с 307 нулями) – максимальное число, с которым в принципе может работать Excel. Если же в нашем столбце текстовые значения, то в качестве эквивалента максимально большого числа можно вставить несколько букв "яяяяя". Поскольку при поиске Excel фактически сравнивает коды символов, то любой текст в нашей таблице будет технически «меньше» такой длинной «яяяяя» строки, и мы получим номер последней занятой ячейки: Обратите внимание на два момента: Наличие в списке пустых ячеек никак не мешает нашей формуле. Диапазон поиска (A2:A20), в общем случае, лучше выделять с запасом, чтобы можно было дописывать новые элементы списка в будущем. 209 Мастер Формул www.PlanetaExcel.ru Формируем ссылку с помощью ИНДЕКС Теперь, когда мы знаем позицию последнего непустого элемента в таблице, осталось сформировать ссылку на весь наш диапазон. Для этого используем уже знакомую нам функцию ИНДЕКС (INDEX). Она выдает содержимое ячейки из диапазона по номеру строки и столбца, т.е., например, функция: =ИНДЕКС(A1:D5;3;4) … по нашей таблице с городами и месяцами из предыдущего способа выдаст 1240 – содержимое из 3-й строки и 4-го столбца, т.е. ячейки D3. Если столбец всего один, то его номер можно не указывать, т.е. формула ИНДЕКС(A2:A6;3) выдаст Самару на последнем скриншоте. И тут есть один неочевидный нюанс: если ИНДЕКС не просто введена в ячейку после знака =, как обычно, а используется как финальная часть ссылки на диапазон после двоеточия, то выдает она уже не содержимое ячейки, а ее адрес! Таким образом, формула вида $A$2:ИНДЕКС($A$2:$A$100;3) даст на выходе уже ссылку на диапазон A2:A4. И вот тут в дело вступает функция ПОИСКПОЗ, которую мы вставляем внутрь ИНДЕКС, чтобы динамически определить конец списка: =$A$2:ИНДЕКС($A$2:$A$100;ПОИСКПОЗ("яяяяя";A2:A100)) В английской версии: =$A$2:INDEX($A$2:$A$100;MATCH("яяяяя";A2:A100)) Создаем именованный диапазон Осталось упаковать все это в единое целое. Откройте вкладку Формулы (Formulas) и нажмите кнопку Диспетчер Имен (Name Manager). В открывшемся окне нажмите кнопку Создать (New), введите имя нашего диапазона и формулу в поле Диапазон (Reference): Осталось нажать на ОК и готовый диапазон можно использовать в любых формулах, выпадающих списках или диаграммах. 210 Мастер Формул www.PlanetaExcel.ru Извлечение данных из сводных таблиц Постановка задачи Предположим, что из вот такой базы данных по продажам: ...вы создали небольшую и симпатичную сводную таблицу: Но вашему руководителю не нравится внешний вид отчета, и он хочет скорее что-то похожее на: То есть имеем несколько ощутимых трудностей: Исходный внешний вид сводной таблицы не подходит - дизайн отчета должен соответствовать корпоративным стандартам (цвета, логотипы, спарклайны, стрелки и т.д.). "Дорабатывать 211 Мастер Формул www.PlanetaExcel.ru напильником" дизайн сводной - долгий и мучительный процесс. И не факт, что красота не слетит после пересчета и обновления. Из всей сводной для отчета вам нужны не все данные, а только конкретные модели Ford по Питеру придется руками фильтровать. Стандартные итоги в сводной нам не подходят, т.к. нужны суммы по выручке в зеленых ячейках, но среднее по месяцу в итогах - сводная так не умеет. Полученные в сводной результаты - еще не конец, нам необходимо произвести с ними какие-то дополнительные вычисления: пересчитать выручку в тысячах, добавить прогноз на апрель, сравнить этот год с прошлым. Многое из перечисленного в сводных или невозможно в принципе (особенно для сводных на основе OLAP-кубов), или делается весьма мучительно и долго с помощью вычисляемых полей и объектов. Нужно построить по результатам хитрую диаграмму (обычные сводные диаграммы имеют много ограничений). Таким образом, перед нами стоит задача вытащить данные из сводной таблицы в другую таблицу - нужной нам конструкции, с дополнительными формулами и корпоративным дизайном. Сделать это можно разными способами. Прямая ссылка на ячейку в сводной Это, что называется, решение проблемы «в лоб». Сделаем на отдельном листе заготовку отчета: Теперь в ячейку D7 можно вручную прописать ссылку: =Лист1!B8 Где Лист1 – имя листа со сводной таблицей, а B8 – нужная нам ячейка в сводной с данными по продажам Ford Fiesta за январь. При внешней простоте и очевидности у этого способа есть две проблемы: Если сортировка моделей и дат в нашем красивом «отчете для шефа» отличается от сводной, то скопировать созданную ссылку не получится и придется делать их для каждой модели автомобиля персонально. А если нужно извлечь много данных, то придется делать много ссылок вручную. Завтра, после обновления, структура сводной таблицы может измениться - например, Fiesta может оказаться уже не третьей, а седьмой строкой, Focus переехать во вторую и т.д. И тогда все ссылки придется переделывать. Функция ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ Изящным решением всех этих проблем может стать функция ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ (GETPIVOTDATA), которая умеет извлекать нужные нам данные из сводной, чтобы использовать их в других таблицах или расчетах. 212 Мастер Формул www.PlanetaExcel.ru Чтобы ее использовать, убедитесь что при выделении любой ячейки сводной таблицы на вкладке Анализ (Analysis) или Параметры (Options) в выпадающем списке Параметры (Options) включена галочка Создать GetPivotData: Теперь выделите первую ячейку зеленого диапазона, введите знак "равно" и щелкните по ячейке в сводной, которая содержит нужные данные, т.е. по B8, где лежит выручка Fiesta за январь. Вместо привычной ссылки аля морской бой Excel вставит функцию ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ: Давайте разберем ее подробно: Первый ее аргумент ("Выручка") - это имя извлекаемого поля. Второй (Лист1!$A$4) - это адрес первой ячейки сводной таблицы, откуда мы берем данные. Этот параметр нужен, т.к. на листе может быть несколько сводных и Excel должен понимать, из какой именно нужно вытащить число. Все остальные аргументы начиная с третьего - это попарно название поля и его значение, т.е. в нашем случае это имя модели (Наименование="Fiesta") и временной период (Дата=1). Поскольку в сводной была применена группировка дат по месяцам, то в функции ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ мы получили не имя месяца, а его номер. Если бы в исходной базе данных был столбец не с датой, а с названием месяца, то группировка была бы не нужна и вместо единички был бы просто "январь". У этой функции есть несколько серьезных преимуществ перед обычной ссылкой на B8, которая приводила бы, на первый взгляд, к тому же результату. Главный плюс в том, что если завтра после обновления в сводной таблице изменится количество строк/столбцов или Ford Fiesta станет не третьей, а пятой строкой, то нам об этом волноваться уже не придется – функция корректно извлечет нужное нам значение. Достаточно только обновить сводную правой кнопкой мыши – и наша красивая форма отчета «для шефа» пересчитается автоматически. А теперь самое интересное. 213 Мастер Формул www.PlanetaExcel.ru Аккуратно замените в формуле "Fiesta" на $С7 (т.е. на ячейку с названием модели), а единичку на D$5 (т.е. ячейку с номером месяца) и допишите в конце формулы деление на 1000, т.к. нам нужно отобразить данные в тысячах. Затем нажмите на Enter и протяните формулу на оставшиеся зеленые ячейки. Функция извлечет из сводной нужные нам данные, заполнив нашу корпоративную форму отчета. Теперь с данными в диапазоне D7:F10 можно работать как с обычными формулами, а не как со сводной таблицей с ее жесткими ограничениями. Дальше можно спокойно считать любые итоги, динамику, прогнозы, строить любую диаграмму и т.д. Ссылка на итоги Если нужно сделать аналогичную живую ссылку на итоги в сводной по заданному полю, то придется пойти на небольшую хитрость. Прямое использование функции ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ на итогах выдает ошибку #ССЫЛКА, хотя текст в ячейке E3 полностью идентичен названию столбца в сводной: Если же добавить к нашей формуле безобидное приклеивание пустой строки к E3, то все, на удивление, заработает: Использование дат Если нужно использовать функцию ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ для извлечения информации по заданной дате, то также могут возникнуть небольшие сложности. Поскольку любая дата в Excel, на самом деле, 214 Мастер Формул www.PlanetaExcel.ru представляется числовым кодом, то прямое прописывание нужной даты в аргументах функции может не сработать: Чтобы решить эту проблему, можно использовать один из способов: Записать дату в формуле точно в том же формате ДД.ММ.ГГГГ, что и в сводной таблице (т.е. указать год как 4-значное число 2015 в нашем примере). Использовать вместо текстовой строки с датой "03.01.15" функцию ДАТАЗНАЧ("03.01.15"), которая преобразует текстовую дату в полноценную или функцию ДАТА(2015;1;3), которая выдает дату по порядковым номерам года, месяца и дня. Сделать отдельную ячейку с нужной датой и использовать ссылку на эту ячейку в функции ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ. Если же используется группировка дат по месяцам или кварталам, то для извлечения нужных значений можно просто указать порядковый номер периода: 215 Мастер Формул www.PlanetaExcel.ru Извлечение чисел из текста Думаю, даже для среднего пользователя Excel очевидно, что писать в одной ячейке несколько чисел сразу или смешивать в одной ячейке числа и текст – плохая идея. Подобные извращения Excel справедливо считает текстом и нормально подсчитывать с помощью простых формул не сможет. Тем не менее, регулярно попадаются любители вводить в ячейки «12 руб» и «за 7 шт.». Так что давайте разберем подходы и решения для подобных случаев. Извлечение номера счета из описания платежа Для разогрева начнем с простого, но весьма распространенного случая – нужно извлечь номер счета из описания платежа в банковской выписке. Про номер счета мы знаем, что он четырехзначный и всегда начинается со знака №. Поэтому логика формулы будет простой: определить позицию знака «№» в нашей строке с помощью функции НАЙТИ (FIND) и затем извлечь следующих 4 символа с помощью функции ПСТР (MID): Единственный не совсем очевидный момент в этой формуле состоит в использовании двойного минуса в начале. Дело в том, что после извлечения полученное значение технически является не числом, а еще пока текстовой строкой. Чтобы преобразовать ее в полноценное число, можно использовать простой трюк – произвести с ней какую-нибудь безобидную математическую операцию. Сгодится все что угодно, например, умножение на 1 или прибавление 0, лишь бы это не меняло исходное значение. Я использовал вариант с двумя минусами, т.е. двукратное умножение на -1. И еще один неприятный момент возникает на последних двух строчках – из-за наличия лишних пробелов извлекается только часть числа. Эту проблему легко решить, если избавиться от пробелов в принципе, заменив их все на пустую строку, т.е. вместо ссылки на исходный текст в A2 использовать функцию ПОДСТАВИТЬ (SUBSTITUTE): 216 Мастер Формул www.PlanetaExcel.ru Это чуть сложнее, но зато гораздо универсальнее. В английской версии эта формула будет выглядеть как: =--MID(SUBSTITUTE(A2;" ";"");FIND("№";SUBSTITUTE(A2;" ";""))+1;4) Извлечение почтового индекса из адреса Теперь давайте рассмотрим пример посложнее. Допустим, что нам нужно извлечь 6-значный почтовый индекс из текстовой строки с адресом, причем индекс может быть в строке где угодно: Логика расчета такова: пройти последовательно по буквам в ячейке от начала к концу, проверяя каждый раз следующие шесть символов на предмет того, являются ли они числом. Как только наткнемся на такое 6-значное число – это и есть наш почтовый индекс! Для начала реализуем все на простых формулах (не очень компактно, зато понятно): 217 Мастер Формул www.PlanetaExcel.ru Функция ПСТР (MID) извлекает из адреса куски по 6 символов. Функция ЕЧИСЛО (ISNUMBER) проверяет, является ли полученный фрагмент числом, и выдает на выходе логические значения ИСТИНА или ЛОЖЬ соответственно. Здесь же видим проблему: пробелы и запятые Excel может воспринимать как часть числа. Пробел он «не видит», а запятую считает разделителем целой и дробной части (если у вас российские региональные настройки Windows). Для решения можем использовать тот же трюк с двойной функцией ПОДСТАВИТЬ (SUBSTITUTE), чтобы избавиться от пробелов и запятых в принципе: 218 Мастер Формул www.PlanetaExcel.ru Дальше – проще. Осталось найти позицию первого вхождения ИСТИНЫ с помощью функции ПОИСКПОЗ (MATCH), т.е. начальную позицию почтового индекса в адресе, и извлечь индекс в отдельную ячейку с помощью функции ПСТР. Теперь, используя ту же логику, свернем наш расчет в одну формулу массива (я использовал сочетание клавиш Alt+Enter для разнесения формулы по строкам для наглядности): =--ПСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(B2;" ";"");",";""); ПОИСКПОЗ(ИСТИНА; ЕЧИСЛО(--ПСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(B2;" ";"");",";""); СТРОКА($1:$30); 6)); 0); 6) Из-за четырех вложенных функций замены она получается несколько громоздкой, но ничего нового в себе не содержит. Разве что роль последовательности 1,2,3… в столбце D здесь играет конструкция СТРОКА($1:$30), которая выдает массив номеров строк с первой по тридцатую соответственно. В английской версии это будет: {=--MID(SUBSTITUTE(SUBSTITUTE(B2;" ";"");",";""); MATCH(TRUE; ISNUMBER(--MID(SUBSTITUTE(SUBSTITUTE(B2;" ";"");",";""); ROW($1:$30); 6)); 0); 6)} Извлечение целых чисел из текста Этот случай похож на предыдущий пункт, за исключением того, что нам изначально неизвестна длина (разрядность) числа. Таким образом, нам потребуется разбить исходное содержимое ячейки на отдельные символы, чтобы потом проанализировать каждый из них. Это можно сделать, как и ранее, с помощью функции ПСТР (MID), которая умеет извлекать из текста символы по их положению. С обычными формулами это будет выглядеть как-то так: 219 Мастер Формул www.PlanetaExcel.ru Логика тут следующая: 1. Чтобы определить начало числа в нашей буквенно-цифровой каше, используем функцию ЕЧИСЛО (ISNUMBER), которая будет проверять каждый извлеченный символ, и затем функцию ПОИСКПОЗ (MATCH), которая будет в полученном массиве искать первую ИСТИНУ (TRUE). 2. Также нам потребуется длина числа, т.е., другими словами, количество ИСТИН. Двойной знак минус преобразует ИСТИНУ в 1, а ЛОЖЬ в 0, которые затем можно просто сложить функцией СУММПРОИЗВ (SUMPRODUCT). 3. Получив начальную позицию и длину, можно извлечь наше число с помощью функции ПСТР (MID). Теперь перейдем к самому интересному: сохраняя всю вышеописанную логику, свернем всю конструкцию в формулу массива: Функция СТРОКА($1:$20) здесь нужна, опять же, только для того, чтобы сгенерировать последовательность чисел 1,2,3…20 – порядковых номеров извлекаемых символов, которые в нашем предыдущем расчете находились в столбце С. 220 Справочник по функциям из этой книги В этой главе вы найдете подробные описания и примеры использования всех упомянутых в книге функций Excel. Мастер Формул www.PlanetaExcel.ru АДРЕС (ADDRESS) Используется для формирования текстовой ссылки на заданную ячейку по номеру строки, столбца и имени листа: Синтаксис: =АДРЕС(Номер_строки;Номер_столбца;Тип_ссылки;Режим_ссылок;Имя_листа) Умеет выдавать ссылки разного типа (относительные, абсолютные, смешанные) – за это отвечает третий аргумент функции. Также может сформировать ссылку в режиме R1C1 (четвертый аргумент). Если не указать имя листа, то будет создана ссылка на текущий лист. Для превращения текстовой ссылки в «живую» дополнительно нужно будет использовать функцию ДВССЫЛ (INDIRECT). ВПР (VLOOKUP) Эта функция ищет заданное значение в первом столбце указанной таблицы, и если находит, то выдает значение из требуемого столбца той же строки, где было совпадение. Синтаксис: =ВПР(Что_ищем;Таблица_для_поиска;Номер_столбца_результата;Приблизительный_поиск) Последний аргумент обычно равен 0 (точный поиск), кроме случаев поиска ближайшего наименьшего среди чисел. ВЫБОР (CHOOSE) Выбирает элемент из заданного списка по номеру: 222 Мастер Формул www.PlanetaExcel.ru По сути, делает примерно то же самое, что и функция ИНДЕКС (INDEX), но набор вариантов прописан прямо внутри формулы. Синтаксис: =ВЫБОР(Порядковый_номер;Значение1;Значение2;Значение3…) ГПР (HLOOKUP) Полный аналог функции ВПР (VLOOKUP), но для случая, когда поисковая таблица горизонтальная, т.е. поиск должен происходить не сверху вниз по столбцу, а слева направо по строке. Синтаксис: =ВПР(Что_ищем;Таблица_для_поиска;Номер_строки_результата;Приблизительный_поиск) Последний аргумент обычно равен 0 (точный поиск), кроме случаев поиска ближайшего наименьшего среди чисел. ДАТА (DATE) Формирует полноценную дату, с которой можно работать в Excel, из трех чисел – номеров года, месяца и дня соответственно: Синтаксис: =ДАТА(Год;Номер_месяца;День) Обратите внимание, что простое склеивание (с помощью знака & или функции СЦЕПИТЬ) тех же чисел с промежуточными точками – не то же самое, т.к. на выходе в этом случае получится не настоящая дата в формате Excel, а лишь текстовая строка, похожая на дату. 223 Мастер Формул www.PlanetaExcel.ru ДВССЫЛ (INDIRECT) Преобразует текстовую строку, похожую на адрес, в настоящую «живую» ссылку и выдает содержимое ячейки (или диапазона) по этой ссылке. Синтаксис: =ДВССЫЛ(Ссылка_как_текст) Обычно используется, когда текстовая строка с адресом формируется автоматически, путем склеивания фрагментов функцией СЦЕПИТЬ (CONCATENATE) или с помощью знака &. ДЕНЬНЕД (WEEKDAY) Определяет день недели для указанной даты и выдает его в виде числа. Второй аргумент определяет тип нумерации и чаще всего равен 2, когда Пн=1, Вт=2, Ср=3 …. Вс=7. Синтаксис: =ДЕНЬНЕД(Дата;Тип_нумерации_дней_недели) ЕПУСТО (ISBLANK) Проверяет, пуста ли указанная ячейка, и если да, то выводит логическое значение ИСТИНА, иначе ЛОЖЬ. ЕСЛИ (IF) Проверяет заданное условие и выдает на выходе одно значение, если условие выполняется и другое, если условие не выполняется. Выходными значениями могут быть текст, числа или формулы. 224 Мастер Формул www.PlanetaExcel.ru Синтаксис: =ЕСЛИ(Условие;Значение_если_условие_выполняется;Значение_если_условие_не_выполняется) Для проверки нескольких условий сразу необходимо либо вкладывать эти функции друг в друга: … либо использовать дополнительные функции И (AND), ИЛИ (OR): ЕСЛИОШИБКА (IFERROR) Позволяет перехватывать ошибки в сложных формулах и заменять их на желаемые значения, например на ноль или пустую текстовую строку. Например, для подавления ошибок #Н/Д, образующихся в результате использования функций ВПР, ИНДЕКС, деления на ноль и т.д. Синтаксис: =ЕСЛИОШИБКА(Проверяемое_выражение;Что_вывести_вместо_ошибки) 225 Мастер Формул www.PlanetaExcel.ru ЕЧИСЛО (ISNUMBER) Проверяет содержимое указанной ячейки, и если это число, то выводит логическое значение ИСТИНА (TRUE), иначе ЛОЖЬ (FALSE). Т.к. Microsoft Excel кодирует внутри себя любую дату в виде числового кода, то эта функция выдаст ИСТИНУ и на ячейках с датами тоже. ИНДЕКС (INDEX) Это одна из самых интересных и многоликих функций Microsoft Excel, которая, при правильном использовании, может очень пригодиться и выручить в очень многих ситуациях. У нее несколько принципиально отличающихся вариантов применения, причем далеко не все из них нормально описаны во встроенной справке Excel. Вариант 1. Извлечение данных из столбца по номеру ячейки Самый простой случай использования функции ИНДЕКС – это ситуация, когда нам нужно извлечь данные из одномерного диапазона-столбца, если мы знаем порядковый номер ячейки: =ИНДЕКС(диапазон_столбец;порядковый_номер_ячейки) Вариант 2. Извлечение данных из двумерного диапазона Если диапазон двумерный, т.е. состоит из нескольких строк и столбцов, то функция используется в другом формате: =ИНДЕКС(диапазон; номер_строки; номер_столбца) 226 Мастер Формул www.PlanetaExcel.ru Вариант 3. Несколько таблиц Если таблица не одна, а их несколько, то функция ИНДЕКС может извлечь данные из нужной строки и столбца именно заданной таблицы. В этом случае используется следующий синтаксис: =ИНДЕКС((несколько_диапазонов); номер_строки; номер_столбца; номер_диапазона) Обратите особое внимание, что в этом случае первый аргумент – список диапазонов - заключается в скобки. Вариант 4. Ссылка на столбец/строку Если во втором варианте использования функции ИНДЕКС номер строки или столбца задать равным нулю (или просто не указать), то функция будет выдавать уже не значение, а ссылку на диапазон-столбец или диапазонстроку соответственно: Обратите внимание, что поскольку ИНДЕКС выдает в этом варианте не конкретное значение ячейки, а ссылку на диапазон, то для подсчета потребуется заключить ее в дополнительную функцию, например СУММ, СРЗНАЧ и т.п. 227 Мастер Формул www.PlanetaExcel.ru Вариант 5. Ссылка на ячейку Стандартная ссылка на диапазон ячеек в Excel выглядит как Начало:Конец, например A2:B5. Это общеизвестно. Хитрость же в том, что если взять функцию ИНДЕКС в первом или втором варианте и подставить ее после двоеточия, то наша функция будет выдавать уже не значение, а адрес, т.е. на выходе мы получим полноценную ссылку на диапазон от начальной ячейки до той, которую нашла ИНДЕКС. ЛЕВСИМВ (LEFT) Извлекает заданное количество символов от начала строки текста. Если второй аргумент (кол-во символов) не указан, то берет первый символ: Синтаксис: =ЛЕВСИМВ(Текст;Количество_извлекаемых_символов) МЕДИАНА (MEDIAN) Вычисляет медиану для чисел из указанного диапазона. Медиана – это математическое понятие, используемое в статистике, представляющая собой центральное значение. Если отсортировать список чисел по возрастанию или убыванию, то медиана будет как раз в середине. Медиана чем-то похожа на среднее арифметическое, но, в отличие от него, не так зависит от выбросов (несистемных единичных всплесков и провалов). Так, например, в экономике и социологии часто используют не среднюю, а медианную зарплату, чтобы точнее оценить уровень доходов населения, не принимая во внимание сверхдоходы отдельных немногочисленных личностей. Оцените разницу: НАИБОЛЬШИЙ (LARGE) Выбирает из указанного диапазона k-е по счету наибольшее значение. При k=1 это эквивалентно работе функции МАКС. При k=2 мы получим следующее после максимального значение (второе в ТОПе) и т.д. 228 Мастер Формул www.PlanetaExcel.ru НАИМЕНЬШИЙ (SMALL) Выбирает из указанного диапазона k-е по счету наименьшее значение. При k=1 это эквивалентно работе функции МИН. При k=2 мы получим следующее после минимального значение (предпоследнее в ТОПе) и т.д. НАЙТИ (FIND) Ищет вхождение заданной подстроки в тексте и выдает порядковый номер символа, начиная с которого вхождение обнаружено. Если подстрока не найдена, то выдается ошибка #ЗНАЧ!. Третий (необязательный) аргумент позволяет задать стартовую позицию поиска: Основной особенностью и отличием этой функции от подобной ей функции ПОИСК (SEARCH) является чувствительность к регистру символов. ПЕЧСИМВ (CLEAN) Работает аналогично СЖПРОБЕЛЫ (TRIM), но очищает текст из указанной ячейки не от лишних пробелов, а от непечатаемых символов (неразрывных пробелов, переносов строк Alt+Enter и т.п.). 229 Мастер Формул www.PlanetaExcel.ru ПОИСК (SEARCH) Ищет вхождение заданной подстроки в тексте и выдает порядковый номер символа, начиная с которого вхождение обнаружено. Если подстрока не найдена, то выдается ошибка #ЗНАЧ!. Третий (необязательный) аргумент позволяет задать стартовую позицию поиска: Синтаксис: =ПОИСК(Подстрока_которую_ищем;Текст_в_котором_ищем) В отличие от похожей функции НАЙТИ (FIND) не различает регистр символов. ПОИСКПОЗ (MATCH) Ищет позицию (порядковый номер ячейки) вхождения заданного значения в одномерном диапазоне (строке или столбце): Синтаксис: =ПОИСКПОЗ(Искомое_значение;Диапазон_для_поиска;Тип_поиска) В случае с поиском чисел можно использовать неточный поиск (ближайшего наименьшего или наибольшего), задавая третий аргумент 1 или -1 соответственно. Список при этом должен быть обязательно отсортирован по возрастанию (1) или убыванию (-1). 230 Мастер Формул www.PlanetaExcel.ru ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ (GET.PIVOT.DATA) Извлекает из сводной таблицы значение по названию элемента в заданном поле. Автоматически добавляется при попытке сослаться на любую ячейку сводной: Полезной особенностью этой функции является то, что значения элементов (Детский сад, Ефремова) можно динамически подставлять из ячеек простыми ссылками: Это позволяет вытаскивать данные из сводной в таблицы произвольной формы и работать с ними дальше как с обычными ячейками, а не как со сводной (у которой немало ограничений в плане вычислений и дизайна). Синтаксис: =ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ(Имя_поля_значений;Адрес_первой_ячейки_сводной;Имя_пол я1;Значение_поля1;Имя_поля2;Значение_поля2…) ПРАВСИМВ (RIGHT) Извлекает из текста заданное количество последних символов. Если количество не задано, то выдает один последний символ: 231 Мастер Формул www.PlanetaExcel.ru Синтаксис: =ПРАВСИМВ(Текст;Количество_извлекаемых_символов) ПСТР (MID) Извлекает из текстовой строки подстроку требуемой длины, начиная с заданного символа: Синтаксис =ПСТР(Текст;Начальная_позиция;Количество_извлекаемых_символов) РАБДЕНЬ (WORKDAY) Откладывает от заданной начальной даты определенное количество рабочих (не календарных!) дней вперед в будущее или назад в прошлое. По умолчанию учитывает как выходные только субботы и воскресенья, но есть возможность добавить и учет праздничных дней, если задать их диапазон в третьем аргументе: Синтаксис: =РАБДЕНЬ(Начальная_дата;Количество_дней_сдвига;Выходные) РАБДЕНЬ.МЕЖД (WORKDAY.INTL) Откладывает от заданной начальной даты определенное количество рабочих (не календарных!) дней вперед в будущее или назад в прошлое. В отличие от аналогичной предыдущей функции РАБДЕНЬ (WORKDAY), позволяет задать, какие именно дни недели нужно считать за выходные, – за это отвечает третий ее аргумент. Также есть возможность добавить и учет праздничных дней, если задать их диапазон в четвертом аргументе: Синтаксис: =РАБДЕНЬ(Начальная_дата;Количество_дней_сдвига;Тип_рабочей_недели;Выходные) 232 Мастер Формул www.PlanetaExcel.ru СЖПРОБЕЛЫ (TRIM) Очищает текст в указанной ячейке от лишних пробелов, т.е. любого количества начальных или концевых пробелов и двойных-тройных и т.д. пробелов между словами. Другими словами, берет значение ячейки, убирает из него все пробелы, а потом добавляет по одному пробелу между словами. СЛУЧМЕЖДУ (RANDBETWEEN) Генерирует случайное целое число в заданном интервале. Например, если нам нужно заполнить диапазон случайными числами от 1 до 100, то можно использовать такую конструкцию: Синтаксис: =СЛУЧМЕЖДУ(Начало_интервала;Конец_интервала) Обратите внимание, что эта функция не гарантирует уникальности (неповторяемости) выданных значений и заново пересчитывается при каждом нажатии на клавишу F9 или общем пересчете листа. СМЕЩ (OFFSET) Выдает ссылку на диапазон заданного размера, сдвинутый на нужное количество строк-столбцов относительно начальной ячейки (точки отсчета). Часто используется, чтобы вытащить из таблицы данные, когда их положение и размер заранее неизвестны и динамически определяются пользователем. Имеет пять аргументов: =СМЕЩ(Стартовая_ячейка;Сдвиг_вниз;Сдвиг_вправо;Высота_диапазона;Ширина_диапазона) Так, например, если нам нужно просуммировать все затраты в феврале и марте на этапы с 3-го по 6-й, то нужный результат даст вот такая формула: 233 Мастер Формул www.PlanetaExcel.ru СОВПАД (EXACT) Проверяет, совпадают ли две указанных в качестве аргументов текстовых строки, и выдает логическую ИСТИНУ или ЛОЖЬ в качестве результата. Учитывает регистр символов. СРЗНАЧЕСЛИ (AVERAGEIF) Вычисляет среднее арифметическое чисел в заданном диапазоне, выбирая их по указанным условиям. Например, можно вычислить среднее только по Москве с помощью формулы: Как и в функции СУММЕСЛИ, в формулировке условия можно использовать знаки «звездочка» и «вопросительный знак» для приблизительного поиска в случае разных вхождений искомого текста («Москва», «г.Москва» и т.д.) и знаки >, <, =, >=, <= для сравнений, чтобы посчитать, например, среднее арифметическое всех заказов больше 1 млн. Синтаксис: =СРЗНАЧЕСЛИ(Диапазон_проверяемых_ячеек;Условие;Диапазон_усредняемых_чисел) Улучшенным вариантом этой функции является СРЗНАЧЕСЛИМН (AVERAGEIFS), т.к. умеет проверять уже не одно, а несколько условий сразу (до 127). СТОЛБЕЦ (COLUMN) Выдает номер столбца (не букву!) для указанной ячейки. 234 Мастер Формул www.PlanetaExcel.ru СТРОКА (ROW) Очень простая функция - выдает номер строки для указанной ячейки. СУММЕСЛИ (SUMIF) Проверяет заданный диапазон на выполнение условия и суммирует числа из другого диапазона, если критерий выполняется: Проверяемый и суммируемый диапазон должны быть обязательно одного размера, иначе функция выдаст неправильный результат. В формулировке условия можно использовать знаки «звездочка» и «вопросительный знак» для приблизительного поиска в случае разных вхождений искомого текста («Москва», «г.Москва» и т.д.) и знаки >, <, =, >=, <= для сравнений, чтобы посчитать, например, сумму всех заказов больше 1 млн. Синтаксис: =СУММЕСЛИ(Диапазон_проверяемых_ячеек;Условие;Диапазон_суммируемых_чисел) Улучшенным вариантом этой функции является СУММЕСЛИМН (SUMIFS), т.к. умеет проверять уже не одно, а несколько условий сразу (до 127). 235 Мастер Формул www.PlanetaExcel.ru СУММПРОИЗВ (SUMPRODUCT) Принимает в качестве аргументов одномерные массивы (диапазоны ячеек), перемножает между собой в них все первые элементы, затем все вторые, третьи и т.д., а потом суммирует получившиеся произведения. В самом простом варианте может использоваться вместо дополнительного столбца при вычислении общей суммы заказа: Синтаксис: =СУММПРОИЗВ(Массив1;Массив2;Массив3…) Само собой, массивы (диапазоны) должны быть одинакового размера. Также эта функция используется как «заменитель Ctrl+Shift+Enter» при вводе формул массива, т.к. ее аргументы автоматически интерпретируются как формула массива, но при этом не требуется нажимать сочетание Ctrl+Shift+Enter. СЧЁТЕСЛИ (COUNTIF) Проверяет каждую ячейку указанного диапазона на выполнение заданного условия и подсчитывает количество ячеек, где условие выполняется: Синтаксис: =СЧЁТЕСЛИ(Диапазон_проверяемых_ячеек;Условие) Как и в функции СУММЕСЛИ, в формулировке условия можно использовать знаки «звездочка» и «вопросительный знак» для приблизительного поиска в случае разных вхождений искомого текста («Москва», 236 Мастер Формул www.PlanetaExcel.ru «г.Москва» и т.д.) и знаки >, <, =, >=, <= для сравнений, чтобы посчитать, например, количество всех заказов больше 1 млн. Улучшенным вариантом этой функции является СЧЁТЕСЛИМН (COUNTIFS), т.к. умеет проверять уже не одно, а несколько условий сразу (до 127). ТЕКСТ (TEXT) Выводит содержимое указанной ячейки в заданном формате. Формат задается текстовой строкой со спецсимволами. Синтаксис: =ТЕКСТ(Значение;Формат) Во втором аргументе можно использовать спецсимволы, например (для российских региональных настроек и русскоязычной версии Microsoft Excel): # - необязательный числовой разряд 0 – обязательный числовой разряд Пробел – разделитель групп разрядов (тысячный разделитель, делящий большие числа по три) Запятая – разделитель целой и дробной части и т.д. (полный список очень велик и его имеет смысл посмотреть во встроенной справке) ТРАНСП (TRANSPOSE) Производит транспонирование указанного диапазона, т.е. меняет в нем строки и столбцы местами. Для ее использования необходимо заранее выделить нужное количество строк-столбцов и ввести ее строго как формулу массива, т.е. с Ctrl+Shift+Enter. Если связи между исходным и результирующим диапазонами не нужны, то проще, конечно, использовать копирование и специальную вставку (правой кнопкой мыши – Транспонировать). ЯЧЕЙКА (CELL) Выдает всевозможную информацию о заданной ячейке. Синтаксис: =ЯЧЕЙКА(Тип_информации;Адрес_ячейки) Наиболее полезные варианты: 237 Мастер Формул www.PlanetaExcel.ru 238 Тренинги Если вы хотите прокачать свои навыки работы в Microsoft Excel, то я и мои коллеги по «Планете Эксел» с радостью готовы вам помочь. Вот уже более 10 лет мы проводим обучающие курсы для сотрудников компаний и частных лиц по разным аспектам работы в Microsoft Excel, Word, Outlook, Power Point, Visio и Project. Список и содержание тренингов постоянно обновляются, чтобы не терять актуальность и адаптироваться под меняющиеся версии Office и возрастающие потребности бизнеса. ● Быстрый старт в Microsoft Excel (1 день) Короткий однодневный курс для тех, кто раньше почти (или совсем) не сталкивался с Excel, но кому нужно оперативно «включиться в процесс» и быстро освоить основы работы в этой программе. Операции с ячейками и листами, ввод данных, вычисления формулами и функциями, построение диаграмм, вывод на печать результатов. ● Расширенные возможности Microsoft Excel (2 дня) Самый популярный наш курс для освоения почти всего спектра возможностей Excel. Обработка больших объемов данных, аналитические отчеты сводными таблицами, разбор самых нужных функций на живых примерах, защита ячеек и основы применения макросов. ● Мастер формул Microsoft Excel (1 день) Курс «высшего пилотажа» по формулам для настоящих профессионалов Excel. Узнайте все хитрости и трюки построения сложных суперформул, откройте и используйте мощь и красоту формул массива для решения самых сложных задач. ● Визуализация данных в Microsoft Excel (1 день) Научитесь быстро и наглядно визуализировать большие объемы числовой информации для построения более наглядных и понятных бизнес-отчетов. В курсе подробно разбирается 18 стандартных и нестандартных типов статических, 9 типов интерактивных и 8 типов мини диаграмм. ● Прогнозирование и оптимизация в Microsoft Excel (1 день) Как спрогнозировать развитие любой ситуации (продажи, рынки) разными способами? Как, манипулируя входными параметрами в бизнес-модели, получить на выходе максимальную прибыль и минимальные затраты? Как «прокачать» несколько сценариев развития событий и выбрать лучший? ● Программирование макросов на VBA в Microsoft Excel (3 дня) Упростите свою работу, научившись создавать макросы на языке Visual Basic для автоматизации типовых рутинных действий в Microsoft Excel. Не хватает в Excel каких-то нужных вам функций? Напишите их сами! Программировать может каждый! ● Бизнес-аналитика (BI) в Microsoft Excel (1 день) Освойте самые современные инструменты для анализа данных и построения аналитических отчетов, появившиеся в последней версии Microsoft Excel. Импортируйте и трансформируйте данные с помощью Power Query, стройте сложную аналитику на DAX-формулах в Power Pivot, формируйте наглядные отчеты и визуализации с помощью Power View и Power Map. Полный список тренингов и все подробности можно найти по адресу http://www.planetaexcel.ru/treningi/