Перейти к содержимому

Глава 13. Динамические диапазоны на основе функций ИНДЕКС и СМЕЩ

Это глава из книги: Майкл Гирвин. Ctrl+Shift+Enter. Освоение формул массива в Excel.

Предыдущая глава                            Оглавление                              Следующая глава

В этой главе вы узнаете о том, как создать динамический диапазон с помощью формул. Динамический диапазон можно использовать в формулах, диаграммах, сводных таблицах и других случаях, когда ожидают, что диапазон может увеличиваться или уменьшаться при добавлении или удалении исходных данных, или изменяться на основе критериев, используемых в формулах.

На рис. 13.1 и 13.2 приведен пример расширения исходного набора данных. Если вы используете динамический диапазон внутри функции СУММ, диапазон A2:A4 будет автоматически расширяться до А2:А5, если новое число (в ячейке А5) добавляется к исходным данным.

Рис. 13.1. Функция СУММ для диапазона А2,A4

Рис. 13.1. Функция СУММ для диапазона А2:А4

Скачать заметку в формате Word или pdf, примеры в Excel2013

Рис. 13.2. Динамический диапазон внутри функции СУММ

Рис. 13.2. Динамический диапазон внутри функции СУММ должен автоматически расширяться с А2:А4 до А2:А5 при добавлении новых данных

Рис. 13.3 демонстрирует еще один пример, в котором без динамического диапазона также не обойтись. Вам нужна формула в аргументе диапазон функции СЧЁТЕСЛИ, чтобы этот диапазон обращался только к рейтингам одного семестра. В ячейке C5, вам нужно, чтобы функция СЧЁТЕСЛИ подсчитывала данные из диапазона B2:B5. А при копировании формулы вниз, С6 оставлась пустой, а в C7, функция обращалась к диапазону B6:B7.

Рис. 13.3. Формула для расчета довольно простая

Рис. 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. Функция ИНДЕКС

Рис. 13.4. Если в качестве условяи выбран Фев, ИНДЕКС просматривает столбец В3:В6 или строку В10:Е10

Рис. 13.5. Функция ИНДЕКС для марта

Рис. 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. Поиск последней позиции для данных различного формата

Рис. 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.7. Последняя значимая позиция в строке – четвертая

Совместное использование функций ИНДЕКС и ПОИСКПОЗ позволяет получать значение последнего элемента в диапазоне (рис. 13.8 и 13.9). На рис. 13.8 одно значение (Е2) возвращает последнее число, а другое (Е4) – идентификатор (ID) последней строки. На рис. 13.9 просто добавлено еще две строки данных.

Рис. 13.8. Формула ищет последние значения в столбцах А и С для четырех строк исходных данных

Рис. 13.8. Формула ищет последние значения в столбцах А и С для четырех строк исходных данных

Рис. 13.9. Если в исходные данные добвать еще две строки, формулы вернут правильные значения

Рис. 13.9. Если в исходные данные добвать еще две строки, формулы вернут правильные значения

Используя функции ИНДЕКС и ПОИСКПОЗ можно создавать динамические диапазоны, которые расширяются и сокращаются при изменении объема исходных данных. Как показано на рис. 13.10, в ячейке E2 у вас раскрывающийся список на основе текстовых элементов диапазона $A$2:$A$5, а в ячейке F2 формула на основе ВПР, которая обращается к диапазону $A$2:$C$5 (аргумент таблица функции ВПР).

Рис. 13.10. Раскрывающийся список и функция ВПР

Рис. 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. Контекст меняет все

Рис. 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.12. Выделяя полностью функцию ИНДЕКС со всем ее содержимым

Рис. 13.13. Функция ИНДЕКС сама по себе возвращает содержимое последнего элемента

Рис. 13.13. Функция ИНДЕКС сама по себе возвращает содержимое последнего элемента

Рис. 13.14. Выделение начальной ссылки, двоеточия и ИНДЕКС возвращает весь диапазон

Рис. 13.14. Выделение начальной ссылки, двоеточия и ИНДЕКС возвращает весь диапазон

