Академический Документы
Профессиональный Документы
Культура Документы
Москва
Издательство «Книга по Требованию»
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
1
Мастер Формул www.PlanetaExcel.ru
2
Мастер Формул www.PlanetaExcel.ru
3
От автора
Хочу сразу и честно вас предупредить.
Если вы только недавно окунулись в мир Excel – не покупайте эту книгу.
Вас и без нее будет ждать много восхитительных открытий. Я вам даже немного завидую. Радость и ощущение
всемогущества от использования сводных таблиц, или функции ВПР (VLOOKUP), или условного
форматирования первое время будет зашкаливать и без этого. Купите лучше любую хорошую книжку по
базовому набору функций Excel или мою предыдущую: «Microsoft Excel: сборник готовых рецептов – бери и
пользуйся!». Пользы будет больше.
Книга, которую вы держите в руках, – не для новичков. Эта книга для тех, кто в Microsoft Excel работает уже
давно. Достаточно давно, чтобы к радости от результатов работы порой примешивалось и разочарование от
осознания того, что не все, что хочется, возможно реализовать в этой программе. Для тех, кто «перерос ВПР» и
хочет с помощью формул творить на порядок более сложные вещи.
Если вы из таких – добро пожаловать. Мне есть, чем с вами поделиться.
Файлы примеров и видеоуроки
Нет ничего более раздражающего, чем хороший
пример.
(Марк Твен)
Книга – это хорошо, но живой пример с готовой формулой – еще лучше! Ко всем задачам из этой книги есть
файлы Excel, где можно посмотреть работающие формулы и даже скопировать их оттуда в свой проект. Не
стесняйтесь.
Имена файлов повторяют названия глав, так что найти нужное будет несложно:
Если вы из тех, кому «лучше один раз увидеть» и по тексту разобраться сложновато, то загляните в этот раздел
– возможно, есть видео с разбором вашей задачи.
Введение в
формулы массивов
Абсолютное большинство пользователей Excel никогда даже не слышали про формулы массива. Меньшинство
– встречали их в чужих таблицах или в интернете и пытались копировать в своих проектах (далеко не всегда
удачно). И уже совсем немногие научились использовать их мощь и магию для решения своих задач.
Давайте начнем, как положено, с синхронизации терминологии, чтобы быть уверенными далее, что мы с вами
одинаково понимаем ключевые понятия.
Массив – это набор элементов, состоящий из двух или более элементов. В терминах Excel, массив – это
диапазон, состоящий из нескольких ячеек. Как и диапазоны, массивы могут быть одномерными (строка или
столбец) или двумерными.
Любая обычная формула в Excel принимает на входе один или несколько массивов в виде исходных данных,
обрабатывает их и выдает значение в качестве результата.
Формула массива – это формула в ячейке листа Excel, которая обрабатывает на входе один или несколько
массивов, применяя к каждой ячейке какие-либо действия (математические или логические операторы,
функции и т.д.) и выдавая на выходе тоже массив. Иногда к результирующему массиву в конце тоже
применяется какая-либо функция (суммирование, среднее и т.п.) – тогда на выходе формулы массива будет
одно значение.
7
Мастер Формул www.PlanetaExcel.ru
Для ввода такой формулы нужно сначала выделить сразу все зеленые ячейки (D8:L16), ввести формулу в
первую ячейку диапазона (D5) и затем нажать сочетание Ctrl+Shift+Enter. Формула вычислит результаты
перемножения всех пар чисел и заполнит ими сразу весь выделенный диапазон.
8
Мастер Формул www.PlanetaExcel.ru
В приведенном выше примере функция ИНДЕКС выбирает из массива констант дней недели нужный день по
номеру.
Причем в русской версии Excel для разделения элементов в строке используется точка с запятой, а для
разделения строк – двоеточие:
А в английской версии Excel для разделения элементов в строке может использоваться запятая либо обратный
слеш, а для разделения строк – точка с запятой:
Для ввода формул с массивами констант сочетание Ctrl+Shift+Enter нажимать не нужно, достаточно обычного
Enter.
9
Мастер Формул www.PlanetaExcel.ru
Как всегда, у любой палки два конца. Формулы массива (ФМ) – очень мощный инструмент, но не панацея от
всех проблем.
10
Хитрости ввода и отладки
сложных формул
Громоздкость и сложность формул (особенно формул массива) создают определенные трудности при их
написании и отладке. Однако есть несколько простых трюков, которые могут заметно облегчить жизнь в такой
ситуации.
Это мегапростой и мегаудобный трюк, позволяющий быстро определить правильность формулы или понять,
что именно и как она считает. Пожалуй, для меня он является основным способом отладки сложных формул. И
основным инструментом при попытке разобраться в чужих формульных «кружевах».
Суть его насколько проста – настолько же и гениальна. Если выделить мышью фрагмент любой сложной
формулы…
…и нажать на клавиатуре клавишу F9, то Excel вычислит выделенную часть и покажет ее результат:
Очень важно после нажатия на F9 не забыть потом нажать Ctrl+Z, чтобы вернуть формулу в исходное состояние,
или Esc, чтобы выйти из ячейки без сохранения изменений.
12
Мастер Формул www.PlanetaExcel.ru
Пошаговое выполнение
Интересно взглянуть «за кулисы» любимого фильма или спектакля? В Excel любую длинную и сложную
формулу можно в специальном окне выполнить медленно и пошагово, наблюдая логику ее работы и
промежуточные значения вложенных функций. Для этого выделите ячейку с формулой и на вкладке Формулы
(Formulas) нажмите кнопку Вычислить формулу (Evaluate Formula). В появившемся диалоговом окне можно
несколько раз, не спеша, жать на кнопку Вычислить (Evaluate) и наблюдать за процессом «изнутри»:
13
Мастер Формул www.PlanetaExcel.ru
Это позволит быстро понять, с какими именно ячейками на листе работает данная формула, и изменить ее
сразу для всех ячеек, если нужно.
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
Если включить первый флажок В строке выше (Top row), то Excel автоматически присвоит каждому столбцу
таблицы имя, взяв его из первой строки, т.е. A2:A7 будет называться Месяц, диапазон B2:B7 – Москва и т.д.
Если при этом включить еще опцию В столбце слева (Left column), то аналогичная ситуация произойдет и по
горизонтали: строка B2:D2 получит имя Январь, строка B3:D3 – Февраль и т.д.
Единожды проведя такое именование, можно в будущем свободно использовать имена столбцов в любых
формулах. Например, чтобы найти все апрельские продажи в Самаре, нужна будет формула:
20
Мастер Формул www.PlanetaExcel.ru
=СУММЕСЛИ(Месяц;"Апрель";Самара)
Забавный момент состоит в том, что если установить в Excel масштаб просмотра меньше 40% (ползунком в
правом нижем углу или вращая колесико мыши с Ctrl),
Красиво.
И еще один не совсем очевидный с ходу трюк. Если создать именованный диапазон в Диспетчере Имен, но в
поле Диапазон ввести не адрес, а значение (число, текст или формулу), то мы создадим именованную
константу - имя, которое никуда не ссылается, но подразумевает под собой определенное значение:
Впоследствии можно пользоваться такой константой как переменной в любых формулах и расчетах:
=Цена*(1–НДС)
21
Мастер Формул www.PlanetaExcel.ru
Подобным образом удобно задавать константы, которые редко меняются, но часто встречаются в ваших
отчетах (ставки налогов и сборов, банковские проценты и т.д.).
22
Мастер Формул www.PlanetaExcel.ru
Проблема в том, что если скопировать диапазон D2:D8 с формулами куда-нибудь в другое место на лист, то
Microsoft Excel автоматически скорректирует ссылки в этих формулах, сдвинув их на новое место и перестав
считать:
Нам же хотелось скопировать диапазон с формулами так, чтобы формулы не изменились и остались теми же
самыми, сохранив результаты расчета.
Чтобы формулы при копировании не менялись, надо (временно) их деактивировать - сделать так, чтобы Excel
перестал их рассматривать как формулы. Это можно сделать, заменив на время копирования знак "равно" (=)
на любой другой символ, не встречающийся обычно в формулах, например, на "решетку" (#) или на пару
амперсандов (&&). Для этого:
23
Мастер Формул www.PlanetaExcel.ru
3. В появившемся диалоговом окне вводим что ищем и на что заменяем и в Параметрах (Options) не
забываем уточнить Область поиска – Формулы. Жмем Заменить все (Replace All).
4. Копируем получившийся диапазон с деактивированными формулами в нужное место:
24
Выборочный
подсчет по условиям
Если вдуматься, то любой отчет практически в любой сфере бизнеса – это, по сути, выборочное суммирование
или вычисления по условию. Microsoft Excel имеет много эффективных инструментов, позволяющих подобные
операции делать автоматически: быстро, без ошибок и с автоматическим обновлением результатов при
изменении исходных данных.
Для перехвата ошибки можно воспользоваться функцией ЕСЛИОШИБКА (IFERROR), которая заменит ошибку на
пустое значение (пустые кавычки, а не ноль, из-за которого «просядет» общее среднее):
26
Мастер Формул www.PlanetaExcel.ru
27
Мастер Формул www.PlanetaExcel.ru
При всей внешней простоте и прозрачности у функции СУММЕСЛИ есть и «темная сторона» - в некоторых
случаях она может вычислять сумму по условию неправильно. Для примера взгляните вот на такой случай:
Разница с предыдущим решением в том, что в качестве диапазона проверки выделен уже весь столбец (A:A), а
не конкретный диапазон A2:A12, т.е. количество ячеек в проверяемом и суммируемом диапазонах уже не
равно друг другу. Странно то, что в такой ситуации Excel выдает не ошибку (что было бы логично и объяснимо),
а продолжает вычисления, отображая некорректный результат.
Резюме: будьте осторожны с выделением диапазонов для функции СУММЕСЛИ (SUMIF).
28
Мастер Формул www.PlanetaExcel.ru
Как видно из предыдущего скриншота, первым аргументом этой функции идет Диапазон_суммирования, т.е.
те ячейки, которые мы фактически хотим складывать. Затем аргументы идут парами – диапазоны проверки и
условия, которые в них должны выполняться. Обратите внимание на полосу прокрутки справа – она позволит
добавить третью пару диапазон - условие, четвертую и т.д., если нужно.
Хорошим примером использования функции СУММЕСЛИ с двумя условиями является создание с ее помощью
упрощенного аналога сводной таблицы:
29
Мастер Формул www.PlanetaExcel.ru
Достаточно ввести одну функцию СУММЕСЛИ в ячейку H4 и протянуть ее на весь диапазон H4:J8, чтобы все
вычислить. Только не забудьте правильно закрепить диапазоны в формуле знаками $.
Ну и на больших таблицах, конечно, такой способ может ощутимо тормозить – тогда лучше все-таки
использовать сводные таблицы, поскольку они пересчитываются не в реальном времени, а только по запросу
пользователя.
Первый аргумент этой функции – таблица с исходными данными, второй – имя суммируемого поля (столбца),
третий – таблица с условиями.
Обратите внимание на следующие нюансы:
Шапка таблицы условий может не совпадать один в один с шапкой таблицы данных, но названия
столбцов должны быть абсолютно идентичны.
Допускается дублирование столбцов (см. столбцы Дата), если по ним нужно задать больше одного
условия.
Условия в ячейках одной строки воспринимаются как связанные логическим И (AND). Например, в
первой строке мы ищем сумму всех сделок Кузнецова в Москве, а во второй – всех сделок по Самаре в
первом квартале 2014 года.
30
Мастер Формул www.PlanetaExcel.ru
Условия, находящиеся в разных строках, Excel воспринимает как независимые, т.е. связанные
логическим ИЛИ (OR). Таким образом, на выходе мы получим сумму всех сделок по каждой из строк:
Результат = (Все сделки Кузнецова в Москве) + (Все сделки в 1 квартале 2014 по Самаре) + (Все сделки
Пупкина на сумму больше 1 млн).
Эта формула проверяет условия с помощью двух выражений (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
36
Мастер Формул www.PlanetaExcel.ru
А затем этот массив умножается на исходный диапазон, причем ИСТИНУ Excel интерпретирует как 1, а ЛОЖЬ
как 0, так что остаются в итоге только числа с диагонали, которые потом и суммирует функция СУММ.
37
Мастер Формул www.PlanetaExcel.ru
Легко сообразить, что если таблица расположена в другом месте листа (не начиная с А1), то необходимо будет
всего лишь ввести поправку на отступ в виде количества пустых строк и столбцов от начала листа до первой
ячейки с данными:
38
Мастер Формул www.PlanetaExcel.ru
Теперь используем наш главный козырь – функцию СМЕЩ (OFFSET), которая умеет выдавать ссылку на
заданный диапазон «окна». У этой функции пять аргументов:
1. Стартовая ячейка (нужна как точка отсчета – обычно берут первую ячейку списка).
2. Сдвиг окна вниз на А строк.
3. Сдвиг вправо на B столбцов.
4. Высота диапазона окна – C.
39
Мастер Формул www.PlanetaExcel.ru
Если брать в качестве стартовой ячейки A4, то наше окно, выделенное на предыдущей иллюстрации, сдвинуто
вниз на 4 строки, вправо – на 1 столбец и имеет размеры 4 строки × 1 столбец.
Таким образом, финальная формула для расчета стоимости будет выглядеть как:
40
Мастер Формул www.PlanetaExcel.ru
СУММ (SUM) – тупо суммирует все в выделенном диапазоне без разбора, т.е. и скрытые строки в том числе.
Если хотя бы в одной ячейке есть любая ошибка – перестает считать и тоже выдает ошибку на выходе.
ПРОМЕЖУТОЧНЫЕ.ИТОГИ (SUBTOTALS) с кодом 9 – суммирует все видимые после фильтра ячейки. Игнорирует
другие функции ПРОМЕЖУТОЧНЫЕ.ИТОГИ, которые могут считать внутренние подытоги в исходном
диапазоне.
ПРОМЕЖУТОЧНЫЕ.ИТОГИ (SUBTOTALS) с кодом 109 – суммирует все видимые после фильтра и группировки
(или скрытия) ячейки. Также игнорирует функции ПРОМЕЖУТОЧНЫЕ.ИТОГИ, которые могут считать
внутренние подытоги в исходном диапазоне.
АГРЕГАТ (AGREGATE) – самая мощная функция, появившаяся в Office 2010, имеет множество опций по
суммированию, которые можно указать вторым аргументом:
41
Мастер Формул www.PlanetaExcel.ru
42
Мастер Формул www.PlanetaExcel.ru
Оживляем призрака
Откройте вкладку Формулы (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), которое определяет, какую именно информацию о ячейке нам нужно
получить. Из наиболее полезных значений для него можно упомянуть:
43
Мастер Формул www.PlanetaExcel.ru
9-12 Тип линии, используемой для обрамления ячейки слева (9), справа (10), сверху (11) и
снизу (12)
14 Защищенная ячейка или нет
17 Высота ячейки (в пунктах)
18 Имя шрифта, применяемого для текста в ячейке
19 Размер шрифта (в пунктах)
20 Выделен ли текст в ячейке жирным
21 Выделен ли текст в ячейке курсивом
22 Подчеркнут ли текст в ячейке
28 Уровень вложенности при группировке строк
29 Уровень вложенности при группировке столбцов
33 Включен ли в ячейке перенос по словам
53 Содержимое ячейки, как оно выглядит на экране (с учетом разрядности и числового
формата)
62 Имя текущей книги и листа в виде «[Книга1.xlsx]Лист1»
63 Код цвета заливки ячейки
66 Имя текущей книги с расширением
Как видно из приведенной выше таблицы, наш выбор тут 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), но в очень многих чуть более сложных случаях эта функция
пасует и приходится искать решение другими способами.
Функция ВПР (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.
При этом важно помнить два щекотливых момента:
При использовании приблизительного поиска таблица, в которой производится поиск (прайс), должна
быть обязательно отсортирована по возрастанию по столбцу наименования. Если вы используете
точный поиск, то сортировка роли не играет, а для интервального просмотра она принципиальна.
Если вы ищете не числа, а текст и искомое значение отсутствует в таблице, то при точном поиске ВПР
выдаст просто ошибку #Н/Д, а при приблизительном – значение фактически «с потолка», т.к. будет
искать товар с ближайшими наименьшими кодами символов из его названия.
51
Мастер Формул www.PlanetaExcel.ru
Левый ВПР
Как многим известно, функция ВПР (VLOOKUP) может выдавать в качестве результата значения, которые
находятся строго правее того столбца, где производится поиск. Это обусловлено тем, что третий аргумент
функции, который задает номер столбца результатов, не может быть отрицательным. На практике же сплошь
и рядом возникают ситуации, когда искать данные надо в столбце, который находится правее, а не левее
столбца результатов, например:
На моих тренингах я слышу такой вопрос регулярно в формулировке: «А как сделать левый ВПР?»
52
Мастер Формул www.PlanetaExcel.ru
По сути, функция ВЫБОР виртуально меняет местами наши столбцы прайс-листа, чтобы потом ВПР могла
стандартно их обработать.
Тут логика работы формулы немного другая. Функция ПОИСКПОЗ ищет порядковый номер ячейки со словом
Бананы в столбце Товар (т.е. выдаст нам 4). Затем ИНДЕКС вытаскивает из столбца Цена ячейку с порядковым
номером, который определила ПОИСКПОЗ, т.е. четвертое число – цену бананов.
Способ 3. СУММЕСЛИ
Еще один вариант – использовать вместо ВПР функцию выборочного суммирования СУММЕСЛИ (SUMIF).
Технически эта функция предназначена не для выбора, а для суммирования чисел по условию. Но если товар
встречается в прайс-листе только один раз (а обычно так и есть), то СУММЕСЛИ просто выдаст его цену.
Диапазоны проверки условия и суммирования в этой функции задаются отдельно, так что ей будет все равно,
что в нашей таблице они поменяны местами:
53
Мастер Формул www.PlanetaExcel.ru
Важный нюанс этого способа состоит в том, что он подходит только для нахождения чисел, в то время как
предыдущие способы могут извлекать данные любого типа.
Несовпадение форматов
Иногда причиной возникновения ошибок #Н/Д при использовании ВПР бывает несовпадение форматов
данных. Обычно это встречается при поиске чисел, т.к. в Microsoft Excel число в ячейке может быть в двух
принципиально разных состояниях – как число и как текст. Причем зачастую визуально их различить почти
невозможно. Например, в исходной таблице числовой артикул в некоторых ячейках хранится в виде текста
(иногда на таких ячейках видно пометку зеленым уголком), а в поисковой таблице – в виде числа (или
наоборот):
Можно, конечно, долго и тщательно зачищать исходные данные, а можно преобразовать формат «на лету»
прямо в самой формуле.
Для преобразования числа-как-текст в нормальное число можно использовать двойной минус или двойное
бинарное отрицание. Фактически это то же самое, что два раза умножить число на -1. Само число при этом не
изменится, но сам факт проведения математической операции преобразует данные в число:
54
Мастер Формул www.PlanetaExcel.ru
Если же числа-как-текст у нас не в исходной (левой) таблице, а в поисковом диапазоне справа, то для обратного
преобразования из числа в текст можно использовать похожую хитрость - подклеивать к числу пустую строку с
помощью оператора склейки (&):
Идея та же: приклеивание к данным пустой строки их не меняет, но сам факт проведения с числом чисто
текстовой операции превращает число в текст. Просто и элегантно.
Ну а если в обеих таблицах творится полный ад и числовой и текстовый форматы беспорядочно перемешаны?
Тогда можно скомбинировать оба приведенных способа, вложив функции ВПР внутрь функции ЕСЛИОШИБКА
(IFERROR):
Другой способ: использовать формулу массива с функциями ИНДЕКС (INDEX) и ПОИСКПОЗ (MATCH), которая
будет в обеих таблицах все сначала принудительно приводить к текстовому формату, а потом уже производить
поиск нужной цены:
55
Мастер Формул www.PlanetaExcel.ru
Не забудьте после ввода этой формулы в ячейку нажать сочетание клавиш Ctrl+Shift+Enter, чтобы ввести ее как
формулу массива.
56
Мастер Формул www.PlanetaExcel.ru
ПОИСКПОЗ ищет заданное значение (название столбца из B1) в определенном диапазоне (шапка прайс-листа)
и выдает порядковый номер ячейки, где она это значение нашла, т.е. фактически номер столбца в прайсе,
который называется Цена.
Побочным эффектом от такого способа будет то, что при изменении текста в ячейке B1 со слова Цена на,
например, Цена розн, функция ВПР автоматически будет выдавать уже оптовую цену из другой колонки и т.д.
57
Мастер Формул www.PlanetaExcel.ru
Как и ожидалось, логическая ИСТИНА получилась там, где регистр совпадает с искомым значением один в
один.
Теперь используем функцию ПОИСКПОЗ (MATCH), чтобы найти порядковый номер строки с ИСТИНОЙ, и
добавим функцию ИНДЕКС (INDEX), чтобы извлечь из столбца с суммами элемент с порядковым номером,
который для нас перед этим нашла ПОИСКПОЗ:
От вспомогательного столбца тоже можно избавиться, добавив проверку функцией СОВПАД прямо в нашу
формулу. Только не забудьте ввести ее уже как формулу массива, т.е. с помощью Ctrl+Shift+Enter:
58
Мастер Формул www.PlanetaExcel.ru
Фрагмент формулы 1/СОВПАД(A2:A7;F2) проверяет точное совпадение с учетом регистра, как и раньше, но при
этом дополнительно производится деление 1 на полученное значение ИСТИНА или ЛОЖЬ. Поскольку Excel
интерпретирует ИСТИНУ как 1, а ЛОЖЬ как 0, то мы получаем в результате массив:
Ошибки деления на ноль соответствуют несовпадениям, а числа – точному соответствию с искомым значением.
Если совпадений несколько, то вместо 1 в массиве будут дроби. Затем функция ПРОСМОТР (LOOKUP) ищет
ближайшее наименьшее к 2 число и выдает соответствующее ему по положению значение из массива C2:C7,
т.е. нужную нам сумму.
Особенно приятно, что эту формулу можно ввести уже как обычную (не формулу массива), т.е. без
Ctrl+Shift+Enter.
В этом случае размеры таблицы нас уже не будут беспокоить в будущем – при добавлении новых товаров в
прайс-лист, либо их удалении размеры «умной таблицы» подстроятся автоматически.
Имя таблицы всегда можно посмотреть/изменить на вкладке Конструктор (Design), которая появится, если
щелкнуть левой кнопкой мыши в любую ячейку созданной умной таблицы.
59
Мастер Формул www.PlanetaExcel.ru
Само собой, можно не изощряться, а решить задачу «в лоб», просто сделав три ячейки с ВПР, каждая из которых
будет извлекать данные из своего столбца, а потом сложить получившиеся результаты.
А можно использовать изящную формулу массива, подставив вместо номера столбца массив констант {5;6;7}.
Тогда на выходе мы получим массив из трех значений-результатов, который потом и суммируем с помощью
функции СУММ.
В английской версии это будет:
=SUM(VLOOKUP(A2;$D$2:$J$7;{5;6;7};0))
И не забудьте после ввода формулы нажать сочетание Ctrl+Shift+Enter, чтобы ввести ее как формулу массива.
60
Мастер Формул www.PlanetaExcel.ru
Делалось по 3 повтора для вычислений для каждого способа, затем бралось среднее арифметическое время.
Замер производился специальным макросом-таймером. Результаты получились следующие:
Способ Длительность, сек
ВПР (Интервальный просмотр = 0) 5,44
ВПР (Интервальный просмотр = 1) 0,53
ВПР с ЕСЛИОШИБКА для перехвата #Н/Д 5,43
ИНДЕКС и ПОИСКПОЗ вместо ВПР 5,46
СУММЕСЛИ вместо ВПР 19,25
«Левый ВПР» с ВЫБОР 34,54
Конкретные числовые значения зависят от многих факторов (конфигурации ПК, версии Excel и т.д.) и большой
роли не играют, но соотношение полученных результатов весьма показательно. Выводы можно сделать
следующие:
ВПР с включенным интервальным просмотром минимум на порядок быстрее любых других способов.
Но при этом нужно помнить, что таблица, в которой производится поиск (прайс-лист в нашем примере),
обязательно должна быть отсортирована по возрастанию. Также необходимо помнить, что если в
прайсе не окажется какого-то из товаров, то ВПР с интервальным просмотром уже не выдаст ошибку
#Н/Д, а подставит цену ближайшего похожего товара (что вряд ли хорошо).
ВПР с точным поиском не отличается от связки ИНДЕКС+ПОИСКПОЗ по скорости. Но
ИНДЕКС+ПОИСКПОЗ могут искать значения и левее ключевого столбца, в отличие от ВПР, которая
выдает результаты только правее.
Функция ЕСЛИОШИБКА, добавляемая к ВПР для перехвата ошибки #Н/Д практически не влияет на
скорость.
Экзотические способы поиска и подстановки типа ВПР+ВЫБОР или СУММЕСЛИ – самые медленные.
Причем СУММЕСЛИ еще и работает только с числами. Лучше ими не увлекаться или заменять потом
формулы на значения, чтобы ускорить пересчет книги.
61
Мастер Формул www.PlanetaExcel.ru
Для решения достаточно будет ввести в первую ячейку 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
Функции ВПР (VLOOKUP) и ее горизонтальный аналог ГПР (HLOOKUP) ищут информацию только по одному
параметру и в одномерном массиве - по строке или по столбцу. А если нам необходимо выбирать данные из
двумерной таблицы по совпадению сразу двух параметров - и по строке и по столбцу одновременно?
Предположим, что у нас имеется вот такой двумерный массив данных по городам и товарам:
Пользователь вводит (или выбирает из выпадающих списков) в желтых ячейках нужный товар и город. В
зеленой ячейке нам нужно формулой найти и вывести число из таблицы, соответствующее выбранным
параметрам. Фактически мы хотим найти значение ячейки с пересечения определенной строки и столбца в
таблице.
В такой ситуации можно использовать два принципиально разных подхода.
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)).
После нажатия на ОК Excel автоматически присвоит каждому столбцу имя, взяв его из верхней строки, и каждой
строке – взяв его из левого столбца. Например, диапазон B2:B10 будет называться Москва, D2:D10 – Самара,
B2:F2 – Банан и т.д. Увидеть все созданные имена можно в Диспетчере имен на вкладке Формулы (Formulas –
Name Manager):
64
Мастер Формул www.PlanetaExcel.ru
65
Мастер Формул www.PlanetaExcel.ru
Функция ДВССЫЛ (INDIRECT) нужна, чтобы преобразовать текстовые названия именованных диапазонов в
настоящие ссылки.
66
Мастер Формул www.PlanetaExcel.ru
Причем в таблицах товары и магазины перемешаны, т.е. их последовательность различается. Количество строк
и столбцов тоже может быть разным.
На отдельном листе создана форма ввода, куда пользователь с помощью выпадающих списков вводит
желаемый город, товар и магазин в желтые ячейки 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
69
Мастер Формул www.PlanetaExcel.ru
По аналогии с поиском на нескольких листах давайте разберем поиск нужных данных, когда они разделены на
несколько таблиц. Принципиально важным моментом здесь будет - одинаковы ли эти таблицы по структуре
или нет?
Одинаковые таблицы
Предположим, что у нас есть четыре однотипных по конструкции таблицы с данными по продажам товаров в
трех странах (России=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)
Разные таблицы
Продолжим разбором более сложного случая, когда таблицы, в которых нужно искать данные, не одинаковые
по структуре и размеру:
Как и в предыдущем случае, основой нашего решения будет функция ИНДЕКС, извлекающая данные из
диапазона по номеру строки и столбца. Чтобы найти номер строки с нужным нам товаром, придется
использовать вот такую формулу:
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
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
77
Мастер Формул www.PlanetaExcel.ru
Для понимания зайдем немного издалека. Добавим к нашей таблице еще один столбец справа с формулой,
которая проверяет каждого клиента на предмет совпадения с нужным и выводит затем номер текущей строки:
Если выбрать из получившегося столбца первое наибольшее число с помощью функции НАИБОЛЬШИЙ
(LARGE), то мы получим как раз номер строки с последним вхождением нужного нам менеджера:
78
Мастер Формул www.PlanetaExcel.ru
Теперь останется вытащить из столбца стоимости значение по полученному номеру строки с помощью функции
ИНДЕКС (INDEX):
Ну и, само собой, можно свернуть все вышеописанное в одну формулу массива, не используя вспомогательных
столбцов и вычислений:
79
Мастер Формул www.PlanetaExcel.ru
80
Мастер Формул www.PlanetaExcel.ru
Функция ВПР (VLOOKUP) и ей подобные выдают при поиске только одно значение – первое найденное в списке
соответствие. Зачастую же в списке нужный нам объект (например, товар) может встречаться несколько раз и
хочется, чтобы на выходе мы видели сразу все найденные результаты, а не только первый. Функция ВПР с таким
не справится, но для формул массива пределов возможного нет.
Предположим, что у нас имеется вот такой список сделок по различным товарам:
В ячейке F2 создан выпадающий список, из которого пользователь выбирает нужный товар (например, Киви).
Нужно найти и вывести все суммы сделок по выбранному товару (на рисунке эти сделки подсвечены для
наглядности).
Чтобы решить задачу, для начала давайте найдем номера строк в таблице, где расположены сделки по Киви.
Добавим к нашей таблице справа дополнительный столбец, где с помощью функций ЕСЛИ проверим товар и
выведем номер строки в таблице, если это Киви:
81
Мастер Формул www.PlanetaExcel.ru
На ошибки #ЧИСЛО!, возникающие в лишних ячейках, куда мы протянули формулу «про запас», можно пока
внимания не обращать – мы их потом скроем.
82
Мастер Формул www.PlanetaExcel.ru
Теперь можно вытащить из столбца сумм нужные нам значения по их номерам с помощью функции ИНДЕКС
(INDEX):
Чтобы спрятать ошибку #ЧИСЛО!, возникающую, когда найденных значений меньше, чем формул, можно
использовать функцию ЕСЛИОШИБКА (IFERROR). Она будет выводить пустую строку вместо ошибки:
83
Мастер Формул www.PlanetaExcel.ru
Как видно из предыдущей картинки, для решения потребуется всего одна знакомая нам уже функция
ПОИСКПОЗ (MATCH), но в слегка непривычном варианте применения, а именно:
Искомое значение – это два склеенных между собой города из ячеек E2 и E3.
В качестве массива, где производится поиск, мы используем, опять же, два склеенных диапазона
B2:B16 и B3:B17. На практике это даст нам массив попарно сцепленных значений городов, который
можно легко увидеть, если выделить второй аргумент нашей функции в строке формул и нажать
клавишу F9:
Ну и поскольку обычные формулы не позволяют склеивать целые столбцы, то нашу функцию необходимо
ввести как формулу массива, т.е. с использованием сочетания клавиш Ctrl+Shift+Enter.
Легко сообразить, что подобным же образом можно искать вхождения и из трех элементов и более.
84
Мастер Формул www.PlanetaExcel.ru
Подстановка из ниоткуда
Фокусы — это, всего лишь, ловкость рук и
никакого мошенства!
(Поросенок Фунтик)
Это несложный, но интересный прием, позволяющий подставлять данные из небольших таблиц без
использования ячеек вообще. Его суть в том, что можно «зашить» массив подстановочных значений прямо в
формулу, используя массивы констант или именованные диапазоны. Рассмотрим несколько способов это
сделать.
Функция ВЫБОР
Если нужно подставить данные из одномерного массива по номеру, то можно использовать функцию ИНДЕКС
(INDEX) или ее более простой и подходящий в данном случае аналог – функцию ВЫБОР (CHOOSE). Она выводит
элемент массива по его порядковому номеру. Так, например, если нам нужно вывести название дня недели по
его номеру, то можно использовать вот такую конструкцию:
Хитрость в том, что можно заменить ссылку на диапазон с таблицей $E$3:$F$5 массивом констант прямо в
формуле, и правая таблица будет уже не нужна. Чтобы не вводить константы вручную, можно пойти на
небольшую хитрость. Выделите любую пустую ячейку. Введите с клавиатуры знак «равно» и выделите диапазон
с таблицей – в строке формул должен отобразиться его адрес:
85
Мастер Формул www.PlanetaExcel.ru
Выделите с помощью мыши ссылку E3:F5 в строке формул и нажмите клавишу F9 – ссылка превратится в массив
констант:
Осталось скопировать получившийся массив и вставить его в нашу формулу с ВПР, а саму таблицу удалить за
ненадобностью:
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
...в итоге мы получим 90, а не 100 - ибо функция не видит разницы между aC7 и AC7 и выводит первое
встретившееся значение из таблицы.
Формула, которая нам нужна, выглядит следующим образом:
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):
Перебирая в поисках совпадения все значения и не найдя точного соответствия, функция ПРОСМОТР выдаст
последнее встретившееся число в строке. Если вы маньяк-астроном, считаете расстояния до звезд и не знаете
даже примерно верхнего предела ваших данных, то можно использовать значение 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, то ПРОСМОТР найдет последнее ненулевое значение и выдаст его нам.
Единственное ощутимое отличие от предыдущей формулы состоит в том, что нулевые значения этот вариант
не воспринимает и считает пустыми ячейкам (см. строку Москва). Иногда это хорошо, иногда плохо – по
ситуации.
Первое же непустое значение найти будет чуть сложнее:
94
Мастер Формул www.PlanetaExcel.ru
2. Вычитая из единицы полученное значение, мы получим массив, где первая 1 будет соответствовать
первой непустой ячейке в строке:
3. Функция ПОИСКПОЗ (MATCH) ищет позицию единицы в этом массиве, но, в отличие от ПРОСМОТР,
останавливается после первого совпадения, т.е. выдаст число 4 – номер первой непустой ячейки.
4. Функция ИНДЕКС (INDEX) извлекает из диапазона B2:M2 значение с пересечения строки (1) и столбца
(4) с заданными номерами.
Не забудьте после ввода этой формулы нажать сочетание клавиш Ctrl+Shift+Enter, чтобы ввести ее как формулу
массива. Обычные формулы так не умеют!
Универсальный вариант
Если же ваша таблица не чисто текстовая или числовая, а содержит числа и текст вперемешку, то придется
думать над универсальным вариантом.
Первое непустое значение в строке можно извлечь с помощью уже упоминавшейся в предыдущем пункте
формулы массива – она для этого отлично подходит.
А вот чтобы извлечь последнее непустое значение, придется «шаманить» вот с такой формулой массива:
95
Мастер Формул www.PlanetaExcel.ru
3. Затем функция МАКС (MAX) выбирает наибольший номер столбца, т.е. мы получаем номер последней
заполненной ячейки в строке. Ну а потом функция ИНДЕКС (INDEX) извлекает по этому номеру
содержимое ячейки.
96
Мастер Формул www.PlanetaExcel.ru
Фильтрация формулами
Нет ничего интереснее, чем пробовать новое.
(Ганнибал Лектер)
Классический Фильтр с вкладки Данные (Data – Filter) – безусловно, одна из самых востребованных и часто
используемых возможностей Microsoft Excel при работе со списками. Однако встречаются ситуации, где
хотелось бы проводить фильтрацию автоматически, т.е. при изменении исходных данных или критериев
результаты отбора должны обновляться «на лету». Если не использовать для этого тяжелое оружие в виде
макросов на VBA, то можно попробовать обойтись несколькими формулами.
Допустим, что у нас есть диапазон с исходными данными (A3:D22), справа от него – критерии (J3 и L3), и в
ячейках I8:L14 нужно получить результаты отбора (подсвечены в таблице условным форматированием для
наглядности):
97
Мастер Формул www.PlanetaExcel.ru
Как легко сообразить, эта формула проверяет для каждой строки наши условия и выдает логическое значение
ИСТИНА или ЛОЖЬ. Используется функция И (AND), а не ИЛИ (OR), т.к. нам важно, чтобы оба условия
выполнялись одновременно.
Теперь немного изменим нашу формулу в E4, добавив к ней функцию суммирования с предыдущей ячейкой в
столбце:
Технически Excel воспринимает логическое значение ЛОЖЬ как 0, а ИСТИНА - как 1. Поэтому мы получаем
возрастающую последовательность чисел, которые увеличиваются на единицу на каждом совпадении с
критериями. Другими словами, для каждой извлекаемой строки мы получаем уникальный номер, используя
98
Мастер Формул www.PlanetaExcel.ru
который можно извлечь нужные нам данные. Это можно сделать буквально при помощи одной формулы,
введенной в ячейку I8 и скопированной потом на весь диапазон результатов вправо и вниз:
99
Мастер Формул www.PlanetaExcel.ru
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
Анализ предельных
значений
В бизнесе очень часто приходится выявлять и анализировать предельные значения:
Товары, которые лучше всего продаются
Лучших клиентов
Искать наименьшую цену на товар/услугу на рынке среди поставщиков и т.д.
Это можно делать разными способами, при наличии условий и ограничений и без.
104
Мастер Формул www.PlanetaExcel.ru
Если же нам нужно извлечь не числовые значения, а соответствующие им названия товаров (имена клиентов),
то придется использовать более сложную конструкцию, похожую на разобранный ранее пример с «левым ВПР»
(я использовал перенос строк с помощью Alt+Enter для наглядности):
{=ИНДЕКС($A$5:$A$25;
ПОИСКПОЗ(НАИБОЛЬШИЙ($B$5:$B$25;G10);
$B$5:$B$25;
0))}
105
Мастер Формул www.PlanetaExcel.ru
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), поэтому третья ячейка, выделенная «про запас», будет с ошибкой #Н/Д.
112
Мастер Формул www.PlanetaExcel.ru
Затем, само собой, отсортировать получившийся столбец по убыванию и посмотреть на первые строчки. Или
же вместо всех перечисленных действий использовать небольшую формулу массива:
Если использовать Alt+Enter для разнесения аргументов формулы на разные строки, то получится более
наглядно:
=ИНДЕКС(A2:A100;
ПОИСКПОЗ(МАКС(СЧЁТЕСЛИ(A2:A100;A2:A100));
СЧЁТЕСЛИ(A2:A100;A2:A100);
0))
Давайте разберем ее по кусочкам:
113
Мастер Формул www.PlanetaExcel.ru
114
Дубликаты
и уникальные
Есть ли повторы в моем списке? Сколько уникальных элементов в нем, на самом деле, содержится? Как их
вывести отдельным списком? Похожие вопросы регулярно возникают, пожалуй, перед всеми пользователями
Microsoft Excel. И если инструмент удаления дубликатов был добавлен, начиная с версии Excel 2007, то по
остальным задачам придется импровизировать.
Легко заметить, что, на самом деле, в нем упоминается всего лишь 5 городов. Чтобы вычислить это количество,
можно использовать простую, но красивую технику. Для понятности сначала добавим к нашей таблице еще
один столбец с функцией СЧЁТЕСЛИ (COUNTIF), которая вычислит количество вхождений каждого элемента в
общем списке:
Теперь добавим рядом еще один столбец, где с помощью простой формулы вычислим значение обратной
дроби 1/Число вхождений:
116
Мастер Формул www.PlanetaExcel.ru
Если теперь просуммировать все значения по этому столбцу, то мы как раз и получим количество уникальных
элементов в списке!
Теперь, когда логика вычислений стала понятна, можно свернуть все вышеперечисленные действия в одну
компактную формулу массива без дополнительных столбцов (не забудьте нажать Ctrl+Shift+Enter в конце):
Если в диапазоне могут встречаться пустые ячейки, то нашу формулу придется немного модернизировать, т.к.
на пустых ячейках будет возникать ошибка деления на ноль. С помощью функций ЕСЛИ (IF) и ЕПУСТО (ISBLANK)
придется дополнительно проверять ячейку на заполненность:
117
Мастер Формул www.PlanetaExcel.ru
118
Мастер Формул www.PlanetaExcel.ru
Легко заметить, что, как и в прошлом примере, в этом списке встречаются, на самом деле, всего лишь 5 городов
(Тамбов, Воронеж, Калуга, Смоленск и Тверь) – их отдельным списком нам и нужно получить.
Необходимое вступление
Прежде чем рассматривать решение этой задачи с помощью формул, необходимо честно отметить, что во
многих случаях другие способы могут оказаться удобнее и про них не стоит забывать. А именно:
Удаление дубликатов. Вкладка Данные – Удалить дубликаты (Data – Remove Duplicates) удаляет из
списка все повторы, оставляя только по одному вхождению каждого элемента. Плюс этого способа в
очевидной простоте – не нужны формулы, а лишь два движения мышью. Минусы же в том, что мы
удаляем элементы (это не всегда хорошо), и в том, что при изменении исходного списка придется
заново повторять всю процедуру. Формулы для удаления дубликатов не самые простые и быстрые, но
пересчитываются автоматически – иногда это принципиально важно.
Сводная таблица. Если построить на основе исходного списка сводную таблицу (вкладка Вставка –
Сводная таблица) и затем поместить поле Города в область строк, то мы также получим желаемое, т.к.
сводная таблица всегда отображает список элементов без повторов:
119
Мастер Формул www.PlanetaExcel.ru
При большом размере исходного списка этот способ может оказаться гораздо эффективнее, т.к.
формулы (особенно формулы массива) пересчитываются относительно медленно. Отрицательный
момент состоит в том, что сводные таблицы не пересчитываются автоматически и их придется вручную
обновлять (щелчок правой кнопкой мыши по сводной – Обновить) при изменении исходных данных.
Если же перечисленные выше способы вас не устраивают, то можно попробовать решить задачу удаления
дубликатов с помощью формул.
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));"")
Если же принципиально хочется не использовать дополнительных столбцов и сделать все одной формулой, то
придется пойти немного другим путем.
Функция ПОИСКПОЗ (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 на любом тренинге – «как сравнить два списка между собой?». Задача, с которой сталкивается
абсолютно любой пользователь, а некоторые – не один раз в день.
Прежде чем искать различия, ответим на фундаментальный вопрос – совпадают ли два списка или нет, в
принципе? Может и сравнивать ничего не нужно?
Для начала рассмотрим простой случай, когда в наших списках нет дубликатов, они одинакового размера и
отсортированы (т.е. элементы в них синхронизированы в одинаковом порядке). В этом случае найти количество
несовпадений можно с помощью одной формулы массива:
Фрагмент формулы A2:A10<>C2:C10 попарно сравнивает ячейки из двух списков и выдает на выходе результаты
проверки в виде логических значений ИСТИНА (если пара не совпадает) и ЛОЖЬ (если совпадает):
Чтобы преобразовать их в более удобные для подсчета 1 и 0, используется двойной минус. Фактически это
умножение на -1 дважды, что не меняет результат, но конвертирует его в число.
И, наконец, для суммирования полученных нулей и единиц используется функция СУММПРОИЗВ
(SUMPRODUCT), которая к тому же позволяет ввести нашу формулу массива без нажатия Ctrl+Shift+Enter.
Если же списки не отсортированы, т.е. элементы в них расположены в отличающемся порядке? Тогда нам
поможет функция СЧЁТЕСЛИ (COUNTIF), которая подсчитывает количество совпадений с заданным значением
в проверяемом диапазоне:
128
Мастер Формул www.PlanetaExcel.ru
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, то он есть в первом списке; если 0, то его там нет (т.е. это и
есть отличие). Естественно, к полученному столбцу можно потом применить фильтр, чтобы отобрать нужные
строки и работать дальше только с ними.
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);
"")}
135
Мастер Формул www.PlanetaExcel.ru
Однако такой способ трудно масштабируется: если надо вытащить общие элементы не из двух, а из трех,
четырех и более списков, то формула принимает совсем уж устрашающий вид. Тут лучше использовать немного
другой подход.
Во-первых, для наглядности и компактности давайте дадим нашим спискам имена, чтобы затем использовать
их в формулах. Выделите оба диапазона с их названиями, удерживая клавишу Ctrl и выберите на вкладке
Формулы – Создать из выделенного (Formulas – Create from selection). В открывшемся окне включите только
галочку В строке выше (First Row) и нажмите ОК:
Excel даст нашим спискам имена, взяв их из первых строк выделенных диапазонов, т.е. Список1 и Список2.
Проверить получившиеся именованные диапазоны можно с помощью Диспетчера Имен на вкладке Формулы
(Formulas – Name Manager):
136
Мастер Формул www.PlanetaExcel.ru
137
Мастер Формул www.PlanetaExcel.ru
138
Трансформация
таблиц формулами
Иногда таблицы, которые достаются нам для работы, необходимо бывает перестроить: отсортировать,
изменить их размеры, повернуть, сжать и т.п. Причем иногда хочется сделать это с помощью формул, а не
ручным перетаскиванием-копированием.
Номер последней ячейки (строки) вычисляет в данном случае функция СЧЁТЗ (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
Это работает вполне надежно, но что если вам нужно транспонировать диапазон, не теряя при этом связи с
исходными ячейками? Чтобы потом при изменении данных в начальном диапазоне (A1:C5) – автоматически
обновлялся бы транспонированный (F1:J3)?
В этом случае без формул не обойтись.
После ввода функции необходимо нажать не Enter, а Ctrl+Shift+Enter, чтобы ввести ее сразу во все выделенные
ячейки как формулу массива.
Если в исходной таблице были пустые ячейки, то при таком способе они будут отображаться как нули:
142
Мастер Формул www.PlanetaExcel.ru
Обойти этот момент можно, если добавить проверку на заполненность в нашу формулу:
Если этот момент вас сильно расстраивает, то следующий способ – для вас.
143
Мастер Формул www.PlanetaExcel.ru
Т.е. при копировании формулы вниз по столбцу она выдает ссылку, которая «уходит» вправо по строке. А когда
формулу копируем вправо, то она берет следующие строки, сдвигаясь вниз. Причем это обычная формула (не
формула массива), со всеми вытекающими плюсами, легкостью редактирования и т.д.
144
Мастер Формул www.PlanetaExcel.ru
Для начала добавим еще один столбец, где с помощью функции ЕСЛИ проверим – пуста ли ячейка, и выведем
либо логическое значение ЛОЖЬ, либо номер строки:
145
Мастер Формул www.PlanetaExcel.ru
Ну а зная номера строк, можно извлечь и названия товаров из столбца A с помощью функции ИНДЕКС (INDEX):
В первом приближении задача решена. Для полноты картины можно добавить еще парочку улучшений.
Если таблицы начинаются не с первой строки листа или имеют «шапки», то функция СТРОКА в столбце B будет
выдавать неправильное значение. Лучше заменить ее на разность СТРОКА(текущая ячейка)-СТРОКА(первая
ячейка в таблице):
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
Технически это функция подсчета количества ячеек, которые меньше текущей. Применительно к тексту понятие
«меньше» означает «выше по алфавиту», т.е. ближе к началу отсортированного списка. Таким образом, мы
получаем, по сути, порядковые номера, по которым и нужно расставить элементы для упорядочивания. Одно
«но»: если в нашем списке есть повторы (см. Елена), то они получат одинаковый номер, что не есть хорошо.
Чтобы выкрутиться, добавим еще одно слагаемое к нашей формуле:
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) вытаскивает из исходного списка
содержимое ячейки по этому номеру.
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) и вытаскивание потом из списка элементов с
полученными случайными номерами. Что-то типа:
Без повторов
Добавим вспомогательный столбец, где сгенерируем случайные числа от 1 до 14 с небольшой «добавкой»:
153
Мастер Формул www.PlanetaExcel.ru
Теперь определим ранг (положение в ТОПе) каждого из получившихся чисел в наборе с помощью функции
РАНГ (RANG):
У нее всего два аргумента: число, для которого определяем ранг и диапазон с числами, среди которых
считается рейтинг. Прибавление дроби к функции СЛУЧМЕЖДУ нужно, как легко догадаться, для обеспечения
уникальности, чтобы все ранги получились различными.
А теперь осталось лишь вытащить имена сотрудников из таблицы по полученным номерам с помощью функции
ИНДЕКС (INDEX):
154
Мастер Формул www.PlanetaExcel.ru
Для начала нам нужно сгенерировать нужное количество целых случайных неповторяющихся чисел в заданном
интервале (с 1 до 14, т.к. у нас в списке 14 человек). Это можно сделать с помощью вот такой формулы массива:
{=НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($E1:E1;СТРОКА($1:$14))=0;
СТРОКА($1:$14));
СЛУЧМЕЖДУ(1:15-СТРОКА(A1)))}
Затем функция НАИМЕНЬШИЙ (SMALL) выбирает из оставшихся чисел случайное по счету наименьшее.
Ну а когда случайные числа выбраны, то дальше можно легко вытащить из нашего исходного списка элементы
со случайными позициями с помощью функции ИНДЕКС (INDEX):
155
Мастер Формул www.PlanetaExcel.ru
156
Мастер Формул www.PlanetaExcel.ru
Сделаем немного странную, на первый взгляд, штуку – заменим каждый пробел в нашем тексте на, скажем, 30
дефисов. Реализовать это можно с помощью функции ПОДСТАВИТЬ (SUBST), которая находит нужный текст в
строке и заменяет его на заданные символы. Чтобы не вбивать руками двадцать дефисов, используем функцию
ПОВТОР (REPT), которая умеет повторять заданный символ N раз:
Теперь разделим получившийся текст на три куска по 30 символов каждый с помощью функции ПСТР (MID):
Т.е. первый фрагмент – это символы с 1-го по 30-й, второй фрагмент – символы с 31-го по 60-й, третий – с 61-го
по 90-й. Как видно, свет в конце тоннеля уже забрезжил, правда?
Теперь давайте заменим дефисы, которые я здесь использовал для наглядности, на пробелы, подправив
функцию в ячейке A2, а от получившихся лишних пробелов избавимся с помощью функции СЖПРОБЕЛЫ
(TRIM):
157
Мастер Формул www.PlanetaExcel.ru
Осталось завернуть всю эту логику в одну красивую и компактную формулу, которую можно скопировать потом
вправо и вниз на любое необходимое количество столбцов:
158
Формулы для
работы с датами
Если даты в ваших ячейках не для красоты, и вам периодически приходится выполнять с ними какие-либо
хитрые вычислительные операции, то изложенные далее приемы могут весьма пригодиться.
Необходимое вступление
Прежде чем переходить к сложным операциям с датами, необходимо сказать два слова о внутренней логике
и принципах хранения и обработки дат в 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 суток, но где гарантия, что этот день не
выпадет на субботу или воскресенье?
Если иметь ввиду классическую рабочую неделю (пн-пт – работаем, сб-вс – отдыхаем), то первое, что приходит
в голову для нахождения ближайшего предыдущего рабочего дня к заданной дате, - это использовать формулу,
подобную этой:
161
Мастер Формул www.PlanetaExcel.ru
По идее, эта функция нужна, чтобы откладывать N рабочих дней от заданной даты, причем N может быть как
положительным (сдвиг в будущее), так и отрицательным числом (сдвиг в прошлое). Таким образом, если взять
следующий календарный день после исходной даты и сдвинуть на один рабочий день в прошлое, то мы
получим либо ближайшую пятницу (если исходной датой была суббота или воскресенье), либо тот же самый
день (если были будни).
Для округления до ближайшего следующего рабочего дня можно использовать аналогичную конструкцию:
При необходимости, можно учитывать и наши российские государственные праздники, указывая их списком в
третьем аргументе функции РАБДЕНЬ:
162
Мастер Формул www.PlanetaExcel.ru
163
Мастер Формул www.PlanetaExcel.ru
164
Мастер Формул www.PlanetaExcel.ru
165
Мастер Формул www.PlanetaExcel.ru
Можно, конечно, пойти простым путем и начать решать нашу задачу «в лоб». Т.е. сделать столбец с датами на
весь год (протягиванием за «черный крестик» вниз) и использовать функцию ТЕКСТ, чтобы преобразовать дату
из классического формата ДД.ММ.ГГГГ в день недели:
Ну а потом останется только подсчитать количество нужных значений в диапазоне B5:B359, например, с
помощью функции СЧЁТЕСЛИ (COUNTIF) или сводной таблицы.
166
Мастер Формул www.PlanetaExcel.ru
При внешней простоте минусы такого способа решения нашей задачи очевидны:
много ручной работы, а значит велика вероятность ошибки;
при изменении начальной и конечной дат придется заново формировать цепочку дат в столбце А;
если интервал дат большой (лет 5-10 хотя бы), то все становится очень громоздко и т.д.
На самом деле все можно сделать с помощью одной хитрой формулы, которая к тому же сама будет
пересчитываться «на лету», без всяких вспомогательных столбцов и лишних действий.
Для начала, чтобы понять всю последующую логику объяснения, вспомним, как Excel на самом деле хранит
даты – как целые положительные числа, представляющие собой количество дней от точки отсчета дат в Excel
(1 января 1900 года). Поменяем-ка для наглядности формат ячеек B1 и B2 на общий или числовой, чтобы это
увидеть:
Таким образом, с точки зрения Excel, мы должны проверить интервал дат с 42370-го по 42724-й дни.
Кроме дат, числами в Excel обозначается еще одна знакомая вам вещь – номера строк. Попробуйте, для
примера, начать вводить в любую свободную ячейку вот такую формулу:
167
Мастер Формул www.PlanetaExcel.ru
Фрагмент B1&":"&B2 склеивает числовые коды начальной и конечной дат, добавляя между ними двоеточие, а
функция ДВССЫЛ (INDIRECT) превращает все это из текста в живую ссылку (как на предыдущей картинке).
Нам нужны не сами строки, а их номера, которые соответствуют дням 2016 года, поэтому добавим к нашей
конструкции функцию СТРОКА (ROW), которая будет выдавать номера указанных строк:
Чтобы убедиться в правильности, можно выделить нашу формулу от знака равно и до конца и нажать клавишу
F9 (только не пугайтесь):
Как видите, мы получили коды дат всех нужных нам дней 2016 года, которые можно далее проверять. Только
не забудьте сначала нажать сочетание Ctrl+Z, чтобы вернуться к формуле.
Теперь добавим функцию ТЕКСТ (TEXT) для преобразования даты в день недели:
Аналогично, можно проверить то, что получилось, выделив формулу и нажав F9. Получим названия дней
недели:
И осталось добавить проверку с помощью функции ЕСЛИ (IF) и суммирование – и наша формула готова:
168
Мастер Формул www.PlanetaExcel.ru
Первый и второй аргументы нашей функции ЧИСТРАБДНИ.МЕЖД – это начальная и конечная даты, с ними все
просто. А вот третий аргумент – это текстовая строка, которая описывает рабочую неделю: нули
воспринимаются как рабочие дни, а единицы – как выходные. Если представить на минуту, что мы не ходим в
фитнесс-клуб заниматься по вторникам и четвергам, а там работаем в эти же дни, то наша рабочая неделя
выглядела бы как «1010111» и наша функция как раз и посчитала бы количество нужных нам дней в 2016 году.
169
Мастер Формул www.PlanetaExcel.ru
Теперь в ячейку 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
Код 4237 соответствует 04.01.2016, т.е. первому понедельнику января 2016 года, код 42380 – второму
понедельнику и т.д.
Чтобы выбрать третий по счету понедельник, мы используем функцию НАИБОЛЬШИЙ (LARGE), которая умеет
извлекать из массива чисел N-е по счету наименьшее число, где N берем из ячейки $F$3.
171
Мастер Формул www.PlanetaExcel.ru
Визуально хорошо видно, что рабочие смены Ярослава и Елены пересекаются, но как это вычислить, не
прибегая к построению полного графика? Вставим в нашу таблицу еще один столбец с функцией СУММПРОИЗВ
(SUMPRODUCT), которая это определит:
172
Мастер Формул www.PlanetaExcel.ru
А поскольку любая дата в Microsoft Excel по сути представляет собой число (количество дней от 01.01.1900), то
подобный подход так же хорошо будет работать и для интервалов дат вместо порядковых номеров дней в
месяце:
У медианы есть несколько полезных свойств. Например, в статистике часто используют медиану вместо
среднего арифметического, поскольку она не так чувствительна к выбросам – редким нетипичным всплескам
или провалам значений. Мы же используем медиану для расчета пересечения дат.
Поскольку даты в Excel, как известно, представляют собой числа, то начать для понимания можно с них.
173
Мастер Формул www.PlanetaExcel.ru
Предположим, что у нас имеются два числовых интервала (3-8 и 7-12), каждый из которых задается числами
начала и конца. Нужная нам формула, вычисляющая длину их пересечения, будет выглядеть следующим
образом:
Если один интервал полностью содержится внутри другого – выдаст длину меньшего из них, поглощенного
большим:
Если условно обозначить начало первого интервала за Н1, а конец за К1 и начало второго за Н2 и конец за К2,
то в общем виде наша формула может быть записана как:
=МЕДИАНА(Н1;К1+1;К2+1)-МЕДИАНА(Н1;К1+1;Н2)
174
Мастер Формул www.PlanetaExcel.ru
Само собой, наша формула может быть без каких-либо доработок успешно применена и к поиску пересечения
не чисел, а дат:
175
Мастер Формул www.PlanetaExcel.ru
Задача состоит в том, чтобы определить, какие именно контракты действуют на заданную (текущую) дату.
Для лучшего понимания зайдем немного издалека. Добавим к нашей таблице еще один вспомогательный
столбец со следующей формулой:
176
Мастер Формул www.PlanetaExcel.ru
А чтобы извлечь имена клиентов, используем функцию ИНДЕКС (INDEX), которая выдает из вертикального
массива-диапазона содержимое ячейки по номеру:
В принципе, мы получили уже работающее решение. Если хочется большей красоты, то можно избавиться от
вспомогательного столбца, вложив имеющуюся в нем формулу внутрь функции НАИМЕНЬШИЙ:
При этом, однако, она уже должна вводиться как формула массива (с Ctrl+Shift+Enter).
Ну и от ошибок #ЧИСЛО! на избыточных ячейках можно избавиться стандартным образом – с помощью
функции ЕСЛИОШИБКА (IFERROR), как мы уже неоднократно делали ранее.
177
Мастер Формул www.PlanetaExcel.ru
Такую формулу можно просто ввести в любую ячейку и скопировать вниз на нужное количество ячеек. Однако,
как видно из предыдущей иллюстрации, некоторые дни запросто могут выпасть на выходные.
Если нужны только рабочие дни, то формула будет посложнее, да еще и вводиться должна как формула
массива (с Ctrl+Shift+Enter):
178
Мастер Формул www.PlanetaExcel.ru
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
Эту проблему легко разрешить с помощью функции ТЕКСТ (TEXT), которая умеет представлять даты и числа в
заданном формате. В нашем случае это может быть, например, один из вариантов:
Как легко сообразить, буквы Д, М и Г отвечают за вывод дней, месяцев и лет соответственно. Причем
количество букв позволяет вывести значение нужным образом:
Формат Как выглядит
Д День месяца в виде 1-31 (без нулей впереди)
ДД День месяца в виде 01-31 (с нулем впереди)
ДДД День недели сокращенно (пн, вт, ср…)
ДДДД День недели полностью (понедельник, вторник…)
М Номер месяца в виде 1-12
ММ Номер месяца в виде 01-12
МММ Сокращенное название месяца (янв, фев, мар и т.д.)
ММММ Полное название месяца словом (январь, февраль…)
ГГ Две последних цифры года
ГГГГ Год полностью четырьмя цифрами
180
Продвинутое управление
связями с помощью формул
Если в вашей книге Excel множество листов с таблицами, данные из которых надо подтянуть в один итоговый
отчет, то вместо мучительно-монотонного создания ссылок вручную можно воспользоваться несколькими
более изящными техниками.
Различные способы создания ссылок между листами вашей книги (вручную, специальной вставкой).
Как собрать данные сразу с нескольких листов сквозными 3D-ссылками.
Как консолидировать таблицы из разных файлов и управлять связями между ними.
Как создать динамическое оглавление книги с гиперссылками с помощью формул.
Как визуализировать сложные связи между листами и книгами с помощью надстройки Inqure.
Мастер Формул www.PlanetaExcel.ru
Если книга закрыта, то к имени добавится еще и путь к файлу (не забудьте про апострофы!):
182
Мастер Формул www.PlanetaExcel.ru
Для суммирования сразу по всем магазинам можно использовать одну трехмерную формулу:
Если в именах листов будут содержаться пробелы (например, между названием магазина и номером), то
интервал листов в формуле нужно будет заключить в апострофы:
183
Мастер Формул www.PlanetaExcel.ru
184
Мастер Формул www.PlanetaExcel.ru
Затем выделяем пустую ячейку на листе, куда хотим собирать, щелкаем правой кнопкой мыши и в разделе
Специальная вставка выбираем Вставить связь (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
190
Мастер Формул www.PlanetaExcel.ru
Обратите особое внимание на то, что Excel при сборке данных ориентируется на совпадение названий из
верхней строки и левого столбца выделенных диапазонов. Так что выделить их нужно так, чтобы в первой
строке оказались именно месяцы, а в первом столбце – именно статьи расходов, по которым нужно провести
суммирование.
Чтобы в итоговой таблице отобразились названия статей расходов бюджета и месяцы, необходимо включить
оба флажка Использовать в качестве имен (Use labels). Флаг Создавать связи с исходными данными (Create
links to source data) очень важен, т.к. именно благодаря ему в итоговом отчете будут автоматические ссылки
на ячейки исходных книг вместо констант.
После нажатия на ОК увидим результат консолидации:
Легкая грусть из-за отсутствия форматирования при ближайшем рассмотрении с лихвой компенсируется двумя
жирными плюсами.
Во-первых, каждая статья расходов теперь представляет собой группу, которую можно развернуть с помощью
знаков «плюс» слева от строки и увидеть суммы по каждому филиалу и общую сумму с формулой итога:
191
Мастер Формул www.PlanetaExcel.ru
Во-вторых, ячейки под группировкой содержат прямые ссылки на исходные файлы с данными и,
следовательно, будут автоматически обновляться:
А теперь попробуйте представить, сколько времени ушло бы на ручное прописывание ссылок на все эти ячейки
в трех файлах, особенно с учетом того, что таблицы не одинаковые!
192
Мастер Формул www.PlanetaExcel.ru
В этом окне отображаются все внешние файлы, на которые есть ссылки в текущей книге:
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
Теперь для получения, например, имени листа в будущем уже не придется вводить нашу длинную формулу
руками или откуда-то копировать – достаточно просто ввести ее имя Имя_листа, где это необходимо.
196
Мастер Формул www.PlanetaExcel.ru
197
Мастер Формул www.PlanetaExcel.ru
Неплохо. Однако, как можно заметить, функция выдает не только имя листа, но и имя книги, которое нам не
нужно. Чтобы его убрать, воспользуемся функциями ЗАМЕНИТЬ (SUBST) и НАЙТИ (FIND), которые найдут
символ закрывающей квадратной скобки ( ] ) и заменят весь текст до этого символа включительно на пустую
строку (""). Откроем еще раз Диспетчер имен с вкладки Формулы (Formulas - Name Manager), двойным
щелчком откроем созданный диапазон Оглавление и изменим его формулу на:
=ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ("]";ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));"")
Или в англоязычном варианте:
=SUBST(GET.WORKBOOK(1);1;FIND("]";GET.WORKBOOK(1));"")
Теперь наш список листов будет выглядеть существенно лучше:
198
Мастер Формул www.PlanetaExcel.ru
Первый аргумент этой функции – это имя листа с адресом ячейки, куда должен быть переход, например
#Москва!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), чтобы создать
живую ссылку, которая будет при щелчке по ней перебрасывать нас на лист Клиенты к нужной строке:
201
Мастер Формул www.PlanetaExcel.ru
Больше всю эту процедуру проделывать не нужно, одного раза вполне достаточно. После подключения
надстройки у вас должна появиться новая одноименная вкладка с кучей интересных кнопок:
202
Мастер Формул www.PlanetaExcel.ru
Для более детального анализа лучше использовать кнопку Worksheet Relationship, которая отображает
диаграмму связей уже на уровне листов:
203
Мастер Формул www.PlanetaExcel.ru
Полученная диаграмма является до некоторой степени интерактивной. Листы и книги в ней можно
перемещать, а ветви сворачивать и разворачивать с помощью желтых минусов. При наведении мыши на любой
лист появляется всплывающая подсказка с подробной информацией: имя файла, расположение, количество
ссылок и т.д. Диаграмму также можно распечатать или удобно масштабировать с помощью кнопок управления
в правом нижнем углу окна.
К сожалению, управления связями (редактирование путей к файлам, разрыв и т.д.) с помощью этой диаграммы
реализовать не получится. Но визуализация ссылок - отменная. Пользуйтесь.
204
Другие трюки
с формулами
В этой главе вы найдете несколько полезных трюков и задач, которые я затруднился отнести к какой-то из
предыдущих глав. Так что будет всего понемножку.
Мы подробно разберем:
Несколько способов сделать динамический диапазон, который будет сам подстраиваться в размерах
под имеющееся количество данных.
Как правильно вытаскивать данные из сводной таблицы при помощи функции
ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ
Как извлекать числа из буквенно-цифровой «каши».
Мастер Формул www.PlanetaExcel.ru
Если вам не нужен полосатый дизайн, который добавляется к таблице побочным эффектом, то его можно
отключить на появившейся вкладке Конструктор (Design):
Каждая созданная таким образом таблица получает имя, которое можно заменить на более удобное там же на
вкладке Конструктор (Design):
206
Мастер Формул www.PlanetaExcel.ru
Если выделить фрагмент такой таблицы (например, первые два столбца) и создать диаграмму любого типа, то
при дописывании новых строк они автоматически будут добавляться к диаграмме.
207
Мастер Формул www.PlanetaExcel.ru
При создании выпадающих списков (вкладка Данные – Проверка данных) прямые ссылки на элементы умной
таблицы использовать нельзя, но можно легко обойти это ограничение с помощью тактической хитрости –
использовать функцию ДВССЫЛ (INDIRECT), которая превращает текст в ссылку:
Т.е. ссылка на умную таблицу в виде текстовой строки (в кавычках!) превращается в полноценную ссылку, а уж
ее выпадающий список нормально воспринимает.
208
Мастер Формул www.PlanetaExcel.ru
=ПОИСКПОЗ(“март”;A1:A5;0)
… выдаст в качестве результата число 4, т.к. слово «март» расположено в четвертой по счету ячейке в столбце
A1:A5.
Хитрость в том, что последний аргумент функции (0) означает, что мы ведем поиск точного соответствия. Если
этот аргумент не указать, то функция переключится в режим поиска ближайшего наименьшего значения – это
как раз и можно успешно использовать для нахождения последней занятой ячейки в нашем массиве.
Суть трюка проста. ПОИСКПОЗ перебирает в поиске ячейки в диапазоне сверху вниз и, по идее, должна
остановиться, когда найдет ближайшее наименьшее значение к заданному. Если указать в качестве искомого
значение заведомо больше, чем любое имеющееся в таблице, то ПОИСКПОЗ дойдет до самого конца таблицы,
ничего не найдет и выдаст порядковый номер последней заполненной ячейки. А нам это и нужно!
Если в нашем массиве только числа, то можно в качестве искомого значения указать число, которое заведомо
больше любого из имеющихся в таблице:
Для гарантии можно использовать число 9E+307 (9 умножить на 10 в 307 степени, т.е. 9 с 307 нулями) –
максимальное число, с которым в принципе может работать Excel.
Если же в нашем столбце текстовые значения, то в качестве эквивалента максимально большого числа можно
вставить несколько букв "яяяяя". Поскольку при поиске Excel фактически сравнивает коды символов, то любой
текст в нашей таблице будет технически «меньше» такой длинной «яяяяя» строки, и мы получим номер
последней занятой ячейки:
209
Мастер Формул www.PlanetaExcel.ru
Осталось нажать на ОК и готовый диапазон можно использовать в любых формулах, выпадающих списках или
диаграммах.
210
Мастер Формул www.PlanetaExcel.ru
Но вашему руководителю не нравится внешний вид отчета, и он хочет скорее что-то похожее на:
211
Мастер Формул www.PlanetaExcel.ru
напильником" дизайн сводной - долгий и мучительный процесс. И не факт, что красота не слетит после
пересчета и обновления.
Из всей сводной для отчета вам нужны не все данные, а только конкретные модели Ford по Питеру -
придется руками фильтровать.
Стандартные итоги в сводной нам не подходят, т.к. нужны суммы по выручке в зеленых ячейках, но
среднее по месяцу в итогах - сводная так не умеет.
Полученные в сводной результаты - еще не конец, нам необходимо произвести с ними какие-то
дополнительные вычисления: пересчитать выручку в тысячах, добавить прогноз на апрель, сравнить
этот год с прошлым. Многое из перечисленного в сводных или невозможно в принципе (особенно для
сводных на основе OLAP-кубов), или делается весьма мучительно и долго с помощью вычисляемых
полей и объектов.
Нужно построить по результатам хитрую диаграмму (обычные сводные диаграммы имеют много
ограничений).
Таким образом, перед нами стоит задача вытащить данные из сводной таблицы в другую таблицу - нужной нам
конструкции, с дополнительными формулами и корпоративным дизайном. Сделать это можно разными
способами.
Функция ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ
Изящным решением всех этих проблем может стать функция ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ
(GETPIVOTDATA), которая умеет извлекать нужные нам данные из сводной, чтобы использовать их в других
таблицах или расчетах.
212
Мастер Формул www.PlanetaExcel.ru
Чтобы ее использовать, убедитесь что при выделении любой ячейки сводной таблицы на вкладке Анализ
(Analysis) или Параметры (Options) в выпадающем списке Параметры (Options) включена галочка Создать
GetPivotData:
Теперь выделите первую ячейку зеленого диапазона, введите знак "равно" и щелкните по ячейке в сводной,
которая содержит нужные данные, т.е. по B8, где лежит выручка Fiesta за январь. Вместо привычной ссылки а-
ля морской бой Excel вставит функцию ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ:
Аккуратно замените в формуле "Fiesta" на $С7 (т.е. на ячейку с названием модели), а единичку на D$5 (т.е.
ячейку с номером месяца) и допишите в конце формулы деление на 1000, т.к. нам нужно отобразить данные в
тысячах. Затем нажмите на Enter и протяните формулу на оставшиеся зеленые ячейки.
Функция извлечет из сводной нужные нам данные, заполнив нашу корпоративную форму отчета.
Теперь с данными в диапазоне D7:F10 можно работать как с обычными формулами, а не как со сводной
таблицей с ее жесткими ограничениями. Дальше можно спокойно считать любые итоги, динамику, прогнозы,
строить любую диаграмму и т.д.
Ссылка на итоги
Если нужно сделать аналогичную живую ссылку на итоги в сводной по заданному полю, то придется пойти на
небольшую хитрость. Прямое использование функции ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ на итогах
выдает ошибку #ССЫЛКА, хотя текст в ячейке E3 полностью идентичен названию столбца в сводной:
Если же добавить к нашей формуле безобидное приклеивание пустой строки к E3, то все, на удивление,
заработает:
Использование дат
Если нужно использовать функцию ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ для извлечения информации по
заданной дате, то также могут возникнуть небольшие сложности. Поскольку любая дата в Excel, на самом деле,
214
Мастер Формул www.PlanetaExcel.ru
представляется числовым кодом, то прямое прописывание нужной даты в аргументах функции может не
сработать:
215
Мастер Формул www.PlanetaExcel.ru
Единственный не совсем очевидный момент в этой формуле состоит в использовании двойного минуса в
начале. Дело в том, что после извлечения полученное значение технически является не числом, а еще пока
текстовой строкой. Чтобы преобразовать ее в полноценное число, можно использовать простой трюк –
произвести с ней какую-нибудь безобидную математическую операцию. Сгодится все что угодно, например,
умножение на 1 или прибавление 0, лишь бы это не меняло исходное значение. Я использовал вариант с двумя
минусами, т.е. двукратное умножение на -1.
И еще один неприятный момент возникает на последних двух строчках – из-за наличия лишних пробелов
извлекается только часть числа. Эту проблему легко решить, если избавиться от пробелов в принципе, заменив
их все на пустую строку, т.е. вместо ссылки на исходный текст в A2 использовать функцию ПОДСТАВИТЬ
(SUBSTITUTE):
216
Мастер Формул www.PlanetaExcel.ru
Логика расчета такова: пройти последовательно по буквам в ячейке от начала к концу, проверяя каждый раз
следующие шесть символов на предмет того, являются ли они числом. Как только наткнемся на такое 6-значное
число – это и есть наш почтовый индекс!
Для начала реализуем все на простых формулах (не очень компактно, зато понятно):
217
Мастер Формул www.PlanetaExcel.ru
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)}
219
Мастер Формул www.PlanetaExcel.ru
Функция СТРОКА($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
Синтаксис:
=ЕСЛИ(Условие;Значение_если_условие_выполняется;Значение_если_условие_не_выполняется)
Для проверки нескольких условий сразу необходимо либо вкладывать эти функции друг в друга:
ЕСЛИОШИБКА (IFERROR)
Позволяет перехватывать ошибки в сложных формулах и заменять их на желаемые значения, например на ноль
или пустую текстовую строку. Например, для подавления ошибок #Н/Д, образующихся в результате
использования функций ВПР, ИНДЕКС, деления на ноль и т.д.
Синтаксис:
=ЕСЛИОШИБКА(Проверяемое_выражение;Что_вывести_вместо_ошибки)
225
Мастер Формул www.PlanetaExcel.ru
ЕЧИСЛО (ISNUMBER)
Проверяет содержимое указанной ячейки, и если это число, то выводит логическое значение ИСТИНА (TRUE),
иначе ЛОЖЬ (FALSE).
Т.к. Microsoft Excel кодирует внутри себя любую дату в виде числового кода, то эта функция выдаст ИСТИНУ и
на ячейках с датами тоже.
ИНДЕКС (INDEX)
Это одна из самых интересных и многоликих функций Microsoft Excel, которая, при правильном использовании,
может очень пригодиться и выручить в очень многих ситуациях. У нее несколько принципиально отличающихся
вариантов применения, причем далеко не все из них нормально описаны во встроенной справке Excel.
Вариант 1. Извлечение данных из столбца по номеру ячейки
Самый простой случай использования функции ИНДЕКС – это ситуация, когда нам нужно извлечь данные из
одномерного диапазона-столбца, если мы знаем порядковый номер ячейки:
=ИНДЕКС(диапазон_столбец;порядковый_номер_ячейки)
226
Мастер Формул www.PlanetaExcel.ru
Обратите особое внимание, что в этом случае первый аргумент – список диапазонов - заключается в скобки.
Вариант 4. Ссылка на столбец/строку
Если во втором варианте использования функции ИНДЕКС номер строки или столбца задать равным нулю (или
просто не указать), то функция будет выдавать уже не значение, а ссылку на диапазон-столбец или диапазон-
строку соответственно:
Обратите внимание, что поскольку ИНДЕКС выдает в этом варианте не конкретное значение ячейки, а ссылку
на диапазон, то для подсчета потребуется заключить ее в дополнительную функцию, например СУММ, СРЗНАЧ
и т.п.
227
Мастер Формул www.PlanetaExcel.ru
ЛЕВСИМВ (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)
Вычисляет среднее арифметическое чисел в заданном диапазоне, выбирая их по указанным условиям.
Например, можно вычислить среднее только по Москве с помощью формулы:
СТОЛБЕЦ (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 и возрастающие потребности бизнеса.