Если вам необходимо постоянно добавлять значения в столбец, то для правильной работы Ваших формул, Вам наверняка понадобятся динамические диапазоны, которые автоматически увеличиваются или уменьшаются в зависимости от количества ваших данных.
Динамический диапазон —
это
Именованный диапазон
с изменяющимися границами. Границы диапазона изменяются в зависимости от количества значений в определенном диапазоне.
Динамические диапазоны используются для создания таких структур, как:
Выпадающий (раскрывающийся) список
,
Вложенный связанный список
и
Связанный список
.
Задача
Имеется таблица продаж по месяцам некоторых товаров (см.
Файл примера
):
Необходимо найти сумму продаж товаров в определенном месяце. Пользователь должен иметь возможность выбрать нужный ему месяц и получить итоговую сумму продаж. Выбор месяца пользователь должен осуществлять с помощью
Выпадающего списка
.
Для решения задачи нам потребуется сформировать два
динамических диапазона
: один для
Выпадающего списка
, содержащего месяцы; другой для диапазона суммирования.
Для формирования динамических диапазонов будем использовать функцию
СМЕЩ()
, которая возвращает ссылку на диапазон в зависимости от значения заданных аргументов. Можно задавать высоту и ширину диапазона, а также смещение по строкам и столбцам.
Создадим
динамический диапазон
для
Выпадающего списка
, содержащего месяцы. С одной стороны нужно учитывать тот факт, что пользователь может добавлять продажи за следующие после апреля месяцы (май, июнь…), с другой стороны
Выпадающий список
не должен содержать пустые строки.
Динамический диапазон
как раз и служит для решения такой задачи.
Для создания динамического диапазона:
-
на вкладке
Формулы
в группе
Определенные имена
выберите команду
Присвоить имя
; -
в поле
Имя
введите:
Месяц
; -
в поле
Область
выберите лист
Книга
; -
в поле
Диапазон
введите формулу
=СМЕЩ(лист1!$B$5;;;1;СЧЁТЗ(лист1!$B$5:$I$5))
- нажмите ОК.
Теперь подробнее. Любой диапазон в EXCEL задается координатами верхней левой и нижней правой ячейки диапазона. Исходной ячейкой, от которой отсчитывается положение нашего динамического диапазона, является ячейка
B5
. Если не заданы аргументы функции
СМЕЩ()
смещ_по_строкам,
смещ_по_столбцам
(как в нашем случае), то эта ячейка является левой верхней ячейкой диапазона. Нижняя правая ячейка диапазона определяется аргументами
высота
и
ширина
. В нашем случае значение высоты =1, а значение ширины диапазона равно результату вычисления формулы
СЧЁТЗ(лист1!$B$5:$I$5)
, т.е. 4 (в строке 5 присутствуют 4 месяца с
января
по
апрель
). Итак, адрес нижней правой ячейки нашего
динамического диапазона
определен – это
E
5
.
При заполнении таблицы данными о продажах за
май
,
июнь
и т.д., формула
СЧЁТЗ(лист1!$B$5:$I$5)
будет возвращать число заполненных ячеек (количество названий месяцев) и соответственно определять новую ширину динамического диапазона, который в свою очередь будет формировать
Выпадающий список
.
ВНИМАНИЕ! При использовании функции
СЧЕТЗ()
необходимо убедиться в отсутствии пустых ячеек! Т.е. нужно заполнять перечень месяцев без пропусков.
Теперь создадим еще один
динамический диапазон
для суммирования продаж.
Для создания
динамического диапазона
:
-
на вкладке
Формулы
в группе
Определенные имена
выберите команду
Присвоить имя
; -
в поле
Имя
введите:
Продажи_за_месяц
; -
в поле
Диапазон
введите формулу =
СМЕЩ(лист1!$A$6;;ПОИСКПОЗ(лист1!$C$1;лист1!$B$5:$I$5;0);12)
- нажмите ОК.
Теперь подробнее.
Функция
ПОИСКПОЗ()
ищет в строке 5 (перечень месяцев) выбранный пользователем месяц (ячейка
С1
с выпадающим списком) и возвращает соответствующий номер позиции в диапазоне поиска (названия месяцев должны быть уникальны, т.е. этот пример не годится для нескольких лет). На это число столбцов смещается левый верхний угол нашего динамического диапазона (от ячейки
А6
), высота диапазона не меняется и всегда равна 12 (при желании ее также можно сделать также динамической – зависящей от количества товаров в диапазоне).
И наконец, записав в ячейке
С2
формулу =
СУММ(Продажи_за_месяц)
получим сумму продаж в выбранном месяце.
Например, в мае.
Или, например, в апреле.
Примечание:
Вместо формулы с функцией
СМЕЩ()
для подсчета заполненных месяцев можно использовать формулу с функцией
ИНДЕКС()
: =
$B$5:ИНДЕКС(B5:I5;СЧЁТЗ($B$5:$I$5))
Формула подсчитывает количество элементов в строке 5 (функция
СЧЁТЗ()
) и определяет ссылку на последний элемент в строке (функция
ИНДЕКС()
), тем самым возвращает ссылку на диапазон
B5:E5
.
Визуальное отображение динамического диапазона
Выделить текущий
динамический диапазон
можно с помощью
Условного форматирования
. В
файле примера
для ячеек диапазона
B6:I14
применено правило
Условного форматирования
с формулой: =
СТОЛБЕЦ(B6)=СТОЛБЕЦ(Продажи_за_месяц)
Условное форматирование
автоматически выделяет серым цветом продажи
текущего месяца
, выбранного с помощью
Выпадающего списка
.
Применение динамического диапазона
Примеры использования
динамического диапазона
, например, можно посмотреть в статьях
Динамические диаграммы. Часть5: график с Прокруткой и Масштабированием
и
Динамические диаграммы. Часть4: Выборка данных из определенного диапазона
.
Что такое динамические массивы
В сентябре 2018 года Microsoft выпустила обновление, которое добавляет в Microsoft Excel совершенно новый инструменты: динамические массивы (Dynamic Arrays) и 7 новых функций для работы с ними. Эти вещи, без преувеличения, совершенно кардинальным образом меняет всю привычную технику работы с формулами и функциями и касаются, буквально, каждого пользователя.
Рассмотрим простой пример, чтобы объяснить суть.
Предположим, что у нас есть простая табличка с данными по городам-месяцам. Что будет если мы выделим любую пустую ячейку справа на листе и введем в нее формулу-ссылку не на одну ячейку, а сразу на диапазон?
Во всех прошлых версиях Excel после нажатия на Enter мы бы получили содержимое только одной первой ячейки B2. А как иначе?
Ну, или можно было бы завернуть этот диапазон в какую-нибудь аггрегирующую функцию типа =СУММ(B2:C4) и получить по нему общий итог.
Если бы нам потребовались операции посложнее примитивной суммы, например, извлечение уникальных значений или Топ-3, то пришлось бы вводить нашу формулу как формулу массива, используя сочетание клавиш Ctrl+Shift+Enter.
Теперь всё по-другому.
Теперь после ввода такой формулы мы можем просто нажать на Enter — и получить в результате сразу все значения, на которые мы ссылались:
Это не магия, а новые динамические массивы, которые теперь есть в Microsoft Excel. Добро пожаловать в новый мир
Особенности работы с динамическими массивами
Технически, весь наш динамический массив хранится в первой ячейке G4, заполняя своими данными необходимое количество ячеек вправо и вниз. Если выделить любую другую ячейку массива, то в строке формул ссылка будет неактивной, показывая, что мы находимся в одной из «дочерних» ячеек:
Попытка удалить одну или несколько «дочерних» ячеек ни к чему не приведёт — Excel тут же заново их вычислит и заполнит.
При этом ссылаться на эти «дочерние» ячейки в других формулах мы можем совершенно спокойно:
Если копировать первую ячейку массива (например из G4 в F8), то и и весь массив (его ссылки) сдвинется в том же направлении, как и в обычных формулах:
Если нам нужно переместить массив, то достаточно будет перенести (мышью или сочетанием Ctrl+X, Ctrl+V), опять же, только первую главную ячейку G4 — вслед за ней перенесется на новое место и заново развернётся весь наш массив.
Если вам нужно сослаться где-нибудь еще на листе на созданный динамический массив, то можно использовать спецсимвол # («решётка») после адреса его ведущей ячейки:
Например, теперь можно легко сделать выпадающий список в ячейке, который ссылается на созданный динамический массив:
Ошибки динамических массивов
Но что будет, если для развёртывания массива не будет достаточно пространства или на его пути окажутся ячейки уже занятые другими данными? Знакомьтесь с принципиально новым типом ошибок в Excel — #ПЕРЕНОС! (#SPILL!):
Как всегда, если щелкнуть мышью по значку с желтым ромбом и восклицательным знаком, то мы получим более подробное пояснение по источнику проблемы и сможем быстро найти мешающие ячейки:
Аналогичные ошибки будут возникать, если массив выходит за пределы листа или натыкается на объединенную ячейку. Если удалить препятствие, то всё тут же исправится на лету.
Динамические массивы и «умные» таблицы
Если динамический массив указывает на «умную» таблицу, созданную сочетанием клавиш Ctrl+T или с помощью Главная — Форматировать как таблицу (Home — Format as Table), то он также унаследует её главное качество — автоподстройку размеров.
При добавлении новых данных внизу или справа «умная» таблица и динамический диапазон тоже будут автоматически растягиваться:
При этом, однако, есть одно ограничение: мы не можем использовать ссылку на динамический диапазон в форумулах внутри «умной» таблицы:
Динамические массивы и другие функции Excel
Хорошо, скажете вы. Всё это интересно и забавно. Не нужно, как раньше, вручную протягивать формулу со ссылкой на первую ячейку исходного диапазона вниз и вправо и всё такое. И всё?
Не совсем.
Динамические массивы — это не просто еще один инструмент в Excel. Теперь они внедрены в самое сердце (или мозг) Microsoft Excel — его вычислительный движок. А это значит что и другие, привычные нам формулы и функции Excel теперь тоже поддерживают работу с динамическими массивами. Давайте разберём несколько примеров, чтобы вы осознали всю глубину произошедших изменений.
Транспонирование
Чтобы транспонировать диапазон (обменять местами строки и столбцы) в Microsoft Excel всегда имелась встроенная функция ТРАНСП (TRANSPOSE). Однако, чтобы её использовать, вы должны были сначала правильно выделить диапазон для результатов (например, если на входе был диапазон 5х3, то вы должны были обязательно выделить 3×5), потом ввести функцию и нажать сочетание Ctrl+Shift+Enter, т.к. она умела работать только в режиме формул массива.
Теперь можно просто выделить одну ячейку, ввести в нее эту же формулу и нажать на обычный Enter — динамический массив сделает всё сам:
Таблица умножения
Этот пример я обычно приводил, когда меня просили наглядно показать преимущества формул массива в Excel. Теперь чтобы посчитать всю таблицу Пифагора достаточно встать в первую ячейку B2, ввести туда формулу перемножающую два массива (вертикальный и горизонтальный набор чисел 1..10) и просто нажать на Enter:
Склейка и преобразование регистра
Массивы можно не только перемножать, но склеивать стандартным оператором & (амперсанд). Предположим, нам нужно сцпеить имя и фамилию из двух столбцов и поправить скачущий регистр в исходных данных. Делаем это одной короткой формулой, которая формирует весь массив, а потом применяем к нему функцию ПРОПНАЧ (PROPER), чтобы привести в порядок регистр:
Вывод Топ-3
Предположим, что у нас есть куча чисел, из которых нужно вывести три лучших результата, расположив их в порядке убывания. Теперь это делается одной формулой и, опять же, без всяких Ctrl+Shift+Enter как раньше:
Если захочется, чтобы результаты располагались не в столбец, а в строку, то достаточно заменить в этой формуле двоеточия (разделитель строк) на точку с запятой (разделитель элементов внутри одной строки). В англоязычной версии Excel роль этих разделителей играют точка с запятой и запятая, соответственно.
ВПР извлекающая сразу несколько столбцов
Функцей ВПР (VLOOKUP) теперь можно вытаскивать значения не из одного, а сразу из нескольких столбцов — достаточно указать их номера (в любом желаемом порядке) в виде массива в третьем аргументе функции:
Функция СМЕЩ (OFFSET) возвращающая динамический массив
Одной из самых интересных и полезных (после ВПР) функций для анализа данных является функция СМЕЩ (OFFSET), которой я посвятил в своё время целую главу в своей книжке и статью здесь. Сложность в понимании и освоении этой функции всегда была в том, что она возвращала в качестве результата массив (диапазон) данных, но увидеть его мы не могли, т.к. Excel до сих пор не умел работать с массивами «из коробки».
Сейчас эта проблема в прошлом. Посмотрите, как теперь с помощью одной формулы и динамического массива, возвращаемого СМЕЩ, можно извлечь все строки по заданному товару из любой отсортированной таблицы:
Давайте разберём её аргументы:
- А1 — стартовая ячейка (точка отсчёта)
- ПОИСКПОЗ(F2;A2:A30;0) — вычисление сдвига от стартовой ячейки вниз — до первой найденной капусты.
- 0 — сдвиг «окна» вправо относительно стартовой ячейки
- СЧЁТЕСЛИ(A2:A30;F2) — вычисление высоты возвращаемого «окна» — количества строк, где есть капуста.
- 4 — размер «окна» по горизонтали, т.е. выводим 4 столбца
Новые функции для динамических массивов
Помимо поддержки механизма динамических массивов в старых функциях, в Microsoft Excel были добавлены несколько совершенно новых функций, заточенных именно под работу с динамическими массивами. В частности, это:
- СОРТ (SORT) — сортирует входной диапазон и выдает динамический массив на выходе
- СОРТПО (SORTBY) — умеет сортировать один диапазон по значениям из другого
- ФИЛЬТР (FILTER) — извлекает из исходного диапазона строки, удовлетворяющие заданным условиям
- УНИК (UNIQUE) — извлекает из диапазона уникальные значения или убирает повторы
- СЛМАССИВ (RANDARRAY) — генерит массив случайных чисел заданного размера
- ПОСЛЕД (SEQUENCE) — формирует массив из последовательности чисел с заданным шагом
Подробнее про них — чуть позже. Они стоят отдельной статьи (и не одной) для вдумчивого изучения
Выводы
Если вы прочитали всё написанное выше, то, думаю, уже осознаёте масштаб изменений, которые произошли. Очень многие вещи в Excel теперь можно будет делать проще, легче и логичнее. Я, признаться, немного в шоке от того, сколько статей теперь придется корректировать здесь, на этом сайте и в моих книгах, но готов это сделать с легким сердцем.
Подбивая итоги, в плюсы динамических массивов можно записать следующее:
- Можно забыть про сочетание Ctrl+Shift+Enter. Теперь Excel не видит различий между «обычными формулами» и «формулами массива» и обрабатывает их одинаково.
- Про функцию СУММПРОИЗВ (SUMPRODUCT), которую раньше использовали для ввода формул массива без Ctrl+Shift+Enter тоже можно забыть — теперь достаточно просто СУММ и Enter.
- Умные таблицы и привычные функции (СУММ, ЕСЛИ, ВПР, СУММЕСЛИМН и т.д.) теперь тоже полностью или частично поддерживают динамические массивы.
- Есть обратная совместимость: если открыть книгу с динамическими массивами в старой версии Excel, то они превратятся в формулы массива (в фигурных скобках) и продолжат работать в «старом стиле».
Нашлось и некоторое количество минусов:
- Нельзя удалить отдельные строки, столбцы или ячейки из динамического массива, т.е. он живёт как единый объект.
- Нельзя сортировать динамический массив привычным образом через Данные — Сортировка (Data — Sort). Для этого есть теперь специальная функция СОРТ (SORT).
- Динамический диапазон нельзя превратить в умную таблицу (но можно сделать динамический диапазона на основе умной таблицы).
Само-собой, это еще не конец и, я уверен, Microsoft продолжит совершенствовать этот механизм в будущем.
Где скачать?
И, наконец, главный вопрос
Microsoft впервые анонсировало и показало превью динамических массивов в Excel еще в сентябре 2018 года на конференции Ignite. В последующие несколько месяцев происходило тщательное тестирование и обкатка новых возможностей сначала на кошках сотрудниках самой Microsoft, а потом на добровольцах-тестировщиках из круга Office Insiders. В этом году обновление, добавляющее динамические массивы стали постепенно раскатывать уже по обычным подписчикам Office 365. Я, например, получил его только в августе с моей подпиской Office 365 Pro Plus (Monthly Targeted).
Если в вашем Excel ещё нет динамических массивов, а поработать с ними очень хочется, то есть следующие варианты:
- Если у вас подписка Office 365, то можно просто продождать, пока до вас дойдет это обновление. Как быстро это случится — зависит от настройки частоты доставки обновлений для вашего Office (раз в год, раз в полгода, раз в месяц). Если у вас корпоративный ПК, то можно попросить вашего администратора настроить загрузку обновлений почаще.
- Можно записаться в ряды тех самых добровольцев-тестировщиков Office Insiders — тогда вы будете первым получать все новые возможности и функции (но есть шанс повышенной глючности в работе Excel, само-собой).
- Если у вас не подписка, а коробочная standalone-версия Excel, то придется ждать до выхода следующей версии Office и Excel в 2022 году, как минимум. Пользователи таких версий получают только обновления безопасности и исправления ошибок, а все новые «плюшки» теперь достаются только подписчикам Office 365. Sad but true
В любом случае, когда динамические массивы появятся в вашем Excel — после этой статьи вы будете к этому уже готовы
Ссылки по теме
- Что такое формулы массива и как их использовать в Excel
- Суммирование по окну (диапазону) с помощью функции СМЕЩ (OFFSET)
- 3 способа транспонировать таблицу в Excel
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2016 Excel для iPad Excel для iPhone Excel для планшетов с Android Excel для телефонов с Android Еще…Меньше
Формулы Excel, возвращающие набор значений, также известный как массив, возвращают эти значения в смежные ячейки. Это действие называется переносом.
Формулы, способные возвращать массивы переменного размера, называются формулами динамического массива. Формулы, которые в сейчас возвращают успешно переносимые массивы, можно назвать формулами перенесенного массива.
Ниже приведены несколько заметок, которые помогут вам в понимании и использовании формул такого типа.
Что означает перенос?
Примечание: Более старые формулы массива, известные как устаревшие формулы массива, всегда возвращают результат фиксированного размера — они всегда переносятся в одно и то же количество ячеек. Поведение при переносе, описанное в этом разделе, не применяется к устаревшим формулам массива.
Перенос означает, что формула привела к нескольким значениям, и эти значения были помещены в смежные ячейки. Например, =SORT(D2:D11;1,-1),, сортирующая массив в порядке убывания, возвращает соответствующий массив высотой 10 строк. Но вам нужно только ввести формулу в верхнюю левую ячейку или в данном случае F2, и она автоматически переместится в ячейку F11.
Ключевые моменты
-
При нажатии на ВВОД для подтверждения формулы Excel динамически изменит размер диапазона вывода и поместит результаты в каждую ячейку в этом диапазоне.
-
Если вы пишете формулу динамического массива для работы со списком данных, может быть удобно поместить его в таблицу Excel, а затем использоватьструктурированные ссылки для ссылки на данные. Это происходит потому, что структурированные ссылки автоматически корректируются при добавлении или удалении строк из таблицы.
-
Формулы перенесенного массива не поддерживаются в самих таблицах Excel, поэтому их следует размещать в сетке за пределами таблицы. Таблицы лучше всего подходят для хранения строк и столбцов независимых данных.
-
После ввода формулы перенесенного массива при выделении любой ячейки в области переноса Excel выделит рамкой границу диапазона. Граница исчезнет при выборе ячейки за пределами области.
-
Редактировать можно только первую ячейку в области переноса. При выборе другой ячейки в области переноса, формула будет видна в строке формул, но текст будет «фантомным» и недоступным для изменения. При необходимости обновить формулу, необходимо выбрать верхнюю левую ячейку в диапазоне массива, изменить ее по мере необходимости. При нажатии Enter Excel автоматически обновит остальную часть области переноса.
-
Перекрытие формул. Формулы массива нельзя ввести, если что-то блокирует выходной диапазон. и если это происходит, Excel возвращает ошибку #SPILL!, указывающую на наличие блокировки. Если удалить помеху, формула будет перенесена должным образом. В приведенном ниже примере выходной диапазон формулы перекрывает другой диапазон с данными и отображается с пунктирной рамкой, перекрывающей ячейки со значениями, указывающими, что он не может быть перенесен. Удалите блокирующие данные или скопируйте их в другое место, и формула перенесется, как и ожидалось.
-
Устаревшие формулы массива, введенные с помощью CTRL+SHIFT+ENTER (CSE), по-прежнему поддерживаются по соображениям обратной совместимости, но их больше нельзя использовать. Если хотите, вы можете преобразовать устаревшие формулы массива в формулы динамического массива, найдя первую ячейку в диапазоне массива, скопировав текст формулы, удалив весь диапазон устаревшего массива, а затем повторно введя формулу в верхней левой ячейке. Перед обновлением устаревших формул массива до динамических формул массива следует помнить о некоторых счетных различиях между ними.
-
Приложение Excel ограничило поддержку динамических массивов в операциях между книгами, и этот сценарий поддерживается, только если открыты обе книги. Если закрыть исходную книгу, все связанные формулы динамического массива вернут ошибку #ССЫЛКА! после обновления.
Дополнительные сведения
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
См. также
Функция ФИЛЬТР
Функция СЛУЧМАССИВ
Функция ПОСЛЕДОВ
Функция СОРТ
Функция СОРТПО
Функция УНИК
Ошибки #ПЕРЕНОС! в Excel
Оператор неявного пересечения: @
Нужна дополнительная помощь?
Динамический диапазон в MS EXCEL
Если вам необходимо постоянно добавлять значения в столбец, то для правильной работы Ваших формул, Вам наверняка понадобятся динамические диапазоны, которые автоматически увеличиваются или уменьшаются в зависимости от количества ваших данных.
Динамический диапазон — это Именованный диапазон с изменяющимися границами. Границы диапазона изменяются в зависимости от количества значений в определенном диапазоне.
Имеется таблица продаж по месяцам некоторых товаров (см. Файл примера ):
Необходимо найти сумму продаж товаров в определенном месяце. Пользователь должен иметь возможность выбрать нужный ему месяц и получить итоговую сумму продаж. Выбор месяца пользователь должен осуществлять с помощью Выпадающего списка.
Для решения задачи нам потребуется сформировать два динамических диапазона: один для Выпадающего списка, содержащего месяцы; другой для диапазона суммирования.
Для формирования динамических диапазонов будем использовать функцию СМЕЩ() , которая возвращает ссылку на диапазон в зависимости от значения заданных аргументов. Можно задавать высоту и ширину диапазона, а также смещение по строкам и столбцам.
Создадим динамический диапазон для Выпадающего списка, содержащего месяцы. С одной стороны нужно учитывать тот факт, что пользователь может добавлять продажи за следующие после апреля месяцы (май, июнь…), с другой стороны Выпадающий список не должен содержать пустые строки. Динамический диапазон как раз и служит для решения такой задачи.
Для создания динамического диапазона:
- на вкладке Формулы в группе Определенные имена выберите команду Присвоить имя;
- в поле Имя введите: Месяц;
- в поле Область выберите лист Книга;
- в поле Диапазон введите формулу =СМЕЩ(лист1!$B$5;;;1;СЧЁТЗ(лист1!$B$5:$I$5))
- нажмите ОК.
Теперь подробнее.
Любой диапазон в EXCEL задается координатами верхней левой и нижней правой ячейки диапазона. Исходной ячейкой, от которой отсчитывается положение нашего динамического диапазона, является ячейка B5. Если не заданы аргументы функции СМЕЩ() смещ_по_строкам, смещ_по_столбцам (как в нашем случае), то эта ячейка является левой верхней ячейкой диапазона. Нижняя правая ячейка диапазона определяется аргументами высота и ширина. В нашем случае значение высоты =1, а значение ширины диапазона равно результату вычисления формулы СЧЁТЗ(лист1!$B$5:$I$5) , т.е. 4 (в строке 5 присутствуют 4 месяца с января по апрель). Итак, адрес нижней правой ячейки нашего динамического диапазона определен – это E5.
При заполнении таблицы данными о продажах за май, июнь и т.д., формула СЧЁТЗ(лист1!$B$5:$I$5) будет возвращать число заполненных ячеек (количество названий месяцев) и соответственно определять новую ширину динамического диапазона, который в свою очередь будет формировать Выпадающий список.
ВНИМАНИЕ! При использовании функции СЧЕТЗ() необходимо убедиться в отсутствии пустых ячеек! Т.е. нужно заполнять перечень месяцев без пропусков.
Теперь создадим еще один динамический диапазон для суммирования продаж.
Для создания динамического диапазона:
- на вкладке Формулы в группе Определенные имена выберите команду Присвоить имя;
- в поле Имя введите: Продажи_за_месяц;
- в поле Диапазон введите формулу = СМЕЩ(лист1!$A$6;;ПОИСКПОЗ(лист1!$C$1;лист1!$B$5:$I$5;0);12)
- нажмите ОК.
Функция ПОИСКПОЗ() ищет в строке 5 (перечень месяцев) выбранный пользователем месяц (ячейка С1 с выпадающим списком) и возвращает соответствующий номер позиции в диапазоне поиска (названия месяцев должны быть уникальны, т.е. этот пример не годится для нескольких лет). На это число столбцов смещается левый верхний угол нашего динамического диапазона (от ячейки А6), высота диапазона не меняется и всегда равна 12 (при желании ее также можно сделать также динамической – зависящей от количества товаров в диапазоне).
И наконец, записав в ячейке С2 формулу = СУММ(Продажи_за_месяц) получим сумму продаж в выбранном месяце.
Или, например, в апреле.
Примечание:
Вместо формулы с функцией СМЕЩ() для подсчета заполненных месяцев можно использовать формулу с функцией ИНДЕКС() :
= $B$5:ИНДЕКС(B5:I5;СЧЁТЗ($B$5:$I$5))
Формула подсчитывает количество элементов в строке 5 (функция СЧЁТЗ() ) и определяет ссылку на последний элемент в строке (функция ИНДЕКС() ), тем самым возвращает ссылку на диапазон B5:E5.
Визуальное отображение динамического диапазона
Выделить текущий динамический диапазон можно с помощью Условного форматирования. В файле примера для ячеек диапазона B6:I14 применено правило Условного форматирования с формулой:
= СТОЛБЕЦ(B6)=СТОЛБЕЦ(Продажи_за_месяц)
Условное форматирование автоматически выделяет серым цветом продажи текущего месяца, выбранного с помощью Выпадающего списка.
Динамический диапазон с автоподстройкой размеров
Есть ли у вас таблицы с данными в Excel, размеры которых могут изменяться, т.е. количество строк (столбцов) может увеличиваться или уменьшаться в процессе работы? Если размеры таблицы «плавают», то придется постоянно мониторить этот момент и подправлять:
- ссылки в формулах отчетов, которые ссылаются на нашу таблицу
- исходные диапазоны сводных таблиц, которые построены по нашей таблице
- исходные диапазоны диаграмм, построенных по нашей таблице
- диапазоны для выпадающих списков, которые используют нашу таблицу в качестве источника данных
Все это в сумме не даст вам скучать 😉
Гораздо удобнее и правильнее будет создать динамический «резиновый» диапазон, который автоматически будет подстраиваться в размерах под реальное количество строк-столбцов данных. Чтобы реализовать такое, есть несколько способов.
Способ 1. Умная таблица
Выделите ваш диапазон ячеек и выберите на вкладке Главная – Форматировать как Таблицу (Home – Format as Table):
Если вам не нужен полосатый дизайн, который добавляется к таблице побочным эффектом, то его можно отключить на появившейся вкладке Конструктор (Design). Каждая созданная таким образом таблица получает имя, которое можно заменить на более удобное там же на вкладке Конструктор (Design) в поле Имя таблицы (Table Name) .
Теперь можно использовать динамические ссылки на нашу «умную таблицу»:
- Таблица1 – ссылка на всю таблицу кроме строки заголовка (A2:D5)
- Таблица1[#Все] – ссылка на всю таблицу целиком (A1:D5)
- Таблица1[Питер] – ссылка на диапазон-столбец без первой ячейки-заголовка (C2:C5)
- Таблица1[#Заголовки] – ссылка на «шапку» с названиями столбцов (A1:D1)
Такие ссылки замечательно работают в формулах, например:
=СУММ(Таблица1[Москва]) – вычисление суммы по столбцу «Москва»
=ВПР(F5;Таблица1;3;0) – поиск в таблице месяца из ячейки F5 и выдача питерской суммы по нему (что такое ВПР?)
Такие ссылки можно успешно использовать при создании сводных таблиц, выбрав на вкладке Вставка – Сводная таблица (Insert – Pivot Table) и введя имя умной таблицы в качестве источника данных:
Если выделить фрагмент такой таблицы (например, первых два столбца) и создать диаграмму любого типа, то при дописывании новых строк они автоматически будут добавляться к диаграмме.
При создании выпадающих списков прямые ссылки на элементы умной таблицы использовать нельзя, но можно легко обойти это ограничение с помощью тактической хитрости – использовать функцию ДВССЫЛ (INDIRECT) , которая превращает текст в ссылку:
Т.е. ссылка на умную таблицу в виде текстовой строки (в кавычках!) превращается в полноценную ссылку, а уж ее выпадающий список нормально воспринимает.
Способ 2. Динамический именованный диапазон
Если превращение ваших данных в умную таблицу по каким-либо причинам нежелательно, то можно воспользоваться чуть более сложным, но гораздо более незаметным и универсальным методом – создать в Excel динамический именованный диапазон, ссылающийся на нашу таблицу. Потом, как и в случае с умной таблицей, можно будет свободно использовать имя созданного диапазона в любых формулах, отчетах, диаграммах и т.д. Для начала рассмотрим простой пример:
Задача: сделать динамический именованный диапазон, который ссылался бы на список городов и автоматически растягивался-сжимался в размерах при дописывании новых городов либо их удалении.
Нам потребуются две встроенных функции Excel, имеющиеся в любой версии – ПОИКСПОЗ (MATCH) для определения последней ячейки диапазона и ИНДЕКС (INDEX) для создания динамической ссылки.
Ищем последнюю ячейку с помощью ПОИСКПОЗ
ПОИСКПОЗ(искомое_значение;диапазон;тип_сопоставления) – функция, которая ищет заданное значение в диапазоне (строке или столбце) и выдает порядковый номер ячейки, где оно было найдено. Например, формула ПОИСКПОЗ(“март”;A1:A5;0) выдаст в качестве результата число 4, т.к. слово «март» расположено в четвертой по счету ячейке в столбце A1:A5. Последний аргумент функции Тип_сопоставления = 0 означает, что мы ведем поиск точного соответствия. Если этот аргумент не указать, то функция переключится в режим поиска ближайшего наименьшего значения – это как раз и можно успешно использовать для нахождения последней занятой ячейки в нашем массиве.
Суть трюка проста. ПОИСКПОЗ перебирает в поиске ячейки в диапазоне сверху-вниз и, по идее, должна остановиться, когда найдет ближайшее наименьшее значение к заданному. Если указать в качестве искомого значение заведомо больше, чем любое имеющееся в таблице, то ПОИСКПОЗ дойдет до самого конца таблицы, ничего не найдет и выдаст порядковый номер последней заполненной ячейки. А нам это и нужно!
Если в нашем массиве только числа, то можно в качестве искомого значения указать число, которое заведомо больше любого из имеющихся в таблице:
Для гарантии можно использовать число 9E+307 (9 умножить на 10 в 307 степени, т.е. 9 с 307 нулями) – максимальное число, с которым в принципе может работать Excel.
Если же в нашем столбце текстовые значения, то в качестве эквивалента максимально большого числа можно вставить конструкцию ПОВТОР(“я”;255) – текстовую строку, состоящую из 255 букв «я» — последней буквы алфавита. Поскольку при поиске Excel, фактически, сравнивает коды символов, то любой текст в нашей таблице будет технически «меньше» такой длинной «яяяяя….я» строки:
Формируем ссылку с помощью ИНДЕКС
Теперь, когда мы знаем позицию последнего непустого элемента в таблице, осталось сформировать ссылку на весь наш диапазон. Для этого используем функцию:
ИНДЕКС(диапазон; номер_строки; номер_столбца)
Она выдает содержимое ячейки из диапазона по номеру строки и столбца, т.е. например функция =ИНДЕКС(A1:D5;3;4) по нашей таблице с городами и месяцами из предыдущего способа выдаст 1240 – содержимое из 3-й строки и 4-го столбца, т.е. ячейки D3. Если столбец всего один, то его номер можно не указывать, т.е. формула ИНДЕКС(A2:A6;3) выдаст «Самару» на последнем скриншоте.
Причем есть один не совсем очевидный нюанс: если ИНДЕКС не просто введена в ячейку после знака =, как обычно, а используется как финальная часть ссылки на диапазон после двоеточия, то выдает она уже не содержимое ячейки, а ее адрес! Таким образом формула вида $A$2:ИНДЕКС($A$2:$A$100;3) даст на выходе уже ссылку на диапазон A2:A4.
И вот тут в дело вступает функция ПОИСКПОЗ, которую мы вставляем внутрь ИНДЕКС, чтобы динамически определить конец списка:
=$A$2:ИНДЕКС($A$2:$A$100; ПОИСКПОЗ(ПОВТОР(«я»;255) ;A2:A100))
Создаем именованный диапазон
Осталось упаковать все это в единое целое. Откройте вкладку Формулы (Formulas) и нажмите кнопку Диспетчер Имен (Name Manager) . В открывшемся окне нажмите кнопку Создать (New) , введите имя нашего диапазона и формулу в поле Диапазон (Reference) :
Осталось нажать на ОК и готовый диапазон можно использовать в любых формулах, выпадающих списках или диаграммах.
Трюк №42. Создание увеличивающихся и уменьшающихся диапазонов Excel
Если вам необходимо постоянно обновлять и добавлять данные или если вы работаете с диаграммами и сводными таблицами, вам понадобятся динамические именованные диапазоны, которые увеличиваются и уменьшаются в зависимости от ваших данных.
Чтобы понять, как работают динамические именованные диапазоны, сначала нужно познакомиться с функцией Excel СМЕЩ (OFFSET), если вы еще не знакомы с ней. Функция СМЕЩ (OFFSET) относится к ссылочным функциям и функциям поиска Excel.
Начнем с простейшего динамического именованного диапазона, который будет расширяться вниз по одному столбцу, но только до тех пор, пока в этом столбце есть записи. Например, если в столбце А есть 10 последовательных строк с данными, динамический именованный диапазон будет охватывать диапазон А1:А10. Чтобы создать базовый динамический именованный диапазон, сделайте следующее.
Выберите команду Вставка → Имя → Присвоить (Insert → Name → Define) и в поле Имя (Names in workbook) введите MyRange. В поле Формула (Refers to) введите следующую формулу: =OFFSET($A$1;0;0;COUNTA($A$l:$A$100);l), в русской версии Excel =СМЕЩ($А$1;0;0;СЧЁТЗ($А$1:$А$100);1). Теперь щелкните на кнопке Добавить (Add), затем щелкните на кнопке ОК.
К сожалению, динамические именованные диапазоны нельзя проверить в стандартном поле имени слева от строки формул. Несмотря на это, можно щелкнуть в поле имени, ввести имя MyRange и нажать клавишу Enter. Excel автоматически выделит диапазон. Конечно, можно воспользоваться и диалоговым окном Переход (Go То), выбрав команду Правка → Перейти (Edit → Go To) (сочетание клавиш Ctrl/Apple+G). В поле Ссылка (Reference) введите MyRange и щелкните на кнопке ОК.
В динамическом именованном диапазоне, который вы создали в предыдущем примере, функция СЧЁТЗ (COUNTA) стоит на месте аргумента Высота (Height) функции СМЕЩ (OFFSET).
В следующем примере динамический именованный диапазон мы применим для определения таблицы данных, которая должна быть динамической. Для этогоn в поле Формула (Refers to) введите следующую формулу: =OFFSET($A$1;0;0;COUNTA($A$1:$A$100);COUNTA($1:$1)), в русской версии Excel =СМЕЩ($А$1;0;0;СЧЁТЗ($А$1:$А$100);СЧЁТЗ($1:$1)). Теперь динамический именованный диапазон будет расширяться на столько записей, сколько есть в столбце А, и на столько строк, сколько заголовков в строке 1. Если вы уверены, что количество столбцов в таблице данных меняться не будет, можете заменить вторую функцию СЧЁТЗ (COUNTA) постоянным числом, например, 10.
Единственная проблема при использовании динамического именованного диапазона для таблицы данных заключается в том, что предполагается, что столбец А определяет максимальную длину таблицы. Чаще всего это так, однако иногда самым длинным столбцом может быть другой столбец таблицы. Преодолеть эту проблему можно при помощи функции Excel МАКС (МАХ), которая возвращает самое большое число в диапазоне ячеек. В качестве примера создайте таблицу, как на рис. 3.4.
Рис. 3.4. Динамическая таблица данных и диалоговое окно присвоения имени
В строке 1 хранятся функции СЧЁТЗ (COUNTA), которые ссылаются вниз на соответствующий столбец и, таким образом, возвращают количество записей в каждом столбце. Функция МАКС (МАХ) будет использоваться в качестве аргумента Высота (Height) функции СМЕЩ (OFFSET). Это гарантирует, что динамический именованный диапазон для этой таблицы всегда будет расширяться вниз на столько ячеек, сколько их содержится в самом длинном столбце в таблице. Конечно же, можно скрыть строку 1, так как пользователю совершенно не нужно ее видеть.
Во всех этих примерах мы предполагали, что данные всегда будут размещаться в соседних строках, между которыми не будет пустых ячеек. Хотя именно этот способ настройки списка или таблицы данных является правильным, иногда он становится неуправляемым.
В следующем примере список чисел в столбце А также содержит пустые ячейки. Это означает, что, если вы попытаетесь воспользоваться функцией СЧЁТ (COUNT) или СЧЁТЗ (COUNTA), динамический именованный диапазон закончится раньше, чем последняя ячейка с данными. Взгляните, например, на рис. 3.5.
Рис. 3.5. Диапазон чисел и диалоговое окно присвоения имени
В этом случае, хотя последнее число диапазона в действительности находится в строке 10, динамический диапазон расширяется вниз только до шестой строки. Причина этого лежит в функции СЧЁТ (COUNT), которая считает значения в ячейках от А1 до А100. Так как в списке только шесть числовых значений, диапазон содержит только шесть строк.
Чтобы преодолеть эту проблему, воспользуйтесь функцией Excel ПОИСКПОЗ (MATCH). Функция ПОИСКПОЗ (MATCH) возвращает относительную позицию элемента массива, соответствующего указанному значению в указанном порядке. Например, если вы примените следующую функцию ПОИСКПОЗ (MATCH): =МАТСН(6;$А$1:$А$100;0), в русской версии Excel =ПОИСКПОЗ(6;$А$1:$А$100;0), к тому же набору чисел, что и на рис. 3.5, она вернет число 10, представляющее строку 10 столбца А. Она возвращает 10, так как вы приказали функции найти число 6 в диапазоне А1:А100.
Очевидно, когда вы используете функцию ПОИСКПОЗ (MATCH) в динамическом именованном диапазоне, последнее число диапазона, вероятно, заранее неизвестно. Таким образом, понадобится задать в функции поиск слишком большого числа, которое никогда не появится в диапазоне, и изменить ее последний аргумент с 0 на 1.
В предыдущем примере вы приказали функции ПОИСКПОЗ (MATCH) найти в точности число 6, не больше и не меньше. Заменив 0 на 1, вы заставите функцию искать самое большое значение, меньшее или равное указанному. Для этого воспользуйтесь формулой =МАТСН(1Е+306;$А$1:$А$100;1), в русской версии Excel =ПОИСКПОЗ(1Е+306;$А$1:$А$100;1).
Чтобы создать динамический именованный диапазон, который будет расширяться до последней строки, содержащей число (независимо от наличия пустых ячеек до нее), введите следующую формулу в поле Формула (Refers to) диалогового окна Присвоение имени (Define Name) (рис. 3.6): =OFFSET(Sheet2!$A$1;0;0;MATCH(lE+306;Sheet2!$A$l:$A$100;1);1), в русской версии Excel =CMEЩ(Sheet2!$A$1;0;0;ПОИСКПОЗ(1E+306;Sheet2!$A$l:$A$100;1);1).
Рис. 3.6. Динамический диапазон, расширяющийся до последней записи, содержащей число
Следующий логический тип динамических именованных диапазонов, вытекающий из данного, — это диапазон, расширяющийся до последней текстовой записи независимо от пустых ячеек в списке или таблице. Для этого измените функцию ПОИСКПОЗ (MATCH) таким образом: МАТСН(«*»;$А$1:$А$100;-1), в русской версии Excel ПОИСКПОЗ(«*»;$А$1;$А$100;-1). Такая функция всегда возвращает номер строки, где содержится последняя текстовая запись в диапазоне $А$1:$А$100.
Теперь, когда известно, как выполнить эту задачу для числовых записей и текстовых значений, единственное, что осталось сделать, — каким-то образом определить динамический именованный диапазон, который будет расширяться, не обращая внимания на пустые ячейки в списке, содержащем и текстовые, и числовые данные.
Для этого сначала вставьте две пустые строки выше списка. Выделите строки 1 и 2 и выберите команду Вставка → Строки (Insert → Row). В первой строке (строка 1) введите следующую функцию: =МАХ(МАТСН»*»;$А$3:$А$100;-1);МАТСН(1Е+306;$А$3:$А$100;1)), в русской версии Excel =МАКС(ПОИСКПОЗ»*»;$А$3:$А$100;-1);ПОИСКПОЗ(1Е+306;$А$3:$А$100;1)). В ячейке под ячейкой с формулой введите число 1. Ячейка еще ниже, под ячейкой с числом 1, должна содержать текстовый заголовок списка. Число 1 было добавлено, чтобы вторая функция ПОИСКПОЗ (MATCH) не вернула ошибку #N/A, если в диапазоне АЗ:А100 не окажется чисел. Первая функция ПОИСКПОЗ (MATCH) всегда найдет текст — в заголовке.
Дайте ячейке А1 имя MaxRow. Выберите команду Вставка → Имя → Присвоить (Insert → Name → Define), присвойте динамическому диапазону имя, например, MyList и в поле Формула (Refers to:) введите следующую формулу: =OFFSET(Sheet2!$A$3;0;0;MaxRow;1), в русской версии Excel =CMEЩ(Sheet2!$A$3;0;0;MaxRow;1).
В следующем списке перечислены типы динамических именованных диапазонов, которые могут оказаться полезными. Для веет этих примеров понадобится заполнить столбец А и текстом, и числовыми значениями. Кроме того, выберите команду Вставка → Имя → Присвоить (Insert → Name → Define) и в поле Имя (Names in workbook) введите имя, состоящее из одного слова (например, MyRange). Все, что будет изменяться, — это формула в поле Формула (Refers to).
Расширить диапазон на столько строк, сколько существует числовых записей: в поле Формула (Refers to) введите следующее: =OFFSET($A$1;0;0;COUNT($A:$A);1), в русской версии Excel =СМЕЩ($А$1;0;0;СЧЁТ($А;$А);1).
Расширить диапазон на столько строк, сколько существует числовых и текстовых записей: в поле Формула (Refers to) введите следующее: =OFFSET($A$1;0;0;COUNTA($A:$A);1), в русской версии Excel =СМЕЩ($А$1;0;0;СЧЁТЗ($А:$А);1).
Расширить до последней числовой записи: в поле Формула (Refers to) введите следующее: =OFFSET($A$1;0;0;MATCH(1E+306;$A:$A)), в русской версии Excel =СМЕЩ($А$1;0;0;ПОИСКПОЗ(1Е+306;$А:$А)). Если вы ожидаете, что может встретиться число, большее 1Е+306 (1 с 306 нулями), введите еще большее число.
Расширить до последней текстовой записи: в поле Формула (Refers to) введите следующее: =OFFSET($A$1;0;0;МАТCH(«*»;$А:$А;-1)), в русской версии Excel =СМЕЩ($А$1;0;0;ПОИСКПОЗ(«*»;$А:$А;-1)).
Расширить вниз в зависимости от значения в другой ячейке:В ячейку В1 введите число 10, а затем в поле Формула (Refers to) введите следующее: =OFFSET($A$1;0;0;$B$1;1), в русской версии Excel =СМЕЩ($А$1;0;0;$В$1;1). Теперь измените число в ячейке В1, и диапазон изменится соответствующим образом.
Расширять вниз по одной строке каждый месяц: В поле Формула (Refers to) введите следующее: =OFFSET($A$1;0;0,MONTH(TODAY());1), в русской версии Excel =СМЕЩ($А$1;0;0.МЕСЯЦ(СЕГОДНЯ));1).
Расширять вниз по одной строке каждую неделю: В поле Формула (Refers to) введите следующее: =OFFSET($A$1;0;0;WEEKNUM(TODAY());1), В русской версии Excel =СМЕЩ($А$1;0;0;ДЕНЬНЕД(СЕГОДНЯ());1)
Для последней формулы необходимо установить Пакет анализа (Analysis ToolPak). Это можно сделать командой Сервис → Надстройки (Tools → Add-ins).
Динамический именованный диапазон в Excel
Динамический именованный диапазон автоматически расширяется при добавлении значения в диапазон.
- Например, выберите диапазон A1:A4 и присвойте ему имя Prices.
- Рассчитайте сумму.
- Когда вы добавляете значение к диапазону, Excel не обновляет сумму.
Чтобы автоматически расширять именованный диапазон при добавлении значения, выполните следующие несколько шагов:
- На вкладке Formulas (Формулы) выберите Name Manager (Диспетчер имен).
- Нажмите кнопку Edit (Изменить).
- Кликните по полю Refers to (Диапазон) и введите формулу:
Объяснение: Функция OFFSET (СМЕЩ) принимает 5 аргументов:
- ссылка: $A$1,
- смещение по строкам: ,
- смещение по столбцам: ,
- высота: COUNTA($A:$A) или СЧЕТЗ($A:$A),
- ширина: 1.
Формула COUNTA($A:$A) или СЧЕТЗ($A:$A) – подсчитывает число значений в столбце А. Когда вы добавляете значение к диапазону, количество элементов увеличивается. В результате, именованный диапазон расширяется.
Динамические именованные диапазоны
Очень часто при использовании связки Выпадающий список—Именованный диапазон возникает проблема: при добавлении новых данных в диапазон они не отразятся сразу в списке — для этого необходимо будет изменить адрес именованного диапазона. Либо указать заранее расширенный диапазон. Но тогда появляются лишние пустые значения в списке, что тоже не очень-то красиво и совсем не удобно, особенно если список не маленький. И вот здесь помогут так называемые Динамические диапазоны. Создав вместо обычного именованного диапазона динамический, уже не придется каждый раз менять адрес диапазона для отображения в списке всех добавленных значений. И отображаться будут только значения, никаких пустых строк.
Вызываем Диспетчер создания имен(Ctrl+F3), задаем имя диапазона и в поле Диапазон (Refers to) пишем формулу:
Вариант с формулой СМЕЩ
=СМЕЩ(Лист2! $A$1 ;;;СЧЁТЗ(Лист2! $A$1:$A$1000 );)
=OFFSET(Лист2! $A$1 . COUNTA(Лист2! $A$1:$A$1000 ),)
- Где Лист2! $A$1 — первая ячейка значений для выпадающего списка
- а Лист2! $A$1:$A$1000 максимальный диапазон ячеек, в котором будут храниться значения для списка. Если значений может быть более 1000, то необходимо увеличить диапазон $A$1:$A$1000 на необходимое количество строк. Хотя мне лично страшно представить себе такой выпадающий список. Но динамический диапазон может ведь пригодиться и для других целей
В чем главный недостаток этого метода: если добавить в список значений пропуск между значениями в виде пустой строки — список отобразит не все значения списка, т.к. СЧЕТЗ считает количество непустых ячеек:
Вариант с формулой ИНДЕКС
=Лист2!$A$1:ИНДЕКС(Лист2! $A$1:$A$1000 ;ПРОСМОТР(2;1/(Лист2! $A$1:$A$1000 <>«»);СТРОКА(Лист2! $A$1:$A$1000 )))
=Лист2!$A$1:INDEX(Лист2! $A$1:$A$1000 ,LOOKUP(2,1/(Лист2! $A$1:$A$1000 <>«»),ROW(Лист2! $A$1:$A$1000 )))
Изменяемые ссылки для этой формулы такие же, как и в случае с вариантом через СМЕЩ:
- Лист2! $A$1 — первая ячейка значений для выпадающего списка
- Лист2! $A$1:$A$1000 максимальный диапазон ячеек, в котором будут храниться значения для списка
Однако метод через данную формулу лишен недостатка предыдущего метода: если добавить в список разрыв в виде пустой строки — список отобразится правильно, с этим разрывом и всеми значениями:
Примечание: созданные таким образом диапазоны нельзя использовать в составе функции ДВССЫЛ (INDIRECT) для создания зависимых выпадающих списков — список просто не будет работать
Tips_Lists_Dinamic_Range.xls (37,5 KiB, 6 032 скачиваний)
Статья помогла? Поделись ссылкой с друзьями!
Поиск по меткам
Есть вариант ещё интереснее.
Размещаем список в «Таблице» (ВставкаТаблица)
Создаём Диапазон ссылающийся на часть таблицы с данными например =Таблица1[Почта](если заголовок списка «Почта» в таблице «Таблица1»)
Далее всё как указано в основном описании по созданию списка в третьем варианте отсюда: http://www.excel-vba.ru/chto-umeet-excel/vypadayushhie-spiski/
При необходимости увеличения или изменения состава списка просто добавляете значения вниз таблицы со списком (таблица сама расширится включив новое значение в список) и сортируете. Пустые значения упадут вниз и их можно просто исключить из таблицы или оставить.
При изменении заголовка списка ссылка в именованном диапазоне поменяется сама.
Важный момент в настройках должна быть включена функция «ФормулыИспользовать имена таблиц в формулах».
Поделитесь своим мнением
Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме — добро пожаловать на Форум
Это глава из книги: Майкл Гирвин. Ctrl+Shift+Enter. Освоение формул массива в Excel.
Предыдущая глава Оглавление Следующая глава
В этой главе вы узнаете о том, как создать динамический диапазон с помощью формул. Динамический диапазон можно использовать в формулах, диаграммах, сводных таблицах и других случаях, когда ожидают, что диапазон может увеличиваться или уменьшаться при добавлении или удалении исходных данных, или изменяться на основе критериев, используемых в формулах.
На рис. 13.1 и 13.2 приведен пример расширения исходного набора данных. Если вы используете динамический диапазон внутри функции СУММ, диапазон A2:A4 будет автоматически расширяться до А2:А5, если новое число (в ячейке А5) добавляется к исходным данным.
Рис. 13.1. Функция СУММ для диапазона А2:А4
Скачать заметку в формате Word или pdf, примеры в Excel2013
Рис. 13.2. Динамический диапазон внутри функции СУММ должен автоматически расширяться с А2:А4 до А2:А5 при добавлении новых данных
Рис. 13.3 демонстрирует еще один пример, в котором без динамического диапазона также не обойтись. Вам нужна формула в аргументе диапазон функции СЧЁТЕСЛИ, чтобы этот диапазон обращался только к рейтингам одного семестра. В ячейке C5, вам нужно, чтобы функция СЧЁТЕСЛИ подсчитывала данные из диапазона B2:B5. А при копировании формулы вниз, С6 оставлась пустой, а в C7, функция обращалась к диапазону B6:B7.
Рис. 13.3. Формула для расчета довольно простая (Е5 и Е7), однако скопировтаь ее вдоль столбца не получится, так как аргумент диапазон функции СЧЁТЕСЛИ должен изменяться, чтобы охватывать только значения одного семестра. Этот пример будет завершен в конце заметки
Вы можете использовать функцию ИНДЕКС или функцию СМЕЩ для создания динамических диапазонов. Я, как правило, использую функцию ИНДЕКС, и реже СМЕЩ, потому что СМЕЩ является летучей функцией.
Летучие функции пересчитываются, даже если данные, относящиеся к формуле, не изменились. Поэтому летучие функции замедляют работу. Вот некоторые действия, которые могут инициировать пересчет летучей функции:
- Ввод новых данных (даже в другой книге).
- Удаление или вставка строки или столбца.
- Выполнение действий автофильтра.
- Двойной щелчек на разделителе строк или столбцов.
- Переименование листа.
- Изменение положения листа в книге относительно других листов.
Ранее мы уже обсуждали летучую функцию ДВССЫЛ. Также летучими являются: ЯЧЕЙКА, СЛЧИС, ИНФОРМАЦИЯ, ТДАТА, СЕГОДНЯ. [1] Если скорость пересчета не является проблемой (у вас небольшой набор данных, не много формул, или вас это не волнует), летучая функция СМЕЩ также отлично подойдет для создания динамического диапазона. [2]
Создание динамических диапазонов с помощью опции Таблица. Если вы выбрали диапазон и конвертировали его в таблицу (нажав Ctrl+T), то последующее добавление данных автоматически расширит диапазон Таблицы. В некторых случаях этого будет вполне достаточно для управления изменяющимися данными. Однако, Таблицы имеют ряд ограничений:
- Динамический диапазон, подобный показанному на рис. 13.3 не может быть создан с помощью опции Таблица.
- Заголовки Таблиц не могут содержать формулы.
- Таблицы не поддерживают функции ПРОМЕЖУТОЧНЫЕ.ИТОГИ.
- Вы не можете применить пользовательские представления (custom views) в Таблице. [3]
Динамический диапазон может быть создан на основе формулы, которая просматривает весь столбец, всю строку или некоторые ячейки, и отбирает данные на основе условий. Вы можете использовать для этого функцию ИНДЕКС, имеющую три аргумента:
=ИНДЕКС(массив,номер_строки,номер_столбца)
Обычно, вы выполняете поиск в двумерном диапазоне, помещая этот диапазон в аргумент массив. Например, формула =ИНДЕКС(B4:E15;2;3) вернет значение, хранящееся в ячейке D5, находящейся на пересечении второй строки и третьего столбца в массиве B4:E15. Если ваша цель – получить весь столбец а не ячейку на пересечении строки и столбца, вы вводите ноль или оставляете пустым аргумент номер_строки, и вводите требуемое значение в аргумент номер_столбца. Оставив аргумент номер_строки пустой (или введя ноль), вы говорите «получить все строки» в выбранном столбце. Поскольку в этом случае функция ИНДЕКС вернет массив значений, прежде чем ее ввести выберите соответствующее число ячеек и введите функцию, нажав Ctrl+Alt+Enter. Например, формула {=ИНДЕКС(B4:E15;;3)} вернет 12 значений.
Если вашей целью является получение всей строки, просто опустите аргумент номер_столбца (он является необязательным). Оставив аргумент номер_столбца пустым (или введя ноль), вы говорите «получить все столбцы» в выбранной строке. Рис. 13.4 и 13.5 иллюстрируют формулы для выборки целой строки или целого столбца. Поскольку цель – суммировать все значения, относящиеся к одному месяцу, функция ИНДЕКС помещается в качестве аргумента внутрь функции СУММ.
Рис. 13.4. Если в качестве условяи выбран Фев, ИНДЕКС просматривает столбец В3:В6 или строку В10:Е10
Рис. 13.5. Если в качестве условяи выбран Мар, ИНДЕКС просматривает столбец С3:С6 или строку В11:Е11
Функции массива, использующие массив, возвращаемый функцией ИНДЕКС (в примерах 13.4 и 13.5 это СУММ), не требуют нажатия Ctrl+Shift+Enter. Есть, правда, два исключения:
- Если вы помещаете в формулу прямой оператор массива, который требует Ctrl+Shift+Enter, то вам нужно использовать Ctrl+Shift+Enter.
- Если вы хотите, чтобы функция вернула несколько значений в несколько ячеек, вы должны использовать Ctrl+Shift+Enter.
Прежде чем создавать формулу динамического диапазона, выясните:
- Будет ли он вертикальным, горизонтальным или двумерным?
- Являются ли исходные данными числовыми, текстовыми, или смешанными?
- Есть ли пустые ячейки?
Ответы на эти вопросы определяют, какой формулой вы могли бы воспользоваться. Часто вы должны будете использовать концепцию «поиска последнего вхождения». Ниже мы рассмотрим различные формулы для определения последней строки исходных данных.
На рис. 13.6 представлены четыре столбца с различными типами данных: диапазон A5:A10 содержит смешанные данные без пустых ячеек до последней строки; диапазон А16:А21 содержит смешанные данные и пустую ячейку посреди массива; диапазон C5:C10 содержит числовые данные с пустыми ячейками до последнего элемента, диапазон C16:C21, содержит текстовые данные с пустыми ячейками до последнего элемента.
Рис. 13.6. Поиск последней позиции для данных различного формата
Во всех четырех случаях для того, чтобы создать динамический диапазон на основе формулы, которая будет расширяться и сжиматься, когда вы добавляете или удаляете данные, вам потребуется определить последнюю значимую относительную позицию в столбце. (Обратите внимание, что выражение «последняя строка в наборе данных» является неточным. Я говорю: «последняя значимая относительная позиция». Применительно к диапазону A5:A10 на рис. 13.6 следует сказать не строка 9, а позиция 5.)
Ключевая концепция для формул [2]–[6] состоит в том, что вам следует выбрать искомое_значение заведомо большим, чем любое возможное значение в диапазоне, а также выбрать тип_сопоставления – приблизительное (третий аргумент = 1 или опущен). В этом случае функция вернет номер последней значимой позиции в списке, даже если есть пустые ячейки.
Давайте рассмотрим работу этих формул подробнее.
Формула [1] =СЧЁТЗ(A5:A10)
- Эта формула вернет последнюю относительную позицию в диапазоне, не имеющем пустых ячеек. Функция СЧЁТЗ подсчитывает непустые ячейки в диапазоне. Формула обработает данные любого типа, даже текстовую строку нулевой длины.
- Если же где-то в середине диапазона есть пустая ячейка, этот метод не даст правильный ответ.
Формула [2] {=ПОИСКПОЗ(2;1/(A16:A21<>"
"
))}
- Эта формула пригодна для смешанных данных, когда есть пустые ячейки до последнего элемента.
- Оператор массива в аргументе просматриваемый_масив функции ПОИСКПОЗ работает следующим образом: 1/(A16:A21<>
"
"
) → 1/{#ДЕЛ/0!:ИСТИНА:ЛОЖЬ:ИСТИНА:ИСТИНА: ЛОЖЬ} → {#ДЕЛ/0!:1:#ДЕЛ/0!:1:1:#ДЕЛ/0!} - Поскольку число 2 больше, чем любое значение в вышеприведенном результирующем массиве, приблизительное совпадение выбирает последнее значимое число (1) и вовращает его позицию (5).
- Формула требует Ctrl+Shift+Enter, потому аргумент просматриваемый_масив функции ПОИСКПОЗ не был запрограммирован для обработки операций с массивами.
- К сожалению, формула вернет ошибочное значение, если последним значением в диапазоне будет текстовая строка нулевой длины или значение ошибки.
Формула [3] =ПОИСКПОЗ(9,99E+307;C5:C10)
- Эта формула пригодна для числовых данных. Введя максимально доступное в Excel число, с помощью приблизительного совпадения, вы определите позицию последнего числа в диапазоне. Использование формулы гарантирует правильный ответ, даже если внутри диапазона чисел есть пустые ячейки.
Формула [4] =ПОИСКПОЗ(100;C5:C10)
- Это менее амбициозная формула, дающая также верный ответ, если выбранное вами число 100 заведомо больше любого числа в диапазоне.
Формуле [5] =ПОИСКПОЗ("
Ω"
;C16:C21)
- Эта формула пригодна для текстовых данных. Она является примером концепции «большой текст». Если вы дадите аргументу искомое_значение формулы ПОИСКПОЗ значение, которое заведомо «больше» любого значения в диапазоне просматриваемый_масив, она всегда вернет относительную позицию последней значимой ячейки в диапазоне. Здесь Ω – последняя буква греческого алфавита (Омега). [4]
- Эта формула работает на данных любого типа, даже для текстовой строки нулевой длины.
Формуле [6] =ПОИСКПОЗ(ПОВТОР("
z"
;255);C16:C21)
- Эта формула пригодна для текстовых данных. Подобно формуле [5], она использует концепцию «большого текста». В качестве аргумента искомое_значение используется повтор буквы z 255 раз. Зачем так много? На всякий случай)) Эта формула не обнаружит ячейки, содержащие Омегу, но посчитают текстовые строки нулевой длины внутри диапазона.
Все концепции о нахождении в столбце относительной позиции последнего значимого элемента, будут также работать и для строк (рис. 13.7).
Рис. 13.7. Последняя значимая позиция в строке – четвертая
Совместное использование функций ИНДЕКС и ПОИСКПОЗ позволяет получать значение последнего элемента в диапазоне (рис. 13.8 и 13.9). На рис. 13.8 одно значение (Е2) возвращает последнее число, а другое (Е4) – идентификатор (ID) последней строки. На рис. 13.9 просто добавлено еще две строки данных.
Рис. 13.8. Формула ищет последние значения в столбцах А и С для четырех строк исходных данных
Рис. 13.9. Если в исходные данные добвать еще две строки, формулы вернут правильные значения
Используя функции ИНДЕКС и ПОИСКПОЗ можно создавать динамические диапазоны, которые расширяются и сокращаются при изменении объема исходных данных. Как показано на рис. 13.10, в ячейке E2 у вас раскрывающийся список на основе текстовых элементов диапазона $A$2:$A$5, а в ячейке F2 формула на основе ВПР, которая обращается к диапазону $A$2:$C$5 (аргумент таблица функции ВПР).
Рис. 13.10. Раскрывающийся список и функция ВПР
Проблема с этой формулой заключается в том, что при добавлении строк исходных данных, ни раскрывающийся список, ни аргумент таблица функции ВПР, не будут обновляться. Если вы добавляете новую запись, вы бы хотели, чтобы аргумент таблица изменился с $A$2:$C$5 на $A$2:$C$6. Обратите внимание, что оба диапазона в качестве начальной ссылаются на одну и туже ячейку – $A$2. Вот если бы существовал способ получить ссылку на последнюю ячейку в диапазоне после добавления или удаления записи! И такой способ есть! Используйте только что изученную комбинацию функций ИНДЕКС и ПОИСКПОЗ.
Вы можете создать динамический диапазон, поместив функцию ИНДЕКС в саму ссылку в качестве второй составляющей. Например, $A$2 и $C$5 по отдельности просто ссылки на ячейки. Однако, если вы поместите двоеточие между ними ($A$2:$C$5), они становятся началом и окончанием ссылки на диапазон ячеек. Статический диапазон выглядит так: $A$2:$C$5. Динамический диапазон, так $A$2:ИНДЕКС($C$2:$C$8;ПОИСКПОЗ(9,99E+307;$C$2:$C$8)). Поскольку функция ИНДЕКС находится за двоеточием и началом ссылки на диапазон, она больше не будет извлекать последний элемент в массиве; а вернет адрес ячейки (ссылку на ячейку) последнего элемента в диапазоне. Фантастика, но контекст изменил работу функции! Сама по себе функция ИНДЕКС возвращает содержимое ячейки. Функция ИНДЕКС, как элемент ссылки на диапазон, возвращает ссылку на ячейку (адрес). Чтобы увидеть, как это работает, создайте формулу, как в ячейке E2 на рис. 13.11.
Рис. 13.11. Контекст меняет все: функция ИНДЕКС возвращает ссылку на ячейку, потому что она находится за двоеточием и началом ссылки на диапазон
Чтобы показать, что эта формула действительно создала динамический диапазон, выделяйте различные фрагмены формулы и с помощью F9 посмотрите, какие результаты вы получите:
- Рис. 13.12. Выделите полностью функцию ИНДЕКС.
- Рис. 13.13. Нажмите F9, и вы увидите, что функция просто возвращает значение последнего элемента. Это еще раз показывает, что обычно ИНДЕКС возвращает содержимое ячейки. Отменить расчет, нажав Ctrl+Z.
- Рис. 13.14. Выделите всю формулу и нажмите F9. Поскольку функция ИНДЕКС помещена в контекст ссылки, теперь формула возвращает весь диапазон в синтаксисе массива.
- Рис. 13.15. Введите формулу с помощью Ctrl+Shift+Enter. Помните, что это массив из многих элементов, следовательно, формула, введенная в одну ячейку не может отобразить более одного элемента одновременно. Отображается только первый элемент массива.
- Рис. 13.16. Выполните вычисление формулы, перейдя на вкладку Формулы → область Зависимости формул → Вычислить формулы (или, удерживая Alt, нажмите последовательно Л, Ч). Откроется окно Вычисление формулы, и вы увидите, что ИНДЕКС возвращает ссылку на ячейку $C$5.
Рис. 13.12. Выделяя полностью функцию ИНДЕКС со всем ее содержимым
Рис. 13.13. Функция ИНДЕКС сама по себе возвращает содержимое последнего элемента
Рис. 13.14. Выделение начальной ссылки, двоеточия и ИНДЕКС возвращает весь диапазон
Рис. 13.15. Хотя у вас формула массива, в одной ячейке может отражаться только один элемент
Рис. 13.16. Функция ИНДЕКС в контексте ссылки на диапазон
Как показано на рис. 13.18–13.20, формула справляется с добавлением и удалением записей, а также с пустыми ячейками внутри диапазона.
Рис. 13.18. Динамический диапазон на основе формулы работает при добавлении записи
Рис. 13.19. А также при удалении
Рис. 19.20. Динамический диапазон работает при наличии пустой ячейки
При создании формулы динамического диапазона учтите следующее:
- Выделите достаточное количество строк, чтобы вместить все потенциальные записи. Например, если число записей никогда не превысит 50, используйте формулу =$A$2:ИНДЕКС($C$2:$C$51;ПОИСКПОЗ(9,99E+307;$C$2:$C$51)). Если вы не можете предположить, сколько будет записей, используйте что-то типа: =$A$2:ИНДЕКС($C:$C;ПОИСКПОЗ(9,99E+307;$C:$C)).
- Не набирайте лишние данные ниже в ячейках, относящихся к диапазону. Они ненароком могут быть засчитаны.
Присвойте динамическому диапазону имя. Формула, которую вы создали выше для динамического диапазона не может непосредственно использоваться при создании выпадающего списка. Если вы попробуете использовать ее, то получите сообщение об ошибке. Эту проблему легко обойти, если присвоить имя диапазону на основе формулы ИНДЕКС. Затем вы сможете использовать это имя для проверки данных в раскрывающемся списке.
Более того, старайтесь присваивать имя любому динамическому диапазону. В дальнейшем вы сможете использовать имя в формулах, диаграммах, сводных таблицах, коде VBA и др. Если вы присвоили имя диапазону на основе формулы, которая требует Ctrl+Shift+Enter, и затем используете имя в другой формуле, эта последняя уже не будет требовать нажатия Ctrl+Shift+Enter (подробнее см. главу 23).
Я обычно начинаю с создания формулы в ячейке, а затем копирую ее в буфер и вставляю в поле Диапазон диалогового окна Создание имени. Это намного проще, чем создавать формулу непосредственно в диалоговом окне. На рис. 13.21 показано, как можно создать формулы в ячейках Е2 и Е4, соответственно, для выпадающего списка и таблицы подстановки.
Рис. 13.21. Для начала создайте формулы динамического диапазона в ячейках Е2 и Е4
После того как вы создали формулу для раскрывающегося списка (в ячейке E4), скопируйте ее в буфер. Откройте диалоговое окно Диспетчер имен, нажав Ctrl+F3, а затем нажмите на кнопку Создать. В открывшемся окне Создание имени ведите имя без пробелов в текстовом поле Имя (рис. 13.22). Введите примечание, чтобы в последствии вспомнить, что вы, собственно говоря, создали. Вставьте из буфера формулу в поле Диапазон. Нажмите Ok.
Рис. 13.22. Присвоение имени динамическому диапазону идентификаторов
Создайте раскрывающийся список. Выделите ячейку Е7. Откройте окно Проверка вводимых значений, нажав Alt а затем последовательно Ы, Ы, В, или пройдите по меню Данные → Проверка данных → Проверка данных (рис. 13.23). Выберите тип данных Список. В поле Формула введите знак равенства и имя Список.
Рис. 13.23. Введите имя диапазона в окно Проверка вводимых значений
Теперь, когда у вас в ячейке Е7 есть раскрывающийся список на основе поименованного динамического диапазона, можно ввести формулу ВПР в ячейку F7. Можете воспользоваться примером, как на рис. 13.24, или можете создать имя для динамической таблицы подстановки и затем использовать это имя в формуле ВПР. После ввода формулы в ячейку F7, вы можете скопировать ее в ячейку G7. Обратите внимание, как оригинально задан аргумент номер_столбца.
Рис. 13.24. Аргумент таблица функции ВПР содержит формулу динамического диапазона
Теперь, когда у вас две формулы динамического диапазона (в выпадающем списке и внутри ВПР), вы можете протестировать эту конструкцию (рис. 13.25). Если вы добавляете данные, и раскрывающийся список, и формула ВПР обновятся. Они также работают при удалении данных.
Рис. 13.25. При добавлении данных динамический диапазон работает отлично
В некоторых случаях у вас может быть набор данных, который содержит пустую строку или в котором отсутствуют некоторые данные. При этом вы бы хотели определить динамический диапазон так, чтобы он включал в себя все значения (рис. 13.26). На рис. 13.27 приведены две формулы, которые определяют диапазон $A$2:$C$6 несмотря на пустую строку и недостающие данные.
Рис. 13.26. Отсутствующие данные могут помешать «правильно» определить динамический диапазон, а вы бы хотели, чтобы он включал все данные $A$2:$C$6
Рис. 13.27. Эти формулы определяет диапазон $A$2:$C$6
Давайте рассмотрим еще более необычную ситуацию. Что, если у вас могут быть ячейки, содержащие пробелы (невидимые глазу)!? Если вы не хотите включать их в динамический диапазон, добавьте функцию СЖПРОБЕЛЫ, которая удаляет все пробелы, за исключением одного пробела между словами (рис. 13.28). А как вы помните, текстовые строки нулевой длины в диапазон не включаются.
Рис. 13.28. Формула не включит в диапазон ячейки с пробелами и текстовыми строками нулевой длины
Давайте подробнее рассмотрим работу этой формулы. Формула создает динамический диапазон не включающий ячейки с пробелами и ячейки, содержащие текстовые строки нулевой длины.
Использование функции СМЕЩ для создания динамического диапазона
Функция СМЕЩ имеет пять аргументов:
Функция СМЕЩ говорит: сместись от отправной точки (аргумент ссылка) на столько-то строк и столбцов (смещ_по_строкам и смещ_по_столбцам), и от этой новой ячейки выбери диапазон такой-то высоты и ширины (аргументы высота и ширина). Заметьте, что функция СМЕЩ определяет диапазон. На рис 13.30 показан пример СМЕЩ, который предполагает, что в диапазоне А2:А5 могут быть только числа и не будет пустых ячеек (иначе функция СЧЁТ не справится с определением количества непустых ячеек).
Рис. 13.30. Функция СМЕЩ определяет диапазон $A$2:$A$3
Динамический диапазон начинается в ячейке $A$2 (аргумент ссылка), точка отсчета диапазона не смещается, ни по строкам, ни по столбцам (второй и третий аргументы опущены); высота диапазона 2 (именно это значение возвращает формула СЧЁТ($A$2:$A$5); ширина диапазона 1, потому что аргумент ширина также опущен. Обратите внимание, что в случае, если аргументы опущены, то смещ_по_строкам и смещ_по_столбцам принимают значение 0, а высота и ширина – значения, соответствующие ширине и высоте диапазона в аргументе ссылка (в нашем случае это одна ячейка $A$2, и следовательно, ширина и высота по умолчанию равняются 1). При этом аргументы смещ_по_строкам и смещ_по_столбцам являются обязательными, а высота и ширина – необязательными. Например, формула =СМЕЩ($A$2) вернет ошибку – Для данной функции введено слишком мало аргументов, а формула =СМЕЩ($A$2;;) вернет значение 174. Ну, и наконец, функция СМЕЩ не требует Ctrl+Shift+Enter.
Если вам нужно создать динамический диапазон как часть таблицы, какой метод предпочесть: ИНДЕКС или СМЕЩ? На рис. 13.31 приведены данные, включающие название города, инициалы и телефон представителя. Названия некоторых городов будут повторяться, потому что у вас может быть более одного представителя в каждом городе. Вы хотите создать динамический диапазон инициалов, основанный на названии города (помещенном в ячейку E2). Например, если у вас в Е2 Сиэтл, вы бы хотели извлечь диапазон $B$4:$B$6. Если у вас в ячейке E2 Сан-Франциско (SF), вы бы хотели извлечь диапазон $B$2:$B$3. Такая формула может быть использована, например, для формирования выпадающего списка, в котором вы хотите видеть инициалы представителей одного города, указанного в ячейке. На рис. 13.31 приведены три формулы, которые могут выполнить эту задачу.
Рис. 13.31. Функции СМЕЩ и Индекс для извлечения динамичсекого диапазона из таблицы
Давайте подробнее рассмотрим работу этих формул.
Формула [1] {=СМЕЩ($B$1;ПОИСКПОЗ($E$2;$A$2:$A$6;0);;СЧЁТЕСЛИ($A$2:$A$6;$E$2))}
- Аргумент ссылка функции СМЕЩ обозначает точку отсчета – ячейку $B$1.
- ПОИСКПОЗ находит относительное положение Сиэтла в диапазоне A2:A6 и возвращает 3 – первое вхождение Сиэтла в таблице. Таким образом, аргумент смещ_по_строкам = 3. Начальная ячейка для извлекаемого диапазона – $B$4.
- Аргумент смещ_по_столбцам опущен, так что остаемся в столбце В.
- СЧЁТЕСЛИ насчитывает три Сиэтла в диапазоне A2:A6. Потому аргумент высота функции СМЕЩ = 3; динамический диапазон будет включать три строки.
- Аргумент ширина пуст, и поэтому динамический диапазон будет такой же ширины, как и диапазон в аргументе ссылка; в нашем случае = 1.
- Динамический диапазон определяется, как $B$4:$B$6, когда в ячейке E2 Сиэтл и $B$2:$B$3, когда – SF (проверьте!).
Формула [2] {=ИНДЕКС($B$2:$B$6;ПОИСКПОЗ($E$2;$A$2:$A$6;0)): ИНДЕКС($B$2:$B$6;ПОИСКПОЗ($E$2;$A$2:$A$6;0)+СЧЁТЕСЛИ($A$2:$A$6;$E$2)-1)}
- Эта формула динамического диапазона использует две функции ИНДЕКС, чтобы найти начальную и конечную ссылки диапазона.
- Первая формула ИНДЕКС($B$2:$B$6;ПОИСКПОЗ($E$2;$A$2:$A$6;0)) возвращает ссылку $B$4 (помните, что в соответствующем контексте ИНДЕКС возвращает не значение, хранящееся в ячейке, а ссылку на ячейку).
- Формула принимает вид {=$B$4:ИНДЕКС($B$2:$B$6;ПОИСКПОЗ($E$2;$A$2:$A$6;0)+ СЧЁТЕСЛИ($A$2:$A$6;$E$2)-1)}
- ПОИСКПОЗ($E$2;$A$2:$A$6;0)+СЧЁТЕСЛИ($A$2:$A$6;$E$2)-1 → 3 + СЧЁТЕСЛИ($A$2:$A$6;$E$2)-1 → 3 + 3 – 1 = 5
- Формула примет вид =$B$4:ИНДЕКС($B$2:$B$6;5) → $B$4:$B$6.
Формула [3] {=ИНДЕКС($B$2:$B$6;ПОИСКПОЗ($E$2;$A$2:$A$6;0)): ИНДЕКС($B$2:$B$6;ПОИСКПОЗ(2;1/($A$2:$A$6=$E$2)))}
- Эта формула аналогична предыдущей, за исключением того, что вместо сочетания ПОИСКПОЗ и СЧЁТЕСЛИ для определения позиции последнего вхождения Сиэтла, здесь используется оператор массива.
- Вот этот фрагмент формулы: ИНДЕКС($B$2:$B$6;ПОИСКПОЗ(2;1/($A$2:$A$6=$E$2))).
- ПОИСКПОЗ(2;1/($A$2:$A$6=$E$2))) → ПОИСКПОЗ(2;1/($A$2:$A$6= «Seattle»))) → ПОИСКПОЗ(2;1/({ЛОЖЬ:ЛОЖЬ:ИСТИНА:ИСТИНА:ИСТИНА})) → ПОИСКПОЗ(2;{#ДЕЛ/0!:#ДЕЛ/0!:1:1:1}) → 5
- Формула далее примет вид =$B$4:ИНДЕКС($B$2:$B$6;5) → $B$4:$B$6.
Какую функцию (СМЕЩ или ИНДЕКС) предпочесть при создании динамических диапазонов? СМЕЩ – это летучая функция, а ИНДЕКС – нет. Если скорость расчетов в вашем конкретном случае не является критичным фактором, использование ИНДЕКС или СМЕЩ – это вопрос предпочтений. Если скорость для вас важна, используйте ИНДЕКС.
Диаграммы с использованием имен на основе формул динамического диапазона
Одно из основных применений формул динамического диапазона – это диаграммы. Например, если у вас есть набор данных, которые постоянно добавляются, очень удобно, если новые данные автоматически отображаются на диаграмме. Другой пример – график конкретного набора данных, выбираемый из большого числа различных наборов данных на основе критерия, хранящегося в ячейке. В обоих случаях, чтобы создать диаграмму на основе динамического диапазона:
- Создайте динамические диапазоны на основе формул.
- Присвойте каждому диапазону имя.
- Создайте диаграмму.
- Вставить имена в диаграмму.
Рассмотрим примеры. На рис. 13.34 цель – построить гистограмму, где по оси Х будут инициалы представителей, а по оси Y – продажи; гистограмма должна быть построена только для города, хранящегося в ячейке F1. Ячейка А8 содержит формулу динамического диапазона для продаж, а ячейка A9 – для представителей. Чтобы показать различные подходы, одна формула основана на функции СМЕЩ, а вторая – ИНДЕКС. Вы можете выбрать тот, который вам больше нравится. Вы используете динамический диапазон представителей для горизонтальной оси, и динамический диапазон продаж для вертикальной оси. Далее, вам потребуется создать два имени. На рис. 13.35 показано создание одного из них – для продаж. По аналогии создайте имя для представителей.
Рис. 13.34. Создание формулы на основе динамического диапазона
Рис. 13.35. Присвоение имени формуле динамического диапазона продаж
Создайте диаграмму на основе значений в ячейках В1:С6 (рис. 13.36).
Рис. 13.36. Диаграмма на основе значений в ячейках В1:С6
Далее, вам нужно заменить диапазоны ячеек диаграммы на имена динамических диапазонов. Чтобы сделать это, щелкните правой кнопкой мыши на диаграмме, и кликните в контекстном меню на Выбрать данные, или перейдите на вкладку Работа с диаграммами → Конструктор и кликните на кнопке Выбрать данные. Далее, выделите ряд Продажи в левой части окна и щелкните на кнопку Изменить (рис. 13.37).
Рис. 13.37. Выберите ряд Продажи и кликните на кнопку Изменить
В открывшемся окне Изменение ряда выделите только диапазон ячеек в области Значения. Не выделяйте ссылку на лист (рис. 13.38). Удалите выделенные ячейки, и введите имя диапазона (рис. 13.39). Убедитесь, что вы не удалили восклицательный знак. Нажмите Оk.
Рис. 13.38. Выделите только диапазон ячеек в области Значения, не трогая название листа
Рис. 13.39. После удаления ссылки на ячейки введите имя диапазона
Аналогичным образом введите имя Представители вместо ссылки на ячейки (рис. 13.40). Кликните на кнопку Изменить в правой части окна Выбор исчтоника данных (а); в открывшемся окне Подписи оси (б) выделите только диапазон ячеек. Не выделяйте ссылку на лист. Удалите ссылку на ячейки и введите имя диапазона Представители (в). Убедитесь, что вы не удалили восклицательный знак. Нажмите Оk.
Рис. 13.40. Введите имя Представители вместо ссылки на ячейки
Как показано на рис. 13.41, вы можете проверить как диаграмма отреагирует на изменение города в ячейке F1.
Рис. 13.41. Выбрав в ячейке F1 Сиэтл (а) или Сан-Франциско (б), диаграмма отобразит продажи только соответствующих городу представителей
Создание динамической диаграммы с помощью сводной таблицы:
- Создайте сводную таблицу (рис. 13.43).
- Вставьте срез (в Excel 2013 вкладка Работа со сводными таблицами → Анализ → область Фильтры → кнопка Вставить срез).
- Виберите город в срезе и нажмите Alt+F1; создастся диаграмма по умолчанию; отформатируйте ее.
Рис. 13.43. Фильтр среза сводной таблицы позволяет создать динамическую диаграмму
В следующем примере динамический диапазон позволяет получать пять последних чисел столбца (рис. 13.44). Создайте динамический диапазон на основе функций ИНДЕКС и ПОИСКПОЗ. Формула [1] находит адрес последней ячейке в столбце, а адрес первой просто на 4 строки меньше. При этом формула [1] включит в суммирование ячейку А6 (пустую), как одну их пяти последних. Если вы этого не хотите, воспользуйтесь формулой [2].
Рис. 13.44. Формула суммирующая пять последних значение в столбце
Формула [2] для ввода требует Ctrl+Shift+Enter (помните козырное правило функции ЕСЛИ?). Для создания формулы, которая бы не требовала нажатия Ctrl+Shift+Enter, сохраните фрагмент с ЕСЛИ под определенным именем, а затем подставляйте это имя в большие формулы. Например, сохраните целиком аргумент функции [2] СУММ под именем ПоследниеПять (рис. 13.45). Теперь формула не потребует нажатия Ctrl+Shift+Enter.
Рис. 13.45. Создайте имя, и подставьте его в формулу; это избавит вас от нажатия Ctrl+Shift+Enter
Давайте подробнее рассмотрим работу фрагмента формулы [2]: НАИБОЛЬШИЙ(ЕСЛИ(ЕЧИСЛО($A$2:$A$10);СТРОКА($A$2:$A$10)-СТРОКА($A$2)+1);$C$2)
Этот фрагмент должен вернуть относительные позиции в массиве пяти последних чисел без учета пустых ячеек: НАИБОЛЬШИЙ(ЕСЛИ(ЕЧИСЛО($A$2:$A$10);СТРОКА($A$2:$A$10)-СТРОКА($A$2)+1); $C$2) → НАИБОЛЬШИЙ(ЕСЛИ({ИСТИНА:ИСТИНА:ИСТИНА:ИСТИНА:ЛОЖЬ: ИСТИНА:ИСТИНА:ЛОЖЬ: ЛОЖЬ};СТРОКА($A$2:$A$10)-СТРОКА($A$2)+1);$C$2) → НАИБОЛЬШИЙ({1:2:3:4:ЛОЖЬ:6:7:ЛОЖЬ: ЛОЖЬ};5) → 2. Функция ИНДЕКС затем использует этот параметр 2 для выбора адреса второго элемнета в массиве $A$2:$A$10 в качестве начальной ссылки для динамического диапазона ($A$3).
Теперь мы обладаем достаточными навыками, чтобы написать формулу (см. рис. 13.3), которую можно скопировать вдоль столбца, а не использовать несколько различных формул в заранее определенных ячейках (как это было на рис. 13.3). С помощью динамического диапазона мы можем извлечь только те значения рейтингов, которые относятся к определенному семестру и отвечают пороговому критерию (рис. 13.46). В ячейке C4 вы создали формулу, которую можно скопировать вниз, чтобы подсчитать количество ркйтингов за семестр превышающих порог в 2,5 балла. Вы можете использовать функцию СЧЁТЕСЛИ, для которой просматриваемый диапазон будет меняться в различных ячейках столбца С.
Примечание. Аргумент диапазон функции СЧЁТЕСЛИ не может обрабатывать операторы массива (см. главу 10). Но, поскольку функция ИНДЕКС возвращает не массив, а ссылку, функция СЧЁТЕСЛИ справляется со своей работой.
Рис. 13.46. Использование динамического диапазона позволяет извлечь только те значения, которые относятся к строкам после предыдущего вхождения текста в столбце А; например, в ячейке С12, анализируются только значения В10:В12, так как предыдущий текст встретился в ячейке А10
Рассмотрим подробнее работу формулы, например в ячейке C9. Вам нужен динамический диапазон, который будет включать только значения, введенные после последнего ввода текста в столбце А.
1. =ЕСЛИ(A10<>"
"
;СЧЁТЕСЛИ(ИНДЕКС($B$3:B9;ПОИСКПОЗ("
ЯЯЯ"
;$A$3:A9)): B9;"
>"
&$C$1);"
"
)
Обратите внимание, что диапазоны, первоначально введенные в формулу в ячейке С4, расширились до $B$3:B9 и $A$3:A9. Элемент формулы ПОИСКПОЗ("
ЯЯЯ"
;$A$3:A9) возвращает относительное положение (6) в аргумент номер_строки функции ИНДЕКС, которое соответствует относительному положению текста Осень-12 в диапазоне $A$3:A9.[5]
2. =ЕСЛИ(A10<>"
"
;СЧЁТЕСЛИ(ИНДЕКС($B$3:B9;6):B9;"
>"
&$C$1);"
"
)
Элемент формулы ИНДЕКС($B$3:B9;6) возвращает ссылку на ячейку B8.
3. =ЕСЛИ(A10<>"
"
;СЧЁТЕСЛИ(В8:B9;"
>"
&$C$1);"
"
) → =ЕСЛИ(A10<>"
"
,СЧЁТЕСЛИ(B8:B9,"
>2,5"
);"
"
) → =ЕСЛИ(A10<>"
"
;1;"
"
)
Т.к. ячейка A10 не является пустой, ЕСЛИ возвращает значение 1. Результат работы формулы в ячейке C9 – единица.
[1] Мне встретился и более широкий список.
[3] Извините, но я не смог понять, чтобы это значило…
[4] Надо заметить, что современные шрифты на основе шестнадцатеричного Юникода обладают существенно большим набором символов, так что греческая Омега уже не является символом с самым большим кодом.
[5] Любопытно, что в оригинальном (английском) тексте использовался другой символ в качестве «большого текста» – ПОИСКПОЗ("
Ω"
;$A$3:A9); в нашем случае эта функция возвращала ошибку, так как код любого русского символа больше кода греческой буквы Омега.