Рис. 13.15. Хотя у вас формула массива, в одной ячейке может отражаться только один элемент

Рис. 13.15. Хотя у вас формула массива, в одной ячейке может отражаться только один элемент

Рис. 13.16. Функция ИНДЕКС в контексте ссылки на диапазон

Рис. 13.16. Функция ИНДЕКС в контексте ссылки на диапазон

Как показано на рис. 13.18–13.20, формула справляется с добавлением и удалением записей, а также с пустыми ячейками внутри диапазона.

Рис. 13.18. Динамический диапазон на основе формулы работает при добавлении записи

Рис. 13.18. Динамический диапазон на основе формулы работает при добавлении записи

Рис. 13.19. А также при удалении

Рис. 13.19. А также при удалении

Рис. 13.20. Динамический диапазон работает при наличии пустой ячейки

Рис. 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

Рис. 13.21. Для начала создайте формулы динамического диапазона в ячейках Е2 и Е4

После того как вы создали формулу для раскрывающегося списка (в ячейке E4), скопируйте ее в буфер. Откройте диалоговое окно Диспетчер имен, нажав Ctrl+F3, а затем нажмите на кнопку Создать. В открывшемся окне Создание имени ведите имя без пробелов в текстовом поле Имя (рис. 13.22). Введите примечание, чтобы в последствии вспомнить, что вы, собственно говоря, создали. Вставьте из буфера формулу в поле Диапазон. Нажмите Ok.

Рис. 13.22. Присвоение имени динамическому диапазону идентификаторов

Рис. 13.22. Присвоение имени динамическому диапазону идентификаторов

Создайте раскрывающийся список. Выделите ячейку Е7. Откройте окно Проверка вводимых значений, нажав Alt а затем последовательно Ы, Ы, В, или пройдите по меню ДанныеПроверка данныхПроверка данных (рис. 13.23). Выберите тип данных Список. В поле Формула введите знак равенства и имя Список.

Рис. 13.23. Введите имя диапазона в окно Проверки вводимых значений

Рис. 13.23. Введите имя диапазона в окно Проверка вводимых значений

Теперь, когда у вас в ячейке Е7 есть раскрывающийся список на основе поименованного динамического диапазона, можно ввести формулу ВПР в ячейку F7. Можете воспользоваться примером, как на рис. 13.24, или можете создать имя для динамической таблицы подстановки и затем использовать это имя в формуле ВПР. После ввода формулы в ячейку F7, вы можете скопировать ее в ячейку G7. Обратите внимание, как оригинально задан аргумент номер_столбца.

Рис. 13.24. Аргумент таблица функции ВПР содержит формулу динамического диапазона

Рис. 13.24. Аргумент таблица функции ВПР содержит формулу динамического диапазона

Теперь, когда у вас две формулы динамического диапазона (в выпадающем списке и внутри ВПР), вы можете протестировать эту конструкцию (рис. 13.25). Если вы добавляете данные, и раскрывающийся список, и формула ВПР обновятся. Они также работают при удалении данных.

Рис. 13.25. При добавлении данных динамический диапазон работает отлично

Рис. 13.25. При добавлении данных динамический диапазон работает отлично

В некоторых случаях у вас может быть набор данных, который содержит пустую строку или в котором отсутствуют некоторые данные. При этом вы бы хотели определить динамический диапазон так, чтобы он включал в себя все значения (рис. 13.26). На рис. 13.27 приведены две формулы, которые определяют диапазон $A$2:$C$6 несмотря на пустую строку и недостающие данные.

Рис. 13.26. Отсутствующие данные могут помешать «правильно» определить динамический диапазон

Рис. 13.26. Отсутствующие данные могут помешать «правильно» определить динамический диапазон, а вы бы хотели, чтобы он включал все данные $A$2:$C$6

Рис. 13.27. Эти формулы определяет диапазон A2_C6

Рис. 13.27. Эти формулы определяет диапазон $A$2:$C$6

Давайте рассмотрим еще более необычную ситуацию. Что, если у вас могут быть ячейки, содержащие пробелы (невидимые глазу)!? Если вы не хотите включать их в динамический диапазон, добавьте функцию СЖПРОБЕЛЫ, которая удаляет все пробелы, за исключением одного пробела между словами (рис. 13.28). А как вы помните, текстовые строки нулевой длины в диапазон не включаются.

Рис. 13.28. Формула не включит в диапазон ячейки с пробелами и текстовыми строками нулевой длины

Рис. 13.28. Формула не включит в диапазон ячейки с пробелами и текстовыми строками нулевой длины

Давайте подробнее рассмотрим работу этой формулы. Формула создает динамический диапазон не включающий ячейки с пробелами и ячейки, содержащие текстовые строки нулевой длины.

Рис. 13.29

Использование функции СМЕЩ для создания динамического диапазона

Функция СМЕЩ имеет пять аргументов:

Рис. 13.29а. Функция СМЕЩ

Функция СМЕЩ говорит: сместись от отправной точки (аргумент ссылка) на столько-то строк и столбцов (смещ_по_строкам и смещ_по_столбцам), и от этой новой ячейки выбери диапазон такой-то высоты и ширины (аргументы высота и ширина). Заметьте, что функция СМЕЩ определяет диапазон. На рис 13.30 показан пример СМЕЩ, который предполагает, что в диапазоне А2:А5 могут быть только числа и не будет пустых ячеек (иначе функция СЧЁТ не справится с определением количества непустых ячеек).

Рис. 13.30. Функция СМЕЩ определяет диапазон $A$2_$A$3

Рис. 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. Функции СМЕЩ и Индекс для извлечения динамичсекого диапазона из таблицы

Рис. 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.

Какую функцию (СМЕЩ или ИНДЕКС) предпочесть при создании динамических диапазонов? СМЕЩ – это летучая функция, а ИНДЕКС – нет. Если скорость расчетов в вашем конкретном случае не является критичным фактором, использование ИНДЕКС или СМЕЩ – это вопрос предпочтений. Если скорость для вас важна, используйте ИНДЕКС.

Диаграммы с использованием имен на основе формул динамического диапазона

Одно из основных применений формул динамического диапазона – это диаграммы. Например, если у вас есть набор данных, которые постоянно добавляются, очень удобно, если новые данные автоматически отображаются на диаграмме. Другой пример – график конкретного набора данных, выбираемый из большого числа различных наборов данных на основе критерия, хранящегося в ячейке. В обоих случаях, чтобы создать диаграмму на основе динамического диапазона:

  1. Создайте динамические диапазоны на основе формул.
  2. Присвойте каждому диапазону имя.
  3. Создайте диаграмму.
  4. Вставить имена в диаграмму.

Рассмотрим примеры. На рис. 13.34 цель – построить гистограмму, где по оси Х будут инициалы представителей, а по оси Y – продажи; гистограмма должна быть построена только для города, хранящегося в ячейке F1. Ячейка А8 содержит формулу динамического диапазона для продаж, а ячейка A9 – для представителей. Чтобы показать различные подходы, одна формула основана на функции СМЕЩ, а вторая – ИНДЕКС. Вы можете выбрать тот, который вам больше нравится. Вы используете динамический диапазон представителей для горизонтальной оси, и динамический диапазон продаж для вертикальной оси. Далее, вам потребуется создать два имени. На рис. 13.35 показано создание одного из них – для продаж. По аналогии создайте имя для представителей.

Рис. 13.34. Создание формулы на основе динамического диапазона

Рис. 13.34. Создание формулы на основе динамического диапазона

Рис. 13.35. Присвоение имени формуле динамического диапазона продаж

Рис. 13.35. Присвоение имени формуле динамического диапазона продаж

Создайте диаграмму на основе значений в ячейках В1:С6 (рис. 13.36).

Рис. 13.36. Диаграмма на основе значений в ячейках В1_С6

Рис. 13.36. Диаграмма на основе значений в ячейках В1:С6

Далее, вам нужно заменить диапазоны ячеек диаграммы на имена динамических диапазонов. Чтобы сделать это, щелкните правой кнопкой мыши на диаграмме, и кликните в контекстном меню на Выбрать данные, или перейдите на вкладку Работа с диаграммамиКонструктор и кликните на кнопке Выбрать данные. Далее, выделите ряд Продажи в левой части окна и щелкните на кнопку Изменить (рис. 13.37).

Рис. 13.37. Выберите ряд Продажи и кликните на кнопку Изменить

Рис. 13.37. Выберите ряд Продажи и кликните на кнопку Изменить

В открывшемся окне Изменение ряда выделите только диапазон ячеек в области Значения. Не выделяйте ссылку на лист (рис. 13.38). Удалите выделенные ячейки, и введите имя диапазона (рис. 13.39). Убедитесь, что вы не удалили восклицательный знак. Нажмите Оk.

Рис. 13.38. Выделите только диапазон ячеек в ряду Значения, не трогая название листа

Рис. 13.38. Выделите только диапазон ячеек в области Значения, не трогая название листа

Рис. 13.39. После удаления ссылки на ячейки введите имя диапазона

Рис. 13.39. После удаления ссылки на ячейки введите имя диапазона

Аналогичным образом введите имя Представители вместо ссылки на ячейки (рис. 13.40). Кликните на кнопку Изменить в правой части окна Выбор исчтоника данных (а); в открывшемся окне Подписи оси (б) выделите только диапазон ячеек. Не выделяйте ссылку на лист. Удалите ссылку на ячейки и введите имя диапазона Представители (в). Убедитесь, что вы не удалили восклицательный знак. Нажмите Оk.

Рис. 13.40. Кликните на кнопку Изменить в правой части окна Выбор исчтоника данных

Рис. 13.40. Введите имя Представители вместо ссылки на ячейки

Как показано на рис. 13.41, вы можете проверить как диаграмма отреагирует на изменение города в ячейке F1.

Рис. 13.41. Выбрав в ячейке F1 Сиэтл (а) или Сан-Франциско (б), диаграмма отобразит только соответствующих городу представителей

Рис. 13.41. Выбрав в ячейке F1 Сиэтл (а) или Сан-Франциско (б), диаграмма отобразит продажи только соответствующих городу представителей

Создание динамической диаграммы с помощью сводной таблицы:

  1. Создайте сводную таблицу (рис. 13.43).
  2. Вставьте срез (в Excel 2013 вкладка Работа со сводными таблицамиАнализ → область Фильтры → кнопка Вставить срез).
  3. Виберите город в срезе и нажмите Alt+F1; создастся диаграмма по умолчанию; отформатируйте ее.

Рис. 13.43. Фильтр среза сводной таблицы позволяет создать динамическую диаграмму

Рис. 13.43. Фильтр среза сводной таблицы позволяет создать динамическую диаграмму

В следующем примере динамический диапазон позволяет получать пять последних чисел столбца (рис. 13.44). Создайте динамический диапазон на основе функций ИНДЕКС и ПОИСКПОЗ. Формула [1] находит адрес последней ячейке в столбце, а адрес первой просто на 4 строки меньше. При этом формула [1] включит в суммирование ячейку А6 (пустую), как одну их пяти последних. Если вы этого не хотите, воспользуйтесь формулой [2].

Рис. 13.44. Формула суммирующая пять последних значение в столбце

Рис. 13.44. Формула суммирующая пять последних значение в столбце

Формула [2] для ввода требует Ctrl+Shift+Enter (помните козырное правило функции ЕСЛИ?). Для создания формулы, которая бы не требовала нажатия Ctrl+Shift+Enter, сохраните фрагмент с ЕСЛИ под определенным именем, а затем подставляйте это имя в большие формулы. Например, сохраните целиком аргумент функции [2] СУММ под именем ПоследниеПять (рис. 13.45). Теперь формула не потребует нажатия Ctrl+Shift+Enter.

Рис. 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. Использование динамического диапазона

Рис. 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] Мне встретился и более широкий список.

[2] Я использовал функцию СМЕЩ, когда автоматизировал обновление сводной таблицы.

[3] Извините, но я не смог понять, чтобы это значило…

[4] Надо заметить, что современные шрифты на основе шестнадцатеричного Юникода обладают существенно большим набором символов, так что греческая Омега уже не является символом с самым большим кодом.

[5] Любопытно, что в оригинальном (английском) тексте использовался другой символ в качестве «большого текста» – ПОИСКПОЗ("Ω";$A$3:A9); в нашем случае эта функция возвращала ошибку, так как код любого русского символа больше кода греческой буквы Омега.

6 комментариев для “Глава 13. Динамические диапазоны на основе функций ИНДЕКС и СМЕЩ”

  1. Добрый вечер! Подскажите как лучше реализовать функцию Индекс. Пример на листе 1 по вертикале наименование филиалов… Москва, Ярославль и тд, на др листе содержатся данные диапазона: по горизонтали наименование филиалов и цифры.(Москва 1,2,3; Ярославль 1,2,3; Не получается через индекс в лист 1 перенести данные из листа 2.

  2. Егор, если я правильно понял, у вас две проблемы. Во-первых, названия не совпадают. На первом листе «Москва», на втором «Москва 1,2,3». Воспользуйтесь функцией ЛЕВСИМВ, чтобы выделить в них общую часть, которая и станет ключом. Во-вторых, на одном листе вертикальный массив, на втором — горизонтальный. Попробуйте функцию ТРАНСП.

  3. добрый день,
    почему-то нет гиперссылки на главу
    №14 «Правила эффективного применения формул массива»…

  4. Андрей, глава 14 «Правила эффективного применения формул массива» повторяет все правила, сформулированные в первых тринадцати главах.
    Я эти правила привожу в тексте перевода, не акцентируя внимания на том, что это правила.
    На мой взгляд, в русскоязычной традиции такие повторения не используются. Это, скорее, американская традиция, в которой принято разжевывать более тщательно))

  5. Добрый день
    Я возможно не конца понял тему, но я не могу понять как реализовать свою задачу. Имеется постоянно ежечасно и чаще, пополняющаяся Заявками таблица на одном листе. Кол-во строк в одной заявке за один раз, всегда произвольное от 1 до 10-50 (назовем это заявкой). У каждой заявки присутствует нарастающий порядковый номер и тип, отображается в разных столбцах построчно. Типов не ограниченное кол-во но пока не более 5. По каждой заявке, правее в фиксированных столбцах в нулевой строке каждой заявки заносится наименования исполнителей и ниже по каждой строке заявки заносится предложение исполнителя по каждой строке заявки (цифры). Исполнители всегда разные и в нулевой строке заявки записываются наименования исполнителей. Т.о. формируются данные за период. Предположим за день мы имеем 10 заявок от 1 до 30 строк каждая. В каждой заявке расставляются исполнители и ниже их цифры по каждой конкретной строке заявки. Настроен построчный анализ и вынесен в самую правую часть всей таблицы. Я с помощью Функций Индекс сделал построчный вывод результатов анализа. Если коротко, при окончательном анализе по каждой строке выдаются предпочтительные предложения и наименования исполнителей по каждой строке. Постоянно приходиться по каждой заявке вручную переставлять номер строки в функции ИНДЕКС для привязке к нулевой строке каждой заявки. Я не понял как в динамическом диапазоне сделать динамическое начало диапазона. И все это реализовать на огромное кол-во строк вниз по всей таблице. В общем, требуемая задача в ручном режиме решена, но понимаю, что окончательная автоматизация решается с помощью динамического массива, или через поиск числа и текста, но все равно дальше требуется построение динамического массива. Таблицей для внесения данных и анализа пользуются несколько пользователей, квалификация низкая. Приходится всегда выбирать наиболее простые решения т.к. скорость работы сетей и машин ограничивает. Если Вам интересно, могу отправить табличку для более правильного понимания. Спасибо, что дочитали до окончания. Можно писать на почту sergei_p@ngs.ru

  6. Добрый день
    Представляете? Разобрался сам и сделал таки работу динамических массивов, в том числе в составе формулы ГПР, ВПР. Пришлось потратить непрерывно без перерывов на перекус и на чай 9 часов за компом. Спасибо за вашу статью.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *