Skip to content
В этом руководстве показано, как использовать ИНДЕКС и ПОИСКПОЗ в Excel и чем они лучше ВПР.
В нескольких недавних статьях мы приложили немало усилий, чтобы объяснить основы функции ВПР новичкам и предоставить более сложные примеры формул ВПР опытным пользователям. А теперь я постараюсь если не отговорить вас от использования ВПР, то хотя бы показать вам альтернативный способ поиска нужных значений в Excel.
- Краткий обзор функций ИНДЕКС и ПОИСКПОЗ
- Как использовать формулу ИНДЕКС ПОИСКПОЗ
- ИНДЕКС+ПОИСКПОЗ вместо ВПР?
- Поиск справа налево
- Двусторонний поиск в строках и столбцах
- ИНДЕКС ПОИСКПОЗ для поиска по нескольким условиям
- Как найти среднее, максимальное и минимальное значение
- Что делать с ошибками поиска?
Для чего это нужно? Потому что функция ВПР имеет множество ограничений, которые могут помешать вам получить желаемый результат во многих ситуациях. С другой стороны, комбинация ПОИСКПОЗ ИНДЕКС более гибкая и имеет много замечательных возможностей, которые во многих отношениях превосходят ВПР.
Функции Excel ИНДЕКС и ПОИСКПОЗ — основы
Поскольку целью этого руководства является демонстрация альтернативного способа выполнения поиска в Excel с использованием комбинации функций ИНДЕКС и ПОИСКПОЗ, мы не будем подробно останавливаться на их синтаксисе и использовании. Тем более, что это подробно рассмотрено в других статьях, ссылки на которые вы можете найти в конце этого руководства. Мы рассмотрим лишь минимум, необходимый для понимания общей идеи, а затем подробно рассмотрим примеры формул, раскрывающие все преимущества использования ПОИСКПОЗ и ИНДЕКС вместо ВПР.
Функция ИНДЕКС
Функция ИНДЕКС (в английском варианте – INDEX) возвращает значение в массиве на основе указанных вами номеров строк и столбцов. Синтаксис функции ИНДЕКС прост:
ИНДЕКС(массив,номер_строки,[номер_столбца])
Вот простое объяснение каждого параметра:
- массив — это диапазон ячеек, именованный диапазон или таблица.
- номер_строки — это номер строки в массиве, из которого нужно вернуть значение. Если этот аргумент опущен, требуется следующий – номер_столбца.
- номер_столбца — это номер столбца, из которого нужно вернуть значение. Если он опущен, требуется номер_строки.
Дополнительные сведения см. в статье Функция ИНДЕКС в Excel .
А вот пример формулы ИНДЕКС в самом простом виде:
=ИНДЕКС(A1:C10;2;3)
Формула выполняет поиск в ячейках с A1 по C10 и возвращает значение ячейки во 2-й строке и 3-м столбце, т. е. в ячейке C2.
Очень легко, правда? Однако при работе с реальными данными вы вряд ли когда-нибудь будете заранее знать, какие строки и столбцы вам нужны. Здесь вам пригодится ПОИСКПОЗ.
Функция ПОИСКПОЗ
Она ищет нужное значение в диапазоне ячеек и возвращает относительное положение этого значения в диапазоне.
Синтаксис функции ПОИСКПОЗ следующий:
ПОИСКПОЗ(искомое_значение, искомый_массив, [тип_совпадения])
- искомое_значение — числовое или текстовое значение, которое вы ищете.
- диапазон_поиска — диапазон ячеек, в которых будем искать.
- тип_совпадения — указывает, следует ли искать точное соответствие или наиболее близкое совпадение:
- 1 или опущено — находит наибольшее значение, которое меньше или равно искомому значению. Требуется сортировка массива поиска в порядке возрастания.
- 0 — находит первое значение, точно равное искомому значению. В комбинации ИНДЕКС/ПОИСКПОЗ вам почти всегда нужно точное совпадение, поэтому вы чаще всего устанавливаете третий аргумент вашей функции в 0.
- -1 — находит наименьшее значение, которое больше или равно искомому значению. Требуется сортировка массива поиска в порядке убывания.
Например, если диапазон B1:B3 содержит значения «яблоки», «апельсины», «лимоны», приведенная ниже формула возвращает число 3, поскольку «лимоны» — это третья по счету запись в этом диапазоне:
=ПОИСКПОЗ(«лимоны»;B1:B3;0)
Дополнительные сведения см . в статье Функция ПОИСКПОЗ в Excel .
На первый взгляд полезность функции ПОИСКПОЗ может показаться сомнительной. Кого волнует положение значения в диапазоне? Что мы действительно хотим определить, так это само значение.
Однако, относительная позиция искомого значения (т. е. номера строки и столбца, в которых оно находится) — это именно то, что нам нужно указать для аргументов номер_строки и номер_столбца функции ИНДЕКС. Как вы помните, ИНДЕКС может найти значение на пересечении заданной строки и столбца, но сама не может определить, какую именно строку и столбец ей нужно выбрать.
Вот поэтому совместное использование ИНДЕКС и ПОИСКПОЗ открывает перед нами массу возможностей для поиска в Excel.
Как использовать формулу ИНДЕКС ПОИСКПОЗ в Excel
Теперь, когда вы знаете основы, я считаю, что вы уже начали понимать, как ПОИСКПОЗ и ИНДЕКС работают вместе. Короче говоря, ИНДЕКС извлекает нужное значение по номерам столбцов и строк, а ПОИСКПОЗ предоставляет ей эти номера. Вот и все!
Для вертикального поиска вы используете функцию ПОИСКПОЗ только для определения номера строки, указывая диапазон столбцов непосредственно в самой формуле:
ИНДЕКС ( столбец для возврата значения ; ПОИСКПОЗ ( искомое значение ; столбец для поиска ; 0))
Все еще не совсем понимаете эту логику? Возможно, будет проще разобрать на примере. Предположим, у вас есть список национальных столиц и их население:
Чтобы найти население определенной столицы, скажем, Индии, используйте следующую формулу ПОИСКПОЗ ИНДЕКС:
=ИНДЕКС(C2:C10; ПОИСКПОЗ(“Индия”;A2:A10;0))
Теперь давайте проанализируем, что на самом деле делает каждый компонент этой формулы:
- Функция ПОИСКПОЗ ищет искомое значение «Индия» в диапазоне A2:A10 и возвращает число 2, поскольку это слово занимает второе место в массиве поиска.
- Этот номер поступает непосредственно в аргумент номер_строки функции ИНДЕКС, предписывая вернуть значение из этой строки.
Таким образом, приведенная выше формула превращается в ИНДЕКС(C2:C10;2), которая означает, что нужно искать в ячейках от C2 до C10 и извлекать значение из второй ячейки в этом диапазоне, то есть из C3, потому что мы начинаем отсчет со второй строки.
Но указывать название города в формуле не совсем правильно, так как для каждого нового поиска придется корректировать эту формулу. Введите его в какую-нибудь отдельную ячейку, скажем, F1, укажите ссылку на ячейку для ПОИСКПОЗ, и вы получите формулу динамического поиска:
=ИНДЕКС(C2:C10;ПОИСКПОЗ(F1;A2:A10;0))
Важное замечание! Количество строк в аргументе массив функции ИНДЕКС должно совпадать с количеством строк в аргументе просматриваемый_массив в ПОИСКПОЗ, иначе формула выдаст неверный результат.
Вы спросите: «А почему бы нам просто не использовать обычную формулу ВПР? Какой смысл тратить время на то, чтобы разобраться в хитросплетениях ИНДЕКС ПОИСКПОЗ в Excel?»
Вот как это будет выглядеть:
=ВПР(F1; A2:C10; 3; 0)
Конечно, так проще. Но этот наш элементарный пример предназначен только для демонстрационных целей, чтобы вы поняли, как именно функции ИНДЕКС и ПОИСКПОЗ работают вместе. Действительно, ВПР была бы здесь более уместна. Другие примеры, которые вы найдёте ниже, покажут вам реальную силу этой комбинации, которая легко справляется со многими сложными задачами, когда ВПР будет бессильна.
ИНДЕКС+ПОИСКПОЗ вместо ВПР?
Решая, какую функцию использовать для вертикального поиска, большинство знатоков Excel сходятся во мнении, что ПОИСКПОЗ+ИНДЕКС намного лучше, чем ВПР. Однако многие до сих пор остаются с ВПР, во-первых, потому что это проще, а, во-вторых, потому что они не до конца понимают все преимущества использования формулы ПОИСКПОЗ ИНДЕКС в Excel. Без такого понимания никто не захочет тратить свое время на изучение более сложного синтаксиса.
Ниже я укажу на ключевые преимущества ИНДЕКС ПОИСКПОЗ перед ВПР, а уж вам решать, является ли это достойным дополнением к вашему арсеналу знаний в Excel.
4 основные причины использовать ИНДЕКС ПОИСКПОЗ вместо ВПР
- Поиск справа налево. Как известно любому образованному пользователю, ВПР не может искать влево. Это означает, что искомое значение всегда должно находиться в крайнем левом столбце таблицы. А извлекать нужное значение мы будем из столбца, который находится правее. ИНДЕКС+ПОИСКПОЗ может легко выполнять поиск влево! Здесь это показано в действии: Как выполнить поиск значения слева в Excel .
- Можно безопасно вставлять или удалять столбцы. Формулы ВПР не работают или выдают неверные результаты, когда новый столбец удаляется из таблицы поиска или добавляется в нее, поскольку синтаксис ВПР требует указания порядкового номера столбца, из которого вы хотите извлечь данные. Естественно, когда вы добавляете или удаляете столбцы, этот номер в формуле автоматически не меняется, а нужный столбец уже оказывается на новом месте.
С функциями ИНДЕКС и ПОИСКПОЗ вы указываете диапазон возвращаемых столбцов, а не номер одного из них. В результате вы можете вставлять и удалять столько столбцов, сколько хотите, не беспокоясь об обновлении каждой связанной с ними формулы.
- Нет ограничений на размер искомого значения. При использовании функции ВПР общая длина ваших критериев поиска не может превышать 255 символов, иначе вы получите ошибку #ЗНАЧ!. Таким образом, если ваш набор данных содержит длинные строки, ИНДЕКС ПОИСКПОЗ — единственное работающее решение.
- Более высокая скорость обработки. Если ваши таблицы относительно небольшие, вряд ли будет какая-то существенная разница в производительности Excel. Но если ваши рабочие листы содержат сотни или тысячи строк и, следовательно, сотни или тысячи формул, ИНДЕКС ПОИСКПОЗ будет работать намного быстрее, чем ВПР. Причина в том, что Excel будет обрабатывать только столбцы поиска и возврата, а не весь массив таблицы.
Влияние ВПР на производительность Excel может быть особенно заметным, если ваша книга содержит сложные формулы массива. Чем больше значений содержит ваш массив и чем больше формул массива содержится в книге, тем медленнее работает Excel.
ИНДЕКС ПОИСКПОЗ в Excel – примеры формул
Уяснив, почему все же стоит изучать ИНДЕКС ПОИСКПОЗ, давайте перейдем к самому интересному и посмотрим, как можно применить теоретические знания на практике.
Формула для поиска справа налево
Как уже упоминалось, ВПР не может получать значения слева от столбца поиска. Таким образом, если ваши значения поиска не находятся в самом левом столбце, нет никаких шансов, что формула ВПР принесет вам желаемый результат. Функция ПОИСКПОЗ ИНДЕКС в Excel более универсальна и не имеет особого значения, где расположены столбцы поиска и возврата.
Для этого примера мы добавим столбец «Ранг» слева от нашей основной таблицы и попытаемся выяснить, какое место занимает столица России по численности населения среди других перечисленных столиц.
Записав искомое значение в G1, используйте следующую формулу для поиска в C2:C10 и возврата соответствующего значения из A2:A10:
=ИНДЕКС(A2:A10; ПОИСКПОЗ(G1;C2:C10;0))
Совет. Если вы планируете использовать формулу ПОИСКПОЗ ИНДЕКС более чем для одной ячейки, обязательно зафиксируйте оба диапазона абсолютными ссылками (например, $A$2:$A$10 и $C$2:$C$10), чтобы они не изменялись при копировании формулы.
Двусторонний поиск в строках и столбцах
В приведенных выше примерах мы использовали ИНДЕКС ПОИСКПОЗ вместо классической функции ВПР, чтобы вернуть значение из точно указанного столбца. Но что, если вам нужно искать в нескольких строках и столбцах? То есть, сначала нужно найти подходящий столбец, а уж потом извлечь из него значение? Другими словами, что, если вы хотите выполнить так называемый матричный или двусторонний поиск?
Это может показаться сложным, но формула очень похожа на базовую функцию ПОИСКПОЗ ИНДЕКС в Excel, но с одним отличием.
Просто используйте две функции ПОИСКПОЗ, вложенных друг в друга: одну – для получения номера строки, а другую – для получения номера столбца.
ИНДЕКС(массив; ПОИСКПОЗ(значение_поиска1 ; столбец_поиска ; 0); ПОИСКПОЗ(значение_поиска2 ; столбец_поиска ; 0))
А теперь, пожалуйста, взгляните на приведенную ниже таблицу и давайте составим формулу двумерного поиска, чтобы найти население (в миллионах) в данной стране за данный год.
С целевой страной в G1 (значение_поиска1) и целевым годом в G2 (значение_поиска2) формула принимает следующий вид:
=ИНДЕКС(B2:D11; ПОИСКПОЗ(G1;A2:A11;0); ПОИСКПОЗ(G2;B1:D1;0))
Как работает эта формула?
Всякий раз, когда вам нужно понять сложную формулу Excel, разделите ее на более мелкие части и посмотрите, что делает каждая отдельная функция:
ПОИСКПОЗ(G1;A2:A11;0); – ищет в A2:A11 значение из ячейки G1 («США») и возвращает его позицию, которая равна 3.
ПОИСКПОЗ(G2;B1:D1;0) – просматривает диапазон B1:D1, чтобы получить позицию значения из ячейки G2 («2015»), которая равна 3.
Найденные выше номера строк и столбцов становятся соответствующими аргументами функции ИНДЕКС:
ИНДЕКС(B2:D11, 3, 3)
В результате вы получите значение на пересечении 3-й строки и 3-го столбца в диапазоне B2:D11, то есть из D4. Несложно?
ИНДЕКС ПОИСКПОЗ для поиска по нескольким условиям
Если у вас была возможность прочитать наши материалы по ВПР в Excel, вы, вероятно, уже протестировали формулу для ВПР с несколькими условиями . Однако существенным недостатком этого подхода является необходимость добавления вспомогательного столбца. Хорошей новостью является то, что функция ПОИСКПОЗ ИНДЕКС в Excel также может выполнять поиск по нескольким условиям без изменения или реструктуризации исходных данных!
Вот общая формула ИНДЕКС ПОИСКПОЗ с несколькими критериями:
{=ИНДЕКС( диапазон_возврата; ПОИСКПОЗ (1; ( критерий1 = диапазон1 ) * ( критерий2 = диапазон2 ); 0))}
Примечание. Это формула массива , которую необходимо вводить с помощью сочетания клавиш Ctrl + Shift + Enter
.
Предположим, что в таблице ниже вы хотите найти значение на основе двух критериев: Покупатель и Товар.
Следующая формула ИНДЕКС ПОИСКПОЗ отлично работает:
=ИНДЕКС(C2:C10; ПОИСКПОЗ(1; (F1=A2:A10) * (F2=B2:B10); 0))
Где C2:C10 — это диапазон, из которого возвращается значение, F1 — это критерий1, A2:A10 — это диапазон для сравнения с критерием 1, F2 — это критерий 2, а B2:B10 — это диапазон для сравнения с критерием 2.
Не забудьте правильно ввести формулу, нажав Ctrl + Shift + Enter, и Excel автоматически заключит ее в фигурные скобки, как показано на скриншоте ниже:
Рис5
Если вы не хотите использовать формулы массива, добавьте в формулу в F4 еще одну функцию ИНДЕКС и завершите ее ввод обычным нажатием Enter:
=ИНДЕКС(C2:C10; ПОИСКПОЗ(1; ИНДЕКС((F1=A2:A10) * (F2=B2:B10); 0; 1); 0))
Разберем пошагово, как это работает.
Здесь используется тот же подход, что и в обычном сочетании ИНДЕКС ПОИСКПОЗ, где просматривается один столбец. Чтобы оценить несколько критериев, вы создаете два или более массива значений ИСТИНА и ЛОЖЬ, которые представляют совпадения и несовпадения для каждого отдельного критерия, а затем перемножаете соответствующие элементы этих массивов. Операция умножения преобразует ИСТИНА и ЛОЖЬ в 1 и 0 соответственно и создает массив, в котором единицы соответствуют строкам, которые удовлетворяют всем условиям. Функция ПОИСКПОЗ со значением поиска 1 находит первую «1» в массиве и передает ее позицию в ИНДЕКС, которая возвращает значение в этой позиции из указанного столбца.
Вторая формула без массива основана на способности функции ИНДЕКС работать с массивами. Второй вложенный ИНДЕКС имеет 0 в номер_строки , так что он будет передавать весь массив столбцов в ПОИСКПОЗ.
Среднее, максимальное и минимальное значение при помощи ИНДЕКС ПОИСКПОЗ
Microsoft Excel имеет специальные функции для поиска минимального, максимального и среднего значения в диапазоне. Но что, если вам нужно получить значение из другой ячейки, связанной с этими значениями? Например, получить название города с максимальным населением или узнать товар с минимальными продажами? В этом случае используйте функцию МАКС , МИН или СРЗНАЧ вместе с ИНДЕКС ПОИСКПОЗ.
Максимальное значение.
Предположим, нам нужно в списке городов найти столицу с самым большим населением. Чтобы найти наибольшее значение в столбце С и вернуть соответствующее ему значение из столбца В, находящееся в той же строке, используйте эту формулу:
=ИНДЕКС(B2:B10; ПОИСКПОЗ(МАКС(C2:C10); C2:C10; 0))
Скриншот с примером находится чуть ниже.
Минимальное значение
Теперь найдём город с самым маленьким населением в списке. Чтобы найти наименьшее число в столбце С и получить соответствующее ему значение из столбца В:
=ИНДЕКС(B2:B10; ПОИСКПОЗ(МИН(C2:C10); C2:C10; 0))
Ближайшее к среднему
Теперь мы находим город, население которого наиболее близко к среднему значению. Чтобы вычислить позицию, наиболее близкую к среднему значению показателя, рассчитанному из D2:D10, и получить соответствующее значение из столбца C, используйте следующую формулу:
=ИНДЕКС(B2:B10; ПОИСКПОЗ(СРЗНАЧ(C2:C10); C2:C10; -1 ))
В зависимости от того, как организованы ваши данные, укажите 1 или -1 для третьего аргумента (тип_совпадения) функции ПОИСКПОЗ:
- Если ваш столбец поиска (столбец D в нашем случае) отсортирован по возрастанию , поставьте 1. Формула вычислит наибольшее значение, которое меньше или равно среднему значению.
- Если ваш столбец поиска отсортирован по убыванию , введите -1. Формула вычислит наименьшее значение, которое больше или равно среднему значению.
- Если ваш массив поиска содержит значение , точно равное среднему, вы можете ввести 0 для точного совпадения. Никакой сортировки не требуется.
В нашем примере данные в столбце D отсортированы в порядке убывания, поэтому мы используем -1 для типа соответствия. В результате мы получаем «Токио», так как его население (13 189 000) является ближайшим, превышающим среднее значение (12 269 006).
Что делать с ошибками поиска?
Как вы, наверное, заметили, если формула ИНДЕКС ПОИСКПОЗ в Excel не может найти искомое значение, она выдает ошибку #Н/Д. Если вы хотите заменить это стандартное сообщение чем-то более информативным, оберните формулу ПОИСКПОЗ ИНДЕКС в функцию ЕСНД . Например:
=ЕСНД(ИНДЕКС(C2:C10; ПОИСКПОЗ(F1;A2:A10;0)); «Не найдено»)
И теперь, если кто-то вводит значение, которое не существует в диапазоне поиска, формула явно сообщит пользователю, что совпадений не найдено:
Если вы хотите перехватывать все ошибки, а не только #Н/Д, используйте функцию ЕСЛИОШИБКА вместо ЕСНД:
=ЕСЛИОШИБКА(ИНДЕКС(C2:C10; ПОИСКПОЗ(F1;A2:A10;0)); «Что-то пошло не так!»)
Пожалуйста, имейте в виду, что во многих ситуациях было бы не совсем правильно скрывать все такие ошибки, потому что они предупреждают вас о возможных проблемах в вашей формуле.
Итак, еще раз об основных преимуществах формулы ИНДЕКС ПОИСКПОЗ.
-
Возможен ли «левый» поиск?
-
Повлияет ли на результат вставка и удаление столбцов?
Вы можете вставлять и удалять столько столбцов, сколько хотите. На результат ИНДЕКС ПОИСКПОЗ это не повлияет.
-
Возможен ли поиск по строкам и столбцам?
Можно сначала найти подходящий столбец, а уж потом извлечь из него значение. Общий вид формулы:
ИНДЕКС(массив; ПОИСКПОЗ(значение_поиска1 ; столбец_поиска ; 0); ПОИСКПОЗ(значение_поиска2 ; столбец_поиска ; 0))
Подробную инструкцию смотрите здесь. -
Как сделать поиск ИНДЕКС ПОИСКПОЗ по нескольким условиям?
Можно выполнять поиск по двум или более условиям без добавления дополнительных столбцов. Вот формула массива, которая решит проблему:
{=ИНДЕКС( диапазон_возврата; ПОИСКПОЗ (1; ( критерий1 = диапазон1 ) * ( критерий2 = диапазон2 ); 0))}
Вот как можно использовать ИНДЕКС и ПОИСКПОЗ в Excel. Я надеюсь, что наши примеры формул окажутся полезными для вас.
Вот еще несколько статей по этой теме:
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Еще…Меньше
Windows: 2208 (сборка 15601)
Mac: 16.65 (сборка 220911)
Веб: представлено 15 сентября 2022
г.
iOS: 2.65 (сборка 220905)
Android: 16.0.15629
Возвращает указанные столбцы из массива.
Синтаксис
=ВЫБОРСТОЛБЦ(массив; номер_столбца1; [номер_столбца2];…)
Аргументы функции ВЫБОРСТОЛБЦ описаны ниже.
-
массив Массив, содержащий столбцы, которые должны быть возвращены в новом массиве. Обязательный.
-
номер_столбца1 Первый возвращаемый столбец. Обязательный.
-
номер_столбца2 Дополнительные столбцы, которые необходимо вернуть. Необязательный.
Ошибки
Excel возвращает ошибку #ЗНАЧ, если абсолютное значение любого из аргументов «номер_столбца» является нулем или превышает количество столбцов в массиве.
Примеры
Скопируйте данные примера из таблицы ниже и вставьте их в ячейку A1 нового листа Excel. При необходимости измените ширину столбцов, чтобы видеть все данные.
Возвращает массив столбцов 1, 3, 5 и снова 1 из массива в диапазоне A2:E7.
Данные |
|||||
1 |
2 |
3 |
4 |
5 |
|
6 |
7 |
8 |
9 |
10 |
|
11 |
12 |
13 |
14 |
15 |
|
16 |
17 |
18 |
19 |
20 |
|
21 |
22 |
23 |
24 |
25 |
|
26 |
27 |
28 |
29 |
30 |
|
Формулы |
|||||
=ВЫБОРСТОЛБЦ(A2:E7,1,3,5,1) |
Возвращает массив из двух последних столбцов из массива в диапазоне A2:D7 в следующем порядке: столбец три, а затем столбец четыре.
Данные |
|||
1 |
2 |
13 |
14 |
3 |
4 |
15 |
16 |
5 |
6 |
17 |
18 |
7 |
8 |
19 |
20 |
9 |
10 |
21 |
22 |
11 |
12 |
23 |
24 |
Формулы |
|||
=ВЫБОРСТОЛБЦ(A2:D7;3;4) |
Возвращает массив из двух последних столбцов из массива в диапазоне A2:D7 в следующем порядке: столбец четыре, а затем столбец три.
Данные |
|||
1 |
2 |
13 |
14 |
3 |
4 |
15 |
16 |
5 |
6 |
17 |
18 |
7 |
8 |
19 |
20 |
9 |
10 |
21 |
22 |
11 |
12 |
23 |
24 |
Формулы |
|||
=ВЫБОРСТОЛБЦ(A2:D7,-1,-2) |
См. также
Использование формул массива: рекомендации и примеры
Функция ВСТОЛБИК
Функция ГСТОЛБИК
Функция CHOOSEROWS
Нужна дополнительная помощь?
Поиск нужных данных в диапазоне
Как использовать функцию ВПР (VLOOKUP) для поиска и выборки нужных значений из списка мы недавно разбирали. Если вы еще с ней не знакомы — загляните сюда, не пожалейте пяти минут, чтобы сэкономить себе потом несколько часов.
Если же вы знакомы с ВПР, то — вдогон — стоит разобраться с похожими функциями: ИНДЕКС (INDEX) и ПОИСКПОЗ (MATCH), владение которыми весьма облегчит жизнь любому опытному пользователю Excel. Гляньте на следующий пример:
Необходимо определить регион поставки по артикулу товара, набранному в ячейку C16.
Задача решается при помощи двух функций:
=ИНДЕКС(A1:G13;ПОИСКПОЗ(C16;D1:D13;0);2)
Функция ПОИСКПОЗ ищет в столбце D1:D13 значение артикула из ячейки C16. Последний аргумент функции 0 — означает поиск точного (а не приблизительного) соответствия. Функция выдает порядковый номер найденного значения в диапазоне, т.е. фактически номер строки, где найден требуемыый артикул.
Функция ИНДЕКС выбирает из диапазона A1:G13 значение, находящееся на пересечении заданной строки (номер строки с артикулом выдает функция ПОИСКПОЗ) и столбца (нам нужен регион, т.е. второй столбец).
Ссылки по теме
- Использование функции ВПР (VLOOKUP) для поиска и подстановки значений.
- Улучшенная версия функции ВПР (VLOOKUP)
- Многоразовый ВПР
MS Excel columns have a pattern like A, B, C, …, Z, AA, AB, AC, …., AZ, BA, BB, … ZZ, AAA, AAB ….. etc. In other words, column 1 is named “A”, column 2 as “B”, and column 27 as “AA”.
Given a column number, find its corresponding Excel column name. The following are more examples.
Input Output 26 Z 51 AY 52 AZ 80 CB 676 YZ 702 ZZ 705 AAC
Thanks to Mrigank Dembla for suggesting the below solution in a comment.
Suppose we have a number n, let’s say 28. so corresponding to it we need to print the column name. We need to take the remainder with 26.
If the remainder with 26 comes out to be 0 (meaning 26, 52, and so on) then we put ‘Z’ in the output string and new n becomes n/26 -1 because here we are considering 26 to be ‘Z’ while in actuality it’s 25th with respect to ‘A’.
Similarly, if the remainder comes out to be non-zero. (like 1, 2, 3, and so on) then we need to just insert the char accordingly in the string and do n = n/26.
Finally, we reverse the string and print.
Example:
n = 700
The remainder (n%26) is 24. So we put ‘X’ in the output string and n becomes n/26 which is 26.
Remainder (26%26) is 0. So we put ‘Z’ in the output string and n becomes n/26 -1 which is 0.
Following is the implementation of the above approach.
C++
#include <bits/stdc++.h>
#define MAX 50
using
namespace
std;
void
printString(
int
n)
{
char
str[MAX];
int
i = 0;
while
(n > 0) {
int
rem = n % 26;
if
(rem == 0) {
str[i++] =
'Z'
;
n = (n / 26) - 1;
}
else
{
str[i++] = (rem - 1) +
'A'
;
n = n / 26;
}
}
str[i] =
''
;
reverse(str, str +
strlen
(str));
cout << str << endl;
return
;
}
int
main()
{
printString(26);
printString(51);
printString(52);
printString(80);
printString(676);
printString(702);
printString(705);
return
0;
}
Java
public
class
ExcelColumnTitle {
private
static
void
printString(
int
columnNumber)
{
StringBuilder columnName =
new
StringBuilder();
while
(columnNumber >
0
) {
int
rem = columnNumber %
26
;
if
(rem ==
0
) {
columnName.append(
"Z"
);
columnNumber = (columnNumber /
26
) -
1
;
}
else
{
columnName.append((
char
)((rem -
1
) +
'A'
));
columnNumber = columnNumber /
26
;
}
}
System.out.println(columnName.reverse());
}
public
static
void
main(String[] args)
{
printString(
26
);
printString(
51
);
printString(
52
);
printString(
80
);
printString(
676
);
printString(
702
);
printString(
705
);
}
}
Python
MAX
=
50
def
printString(n):
string
=
[
""
]
*
MAX
i
=
0
while
n >
0
:
rem
=
n
%
26
if
rem
=
=
0
:
string[i]
=
'Z'
i
+
=
1
n
=
(n
/
26
)
-
1
else
:
string[i]
=
chr
((rem
-
1
)
+
ord
(
'A'
))
i
+
=
1
n
=
n
/
26
string[i]
=
''
string
=
string[::
-
1
]
print
"".join(string)
printString(
26
)
printString(
51
)
printString(
52
)
printString(
80
)
printString(
676
)
printString(
702
)
printString(
705
)
C#
using
System;
class
GFG{
static
String reverse(String input)
{
char
[] reversedString = input.ToCharArray();
Array.Reverse(reversedString);
return
new
String(reversedString);
}
private
static
void
printString(
int
columnNumber)
{
String columnName =
""
;
while
(columnNumber > 0)
{
int
rem = columnNumber % 26;
if
(rem == 0)
{
columnName +=
"Z"
;
columnNumber = (columnNumber / 26) - 1;
}
else
{
columnName += (
char
)((rem - 1) +
'A'
);
columnNumber = columnNumber / 26;
}
}
columnName = reverse(columnName);
Console.WriteLine(columnName.ToString());
}
public
static
void
Main(String[] args)
{
printString(26);
printString(51);
printString(52);
printString(80);
printString(676);
printString(702);
printString(705);
}
}
Javascript
<script>
function
printString(columnNumber)
{
let columnName = [];
while
(columnNumber > 0) {
let rem = columnNumber % 26;
if
(rem == 0) {
columnName.push(
"Z"
);
columnNumber = Math.floor(columnNumber / 26) - 1;
}
else
{
columnName.push(String.fromCharCode((rem - 1) +
'A'
.charCodeAt(0)));
columnNumber = Math.floor(columnNumber / 26);
}
}
document.write(columnName.reverse().join(
""
)+
"<br>"
);
}
printString(26);
printString(51);
printString(52);
printString(80);
printString(676);
printString(702);
printString(705);
</script>
Output
Z AY AZ CB YZ ZZ AAC
Time Complexity: O(log26n), as we are using a loop and in each traversal, we decrement by floor division of 26.
Auxiliary Space: O(50), as we are using extra space for storing the result.
Method 2
The problem is similar to converting a decimal number to its binary representation but instead of a binary base system where we have two digits only 0 and 1, here we have 26 characters from A-Z.
So, we are dealing with base 26 instead of base binary.
That’s not where the fun ends, we don’t have zero in this number system, as A represents 1, B represents 2 and so on Z represents 26.
To make the problem easily understandable, we approach the problem in two steps:
- Convert the number to base 26 representation, considering we have 0 also in the system.
- Change the representation to the one without having 0 in its system.
HOW? Here is an example
Step 1:
Consider we have number 676, How to get its representation in the base 26 system? In the same way, we do for a binary system, Instead of division and remainder by 2, we do division and remainder by 26.
Base 26 representation of 676 is : 100
Step2
But Hey, we can’t have zero in our representation. Right? Because it’s not part of our number system. How do we get rid of zero? Well it’s simple, but before doing that let’s remind one simple math trick:
Subtraction: 5000 - 9, How do you subtract 9 from 0 ? You borrow from next significant bit, right.
- In a decimal number system to deal with zero, we borrow 10 and subtract 1 from the next significant.
- In the Base 26 Number System to deal with zero, we borrow 26 and subtract 1 from the next significant bit.
So Convert 10026 to a number system that does not have ‘0’, we get (25 26)26
Symbolic representation of the same is: YZ
Here is the implementation of the same:
C++
#include <iostream>
using
namespace
std;
void
printString(
int
n)
{
int
arr[10000];
int
i = 0;
while
(n) {
arr[i] = n % 26;
n = n / 26;
i++;
}
for
(
int
j = 0; j < i - 1; j++) {
if
(arr[j] <= 0) {
arr[j] += 26;
arr[j + 1] = arr[j + 1] - 1;
}
}
for
(
int
j = i; j >= 0; j--) {
if
(arr[j] > 0)
cout <<
char
(
'A'
+ arr[j] - 1);
}
cout << endl;
}
int
main()
{
printString(26);
printString(51);
printString(52);
printString(80);
printString(676);
printString(702);
printString(705);
return
0;
}
Java
import
java.util.*;
class
GFG{
static
void
printString(
int
n)
{
int
[]arr =
new
int
[
10000
];
int
i =
0
;
while
(n >
0
)
{
arr[i] = n %
26
;
n = n /
26
;
i++;
}
for
(
int
j =
0
; j < i -
1
; j++)
{
if
(arr[j] <=
0
)
{
arr[j] +=
26
;
arr[j +
1
] = arr[j +
1
] -
1
;
}
}
for
(
int
j = i; j >=
0
; j--)
{
if
(arr[j] >
0
)
System.out.print(
(
char
)(
'A'
+ arr[j] -
1
));
}
System.out.println();
}
public
static
void
main(String[] args)
{
printString(
26
);
printString(
51
);
printString(
52
);
printString(
80
);
printString(
676
);
printString(
702
);
printString(
705
);
}
}
Python3
def
printString(n):
arr
=
[
0
]
*
10000
i
=
0
while
(n >
0
):
arr[i]
=
n
%
26
n
=
int
(n
/
/
26
)
i
+
=
1
for
j
in
range
(
0
, i
-
1
):
if
(arr[j] <
=
0
):
arr[j]
+
=
26
arr[j
+
1
]
=
arr[j
+
1
]
-
1
for
j
in
range
(i,
-
1
,
-
1
):
if
(arr[j] >
0
):
print
(
chr
(
ord
(
'A'
)
+
(arr[j]
-
1
)), end
=
"");
print
();
if
__name__
=
=
'__main__'
:
printString(
26
);
printString(
51
);
printString(
52
);
printString(
80
);
printString(
676
);
printString(
702
);
printString(
705
);
C#
using
System;
class
GFG{
static
void
printString(
int
n)
{
int
[]arr =
new
int
[10000];
int
i = 0;
while
(n > 0)
{
arr[i] = n % 26;
n = n / 26;
i++;
}
for
(
int
j = 0; j < i - 1; j++)
{
if
(arr[j] <= 0)
{
arr[j] += 26;
arr[j + 1] = arr[j + 1] - 1;
}
}
for
(
int
j = i; j >= 0; j--)
{
if
(arr[j] > 0)
Console.Write((
char
)(
'A'
+
arr[j] - 1));
}
Console.WriteLine();
}
public
static
void
Main(String[] args)
{
printString(26);
printString(51);
printString(52);
printString(80);
printString(676);
printString(702);
printString(705);
}
}
Javascript
<script>
function
printString(n){
let arr = [];
let i = 0;
while
(n) {
arr[i] = n % 26;
n = Math.floor(n / 26);
i++;
}
for
(let j = 0; j < i - 1; j++) {
if
(arr[j] <= 0) {
arr[j] += 26;
arr[j + 1] = arr[j + 1] - 1;
}
}
let ans =
''
;
for
(let j = i; j >= 0; j--) {
if
(arr[j] > 0)
ans += String.fromCharCode(65 + arr[j] - 1);
}
document.write(ans +
"<br>"
);
}
printString(26);
printString(51);
printString(52);
printString(80);
printString(676);
printString(702);
printString(705);
</script>
Output
Z AY AZ CB YZ ZZ AAC
Time Complexity: O(log26n), as we are using a loop and in each traversal, we decrement by floor division of 26.
Auxiliary Space: O(10000), as we are using extra space for the array.
Method 3:
We can use a recursive function which definitely reduces the time and increase the efficiency:
Alphabets are in sequential order like: ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’. You have experienced while using excel when you see columns and rows numbering are done in Alphabetical ways.
Here’s How I purposefully think about the logic of how it is arranged.
(In Mathematical terms, [a , b ] means from ‘a’ to ‘b’).
[1,26] = [A,Z] (Understand by ‘1’ stands for ‘A’ and ’26” stands for “Z”). For [27,52] ,it will be like [AA,AZ], For [57,78] it will be [BA,BZ]
Logic is to append an Alphabet sequentially whenever it ends up numbering at 26.
For example, if the number is ’27’ which is greater than ’26’, then we simply need to divide by 26, and we get the remainder as 1, We see “1” as “A” and can be recursively done.
we will be using python for this.
Algorithm is:
1. Take an array and Sort the letters from A to Z . (You can also use the import string and string function to get “A to Z” in uppercase.)
2. If the number is less than or equal to ’26’, simply get the letter from the array and print it.
3. If it is greater than 26, use the Quotient Remainder rule, if the remainder is zero, there are 2 possible ways, if the quotient is “1”, simply hash out the letter from the index [r-1]( ‘r’ is remainder), else call out the function from the num =(q-1) and append at the front to the letter indexing [r-1].
4. If the remainder is not equal to “0”, call the function for the num = (q) and append at the front to the letter indexing [r-1].
The code concerned with this is:
C++
#include<bits/stdc++.h>
using
namespace
std;
string alpha =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
;
string num_hash(
int
num){
if
(num < 26){
string res =
""
;
res += alpha[num-1];
return
res;
}
else
{
int
q = (num / 26);
int
r = num % 26;
string res =
""
;
if
(r == 0){
if
(q == 1){
res.append(1,alpha[(26 + r-1)%26]);
}
else
{
res = num_hash(q-1);
res.append(1,alpha[(26 + r-1)%26]);
}
}
else
{
res = num_hash(q);
res.append(1,alpha[(26 + r-1)%26]);
}
return
res;
}
}
int
main () {
cout<< num_hash(26) << endl;
cout<< num_hash(51) << endl;
cout<< num_hash(52) << endl;
cout<< num_hash(80) << endl;
cout<< num_hash(676) << endl;
cout<< num_hash(702) << endl;
cout<< num_hash(705) << endl;
return
0;
}
Java
import
java.io.*;
class
GFG
{
static
String alpha =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
;
static
String num_hash(
int
num){
if
(num <
26
)
return
Character.toString(alpha.charAt(num-
1
));
else
{
int
q = Math.floorDiv(num,
26
);
int
r = num %
26
;
if
(r ==
0
){
if
(q ==
1
){
return
Character.toString(alpha.charAt((
26
+ r-
1
)%
26
));
}
else
return
num_hash(q-
1
) + alpha.charAt((
26
+ r-
1
)%
26
);
}
else
return
num_hash(q) + alpha.charAt((
26
+ r-
1
)%
26
);
}
}
public
static
void
main (String[] args) {
System.out.println(num_hash(
26
));
System.out.println(num_hash(
51
));
System.out.println(num_hash(
52
));
System.out.println(num_hash(
80
));
System.out.println(num_hash(
676
));
System.out.println(num_hash(
702
));
System.out.println(num_hash(
705
));
}
}
Python3
alpha
=
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def
num_hash(num):
if
num <
26
:
return
alpha[num
-
1
]
else
:
q, r
=
num
/
/
26
, num
%
26
if
r
=
=
0
:
if
q
=
=
1
:
return
alpha[r
-
1
]
else
:
return
num_hash(q
-
1
)
+
alpha[r
-
1
]
else
:
return
num_hash(q)
+
alpha[r
-
1
]
print
(num_hash(
26
))
print
(num_hash(
51
))
print
(num_hash(
52
))
print
(num_hash(
80
))
print
(num_hash(
676
))
print
(num_hash(
702
))
print
(num_hash(
705
))
C#
using
System;
class
GFG
{
static
string
alpha =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
;
static
string
num_hash(
int
num){
if
(num < 26)
return
Char.ToString(alpha[num-1]);
else
{
int
q = num/26;
int
r = num % 26;
if
(r == 0){
if
(q == 1){
return
Char.ToString(alpha[(26 + r-1)%26]);
}
else
return
num_hash(q-1) + alpha[(26 + r-1)%26];
}
else
return
num_hash(q) + alpha[(26 + r-1)%26];
}
}
public
static
void
Main(String[] args) {
Console.WriteLine(num_hash(26));
Console.WriteLine(num_hash(51));
Console.WriteLine(num_hash(52));
Console.WriteLine(num_hash(80));
Console.WriteLine(num_hash(676));
Console.WriteLine(num_hash(702));
Console.WriteLine(num_hash(705));
}
}
Javascript
<script>
let alpha =
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
function
num_hash(num)
{
if
(num < 26)
return
alpha[num-1]
else
{
let q = Math.floor(num/26),r = num % 26
if
(r == 0){
if
(q == 1)
return
alpha[(26 + r-1)]
else
return
num_hash(q-1) + alpha[(26 + r-1)]
}
else
return
num_hash(q) + alpha[r-1]
}
}
document.write(num_hash(26),
"</br>"
)
document.write(num_hash(51),
"</br>"
)
document.write(num_hash(52),
"</br>"
)
document.write(num_hash(80),
"</br>"
)
document.write(num_hash(676),
"</br>"
)
document.write(num_hash(702),
"</br>"
)
document.write(num_hash(705),
"</br>"
)
</script>
Output
Z AY AZ CB YZ ZZ AAC
Time Complexity: O(log26n), as we are using recursion and in each recursive call, we decrement by floor division of 26.
Auxiliary Space: O(1), as we are not using any extra space.
Related Article :
Find the Excel column number from the column title
This article is contributed by Kartik. Please write comments if you find anything incorrect, or if you want to share more information about the topic discussed above.
Этот учебник рассказывает о главных преимуществах функций ИНДЕКС и ПОИСКПОЗ в Excel, которые делают их более привлекательными по сравнению с ВПР. Вы увидите несколько примеров формул, которые помогут Вам легко справиться со многими сложными задачами, перед которыми функция ВПР бессильна.
В нескольких недавних статьях мы приложили все усилия, чтобы разъяснить начинающим пользователям основы функции ВПР и показать примеры более сложных формул для продвинутых пользователей. Теперь мы попытаемся, если не отговорить Вас от использования ВПР, то хотя бы показать альтернативные способы реализации вертикального поиска в Excel.
Зачем нам это? – спросите Вы. Да, потому что ВПР – это не единственная функция поиска в Excel, и её многочисленные ограничения могут помешать Вам получить желаемый результат во многих ситуациях. С другой стороны, функции ИНДЕКС и ПОИСКПОЗ – более гибкие и имеют ряд особенностей, которые делают их более привлекательными, по сравнению с ВПР.
- Базовая информация об ИНДЕКС и ПОИСКПОЗ
- Используем функции ИНДЕКС и ПОИСКПОЗ в Excel
- Преимущества ИНДЕКС и ПОИСКПОЗ перед ВПР
- ИНДЕКС и ПОИСКПОЗ – примеры формул
- Как находить значения, которые находятся слева
- Вычисления при помощи ИНДЕКС и ПОИСКПОЗ
- Поиск по известным строке и столбцу
- Поиск по нескольким критериям
- ИНДЕКС и ПОИСКПОЗ в сочетании с ЕСЛИОШИБКА
Содержание
- Базовая информация об ИНДЕКС и ПОИСКПОЗ
- ИНДЕКС – синтаксис и применение функции
- ПОИСКПОЗ – синтаксис и применение функции
- Как использовать ИНДЕКС и ПОИСКПОЗ в Excel
- Почему ИНДЕКС/ПОИСКПОЗ лучше, чем ВПР?
- 4 главных преимущества использования ПОИСКПОЗ/ИНДЕКС в Excel:
- ИНДЕКС и ПОИСКПОЗ – примеры формул
- Как выполнить поиск с левой стороны, используя ПОИСКПОЗ и ИНДЕКС
- Вычисления при помощи ИНДЕКС и ПОИСКПОЗ в Excel (СРЗНАЧ, МАКС, МИН)
- О чём нужно помнить, используя функцию СРЗНАЧ вместе с ИНДЕКС и ПОИСКПОЗ
- Как при помощи ИНДЕКС и ПОИСКПОЗ выполнять поиск по известным строке и столбцу
- Поиск по нескольким критериям с ИНДЕКС и ПОИСКПОЗ
- ИНДЕКС и ПОИСКПОЗ в сочетании с ЕСЛИОШИБКА в Excel
Базовая информация об ИНДЕКС и ПОИСКПОЗ
Так как задача этого учебника – показать возможности функций ИНДЕКС и ПОИСКПОЗ для реализации вертикального поиска в Excel, мы не будем задерживаться на их синтаксисе и применении.
Приведём здесь необходимый минимум для понимания сути, а затем разберём подробно примеры формул, которые показывают преимущества использования ИНДЕКС и ПОИСКПОЗ вместо ВПР.
ИНДЕКС – синтаксис и применение функции
Функция INDEX (ИНДЕКС) в Excel возвращает значение из массива по заданным номерам строки и столбца. Функция имеет вот такой синтаксис:
INDEX(array,row_num,[column_num])
ИНДЕКС(массив;номер_строки;[номер_столбца])
Каждый аргумент имеет очень простое объяснение:
- array (массив) – это диапазон ячеек, из которого необходимо извлечь значение.
- row_num (номер_строки) – это номер строки в массиве, из которой нужно извлечь значение. Если не указан, то обязательно требуется аргумент column_num (номер_столбца).
- column_num (номер_столбца) – это номер столбца в массиве, из которого нужно извлечь значение. Если не указан, то обязательно требуется аргумент row_num (номер_строки)
Если указаны оба аргумента, то функция ИНДЕКС возвращает значение из ячейки, находящейся на пересечении указанных строки и столбца.
Вот простейший пример функции INDEX (ИНДЕКС):
=INDEX(A1:C10,2,3)
=ИНДЕКС(A1:C10;2;3)
Формула выполняет поиск в диапазоне A1:C10 и возвращает значение ячейки во 2-й строке и 3-м столбце, то есть из ячейки C2.
Очень просто, правда? Однако, на практике Вы далеко не всегда знаете, какие строка и столбец Вам нужны, и поэтому требуется помощь функции ПОИСКПОЗ.
ПОИСКПОЗ – синтаксис и применение функции
Функция MATCH (ПОИСКПОЗ) в Excel ищет указанное значение в диапазоне ячеек и возвращает относительную позицию этого значения в диапазоне.
Например, если в диапазоне B1:B3 содержатся значения New-York, Paris, London, тогда следующая формула возвратит цифру 3, поскольку «London» – это третий элемент в списке.
=MATCH("London",B1:B3,0)
=ПОИСКПОЗ("London";B1:B3;0)
Функция MATCH (ПОИСКПОЗ) имеет вот такой синтаксис:
MATCH(lookup_value,lookup_array,[match_type])
ПОИСКПОЗ(искомое_значение;просматриваемый_массив;[тип_сопоставления])
- lookup_value (искомое_значение) – это число или текст, который Вы ищите. Аргумент может быть значением, в том числе логическим, или ссылкой на ячейку.
- lookup_array (просматриваемый_массив) – диапазон ячеек, в котором происходит поиск.
- match_type (тип_сопоставления) – этот аргумент сообщает функции ПОИСКПОЗ, хотите ли Вы найти точное или приблизительное совпадение:
- 1 или не указан – находит максимальное значение, меньшее или равное искомому. Просматриваемый массив должен быть упорядочен по возрастанию, то есть от меньшего к большему.
- 0 – находит первое значение, равное искомому. Для комбинации ИНДЕКС/ПОИСКПОЗ всегда нужно точное совпадение, поэтому третий аргумент функции ПОИСКПОЗ должен быть равен 0.
- -1 – находит наименьшее значение, большее или равное искомому значению. Просматриваемый массив должен быть упорядочен по убыванию, то есть от большего к меньшему.
На первый взгляд, польза от функции ПОИСКПОЗ вызывает сомнение. Кому нужно знать положение элемента в диапазоне? Мы хотим знать значение этого элемента!
Позвольте напомнить, что относительное положение искомого значения (т.е. номер строки и/или столбца) – это как раз то, что мы должны указать для аргументов row_num (номер_строки) и/или column_num (номер_столбца) функции INDEX (ИНДЕКС). Как Вы помните, функция ИНДЕКС может возвратить значение, находящееся на пересечении заданных строки и столбца, но она не может определить, какие именно строка и столбец нас интересуют.
Как использовать ИНДЕКС и ПОИСКПОЗ в Excel
Теперь, когда Вам известна базовая информация об этих двух функциях, полагаю, что уже становится понятно, как функции ПОИСКПОЗ и ИНДЕКС могут работать вместе. ПОИСКПОЗ определяет относительную позицию искомого значения в заданном диапазоне ячеек, а ИНДЕКС использует это число (или числа) и возвращает результат из соответствующей ячейки.
Ещё не совсем понятно? Представьте функции ИНДЕКС и ПОИСКПОЗ в таком виде:
=INDEX(столбец из которого извлекаем,(MATCH (искомое значение,столбец в котором ищем,0))
=ИНДЕКС(столбец из которого извлекаем;(ПОИСКПОЗ(искомое значение;столбец в котором ищем;0))
Думаю, ещё проще будет понять на примере. Предположим, у Вас есть вот такой список столиц государств:
Давайте найдём население одной из столиц, например, Японии, используя следующую формулу:
=INDEX($D$2:$D$10,MATCH("Japan",$B$2:$B$10,0))
=ИНДЕКС($D$2:$D$10;ПОИСКПОЗ("Japan";$B$2:$B$10;0))
Теперь давайте разберем, что делает каждый элемент этой формулы:
- Функция MATCH (ПОИСКПОЗ) ищет значение «Japan» в столбце B, а конкретно – в ячейках B2:B10, и возвращает число 3, поскольку «Japan» в списке на третьем месте.
- Функция INDEX (ИНДЕКС) использует 3 для аргумента row_num (номер_строки), который указывает из какой строки нужно возвратить значение. Т.е. получается простая формула:
=INDEX($D$2:$D$10,3)
=ИНДЕКС($D$2:$D$10;3)
Формула говорит примерно следующее: ищи в ячейках от D2 до D10 и извлеки значение из третьей строки, то есть из ячейки D4, так как счёт начинается со второй строки.
Вот такой результат получится в Excel:
Важно! Количество строк и столбцов в массиве, который использует функция INDEX (ИНДЕКС), должно соответствовать значениям аргументов row_num (номер_строки) и column_num (номер_столбца) функции MATCH (ПОИСКПОЗ). Иначе результат формулы будет ошибочным.
Стоп, стоп… почему мы не можем просто использовать функцию VLOOKUP (ВПР)? Есть ли смысл тратить время, пытаясь разобраться в лабиринтах ПОИСКПОЗ и ИНДЕКС?
=VLOOKUP("Japan",$B$2:$D$2,3)
=ВПР("Japan";$B$2:$D$2;3)
В данном случае – смысла нет! Цель этого примера – исключительно демонстрационная, чтобы Вы могли понять, как функции ПОИСКПОЗ и ИНДЕКС работают в паре. Последующие примеры покажут Вам истинную мощь связки ИНДЕКС и ПОИСКПОЗ, которая легко справляется с многими сложными ситуациями, когда ВПР оказывается в тупике.
Почему ИНДЕКС/ПОИСКПОЗ лучше, чем ВПР?
Решая, какую формулу использовать для вертикального поиска, большинство гуру Excel считают, что ИНДЕКС/ПОИСКПОЗ намного лучше, чем ВПР. Однако, многие пользователи Excel по-прежнему прибегают к использованию ВПР, т.к. эта функция гораздо проще. Так происходит, потому что очень немногие люди до конца понимают все преимущества перехода с ВПР на связку ИНДЕКС и ПОИСКПОЗ, а тратить время на изучение более сложной формулы никто не хочет.
Далее я попробую изложить главные преимущества использования ПОИСКПОЗ и ИНДЕКС в Excel, а Вы решите – остаться с ВПР или переключиться на ИНДЕКС/ПОИСКПОЗ.
4 главных преимущества использования ПОИСКПОЗ/ИНДЕКС в Excel:
1. Поиск справа налево. Как известно любому грамотному пользователю Excel, ВПР не может смотреть влево, а это значит, что искомое значение должно обязательно находиться в крайнем левом столбце исследуемого диапазона. В случае с ПОИСКПОЗ/ИНДЕКС, столбец поиска может быть, как в левой, так и в правой части диапазона поиска. Пример: Как находить значения, которые находятся слева покажет эту возможность в действии.
2. Безопасное добавление или удаление столбцов. Формулы с функцией ВПР перестают работать или возвращают ошибочные значения, если удалить или добавить столбец в таблицу поиска. Для функции ВПР любой вставленный или удалённый столбец изменит результат формулы, поскольку синтаксис ВПР требует указывать весь диапазон и конкретный номер столбца, из которого нужно извлечь данные.
Например, если у Вас есть таблица A1:C10, и требуется извлечь данные из столбца B, то нужно задать значение 2 для аргумента col_index_num (номер_столбца) функции ВПР, вот так:
=VLOOKUP("lookup value",A1:C10,2)
=ВПР("lookup value";A1:C10;2)
Если позднее Вы вставите новый столбец между столбцами A и B, то значение аргумента придется изменить с 2 на 3, иначе формула возвратит результат из только что вставленного столбца.
Используя ПОИСКПОЗ/ИНДЕКС, Вы можете удалять или добавлять столбцы к исследуемому диапазону, не искажая результат, так как определен непосредственно столбец, содержащий нужное значение. Действительно, это большое преимущество, особенно когда работать приходится с большими объёмами данных. Вы можете добавлять и удалять столбцы, не беспокоясь о том, что нужно будет исправлять каждую используемую функцию ВПР.
3. Нет ограничения на размер искомого значения. Используя ВПР, помните об ограничении на длину искомого значения в 255 символов, иначе рискуете получить ошибку #VALUE! (#ЗНАЧ!). Итак, если таблица содержит длинные строки, единственное действующее решение – это использовать ИНДЕКС/ПОИСКПОЗ.
Предположим, Вы используете вот такую формулу с ВПР, которая ищет в ячейках от B5 до D10 значение, указанное в ячейке A2:
=VLOOKUP(A2,B5:D10,3,FALSE)
=ВПР(A2;B5:D10;3;ЛОЖЬ)
Формула не будет работать, если значение в ячейке A2 длиннее 255 символов. Вместо неё Вам нужно использовать аналогичную формулу ИНДЕКС/ПОИСКПОЗ:
=INDEX(D5:D10,MATCH(TRUE,INDEX(B5:B10=A2,0),0))
=ИНДЕКС(D5:D10;ПОИСКПОЗ(ИСТИНА;ИНДЕКС(B5:B10=A2;0);0))
4. Более высокая скорость работы. Если Вы работаете с небольшими таблицами, то разница в быстродействии Excel будет, скорее всего, не заметная, особенно в последних версиях. Если же Вы работаете с большими таблицами, которые содержат тысячи строк и сотни формул поиска, Excel будет работать значительно быстрее, при использовании ПОИСКПОЗ и ИНДЕКС вместо ВПР. В целом, такая замена увеличивает скорость работы Excel на 13%.
Влияние ВПР на производительность Excel особенно заметно, если рабочая книга содержит сотни сложных формул массива, таких как ВПР+СУММ. Дело в том, что проверка каждого значения в массиве требует отдельного вызова функции ВПР. Поэтому, чем больше значений содержит массив и чем больше формул массива содержит Ваша таблица, тем медленнее работает Excel.
С другой стороны, формула с функциями ПОИСКПОЗ и ИНДЕКС просто совершает поиск и возвращает результат, выполняя аналогичную работу заметно быстрее.
ИНДЕКС и ПОИСКПОЗ – примеры формул
Теперь, когда Вы понимаете причины, из-за которых стоит изучать функции ПОИСКПОЗ и ИНДЕКС, давайте перейдём к самому интересному и увидим, как можно применить теоретические знания на практике.
Как выполнить поиск с левой стороны, используя ПОИСКПОЗ и ИНДЕКС
Любой учебник по ВПР твердит, что эта функция не может смотреть влево. Т.е. если просматриваемый столбец не является крайним левым в диапазоне поиска, то нет шансов получить от ВПР желаемый результат.
Функции ПОИСКПОЗ и ИНДЕКС в Excel гораздо более гибкие, и им все-равно, где находится столбец со значением, которое нужно извлечь. Для примера, снова вернёмся к таблице со столицами государств и населением. На этот раз запишем формулу ПОИСКПОЗ/ИНДЕКС, которая покажет, какое место по населению занимает столица России (Москва).
Как видно на рисунке ниже, формула отлично справляется с этой задачей:
=INDEX($A$2:$A$10,MATCH("Russia",$B$2:$B$10,0))
=ИНДЕКС($A$2:$A$10;ПОИСКПОЗ("Russia";$B$2:$B$10;0))
Теперь у Вас не должно возникать проблем с пониманием, как работает эта формула:
- Во-первых, задействуем функцию MATCH (ПОИСКПОЗ), которая находит положение «Russia» в списке:
=MATCH("Russia",$B$2:$B$10,0))
=ПОИСКПОЗ("Russia";$B$2:$B$10;0))
- Далее, задаём диапазон для функции INDEX (ИНДЕКС), из которого нужно извлечь значение. В нашем случае это A2:A10.
- Затем соединяем обе части и получаем формулу:
=INDEX($A$2:$A$10;MATCH("Russia";$B$2:$B$10;0))
=ИНДЕКС($A$2:$A$10;ПОИСКПОЗ("Russia";$B$2:$B$10;0))
Подсказка: Правильным решением будет всегда использовать абсолютные ссылки для ИНДЕКС и ПОИСКПОЗ, чтобы диапазоны поиска не сбились при копировании формулы в другие ячейки.
Вычисления при помощи ИНДЕКС и ПОИСКПОЗ в Excel (СРЗНАЧ, МАКС, МИН)
Вы можете вкладывать другие функции Excel в ИНДЕКС и ПОИСКПОЗ, например, чтобы найти минимальное, максимальное или ближайшее к среднему значение. Вот несколько вариантов формул, применительно к таблице из предыдущего примера:
1. MAX (МАКС). Формула находит максимум в столбце D и возвращает значение из столбца C той же строки:
=INDEX($C$2:$C$10,MATCH(MAX($D$2:I$10),$D$2:D$10,0))
=ИНДЕКС($C$2:$C$10;ПОИСКПОЗ(МАКС($D$2:I$10);$D$2:D$10;0))
Результат: Beijing
2. MIN (МИН). Формула находит минимум в столбце D и возвращает значение из столбца C той же строки:
=INDEX($C$2:$C$10,MATCH(MIN($D$2:I$10),$D$2:D$10,0))
=ИНДЕКС($C$2:$C$10;ПОИСКПОЗ(МИН($D$2:I$10);$D$2:D$10;0))
Результат: Lima
3. AVERAGE (СРЗНАЧ). Формула вычисляет среднее в диапазоне D2:D10, затем находит ближайшее к нему и возвращает значение из столбца C той же строки:
=INDEX($C$2:$C$10,MATCH(AVERAGE($D$2:D$10),$D$2:D$10,1))
=ИНДЕКС($C$2:$C$10;ПОИСКПОЗ(СРЗНАЧ($D$2:D$10);$D$2:D$10;1))
Результат: Moscow
О чём нужно помнить, используя функцию СРЗНАЧ вместе с ИНДЕКС и ПОИСКПОЗ
Используя функцию СРЗНАЧ в комбинации с ИНДЕКС и ПОИСКПОЗ, в качестве третьего аргумента функции ПОИСКПОЗ чаще всего нужно будет указывать 1 или -1 в случае, если Вы не уверены, что просматриваемый диапазон содержит значение, равное среднему. Если же Вы уверены, что такое значение есть, – ставьте 0 для поиска точного совпадения.
- Если указываете 1, значения в столбце поиска должны быть упорядочены по возрастанию, а формула вернёт максимальное значение, меньшее или равное среднему.
- Если указываете -1, значения в столбце поиска должны быть упорядочены по убыванию, а возвращено будет минимальное значение, большее или равное среднему.
В нашем примере значения в столбце D упорядочены по возрастанию, поэтому мы используем тип сопоставления 1. Формула ИНДЕКС/ПОИСКПОЗ возвращает «Moscow», поскольку величина населения города Москва – ближайшее меньшее к среднему значению (12 269 006).
Как при помощи ИНДЕКС и ПОИСКПОЗ выполнять поиск по известным строке и столбцу
Эта формула эквивалентна двумерному поиску ВПР и позволяет найти значение на пересечении определённой строки и столбца.
В этом примере формула ИНДЕКС/ПОИСКПОЗ будет очень похожа на формулы, которые мы уже обсуждали в этом уроке, с одним лишь отличием. Угадайте каким?
Как Вы помните, синтаксис функции INDEX (ИНДЕКС) позволяет использовать три аргумента:
INDEX(array,row_num,[column_num])
ИНДЕКС(массив;номер_строки;[номер_столбца])
И я поздравляю тех из Вас, кто догадался!
Начнём с того, что запишем шаблон формулы. Для этого возьмём уже знакомую нам формулу ИНДЕКС/ПОИСКПОЗ и добавим в неё ещё одну функцию ПОИСКПОЗ, которая будет возвращать номер столбца.
=INDEX(Ваша таблица,(MATCH(значение для вертикального поиска,столбец, в котором искать,0)),(MATCH(значение для горизонтального поиска,строка в которой искать,0))
=ИНДЕКС(Ваша таблица,(MATCH(значение для вертикального поиска,столбец, в котором искать,0)),(MATCH(значение для горизонтального поиска,строка в которой искать,0))
Обратите внимание, что для двумерного поиска нужно указать всю таблицу в аргументе array (массив) функции INDEX (ИНДЕКС).
А теперь давайте испытаем этот шаблон на практике. Ниже Вы видите список самых населённых стран мира. Предположим, наша задача узнать население США в 2015 году.
Хорошо, давайте запишем формулу. Когда мне нужно создать сложную формулу в Excel с вложенными функциями, то я сначала каждую вложенную записываю отдельно.
Итак, начнём с двух функций ПОИСКПОЗ, которые будут возвращать номера строки и столбца для функции ИНДЕКС:
- ПОИСКПОЗ для столбца – мы ищем в столбце B, а точнее в диапазоне B2:B11, значение, которое указано в ячейке H2 (USA). Функция будет выглядеть так:
=MATCH($H$2,$B$1:$B$11,0)
=ПОИСКПОЗ($H$2;$B$1:$B$11;0)
Результатом этой формулы будет 4, поскольку «USA» – это 4-ый элемент списка в столбце B (включая заголовок).
- ПОИСКПОЗ для строки – мы ищем значение ячейки H3 (2015) в строке 1, то есть в ячейках A1:E1:
=MATCH($H$3,$A$1:$E$1,0)
=ПОИСКПОЗ($H$3;$A$1:$E$1;0)
Результатом этой формулы будет 5, поскольку «2015» находится в 5-ом столбце.
Теперь вставляем эти формулы в функцию ИНДЕКС и вуаля:
=INDEX($A$1:$E$11,MATCH($H$2,$B$1:$B$11,0),MATCH($H$3,$A$1:$E$1,0))
=ИНДЕКС($A$1:$E$11;ПОИСКПОЗ($H$2;$B$1:$B$11;0);ПОИСКПОЗ($H$3;$A$1:$E$1;0))
Если заменить функции ПОИСКПОЗ на значения, которые они возвращают, формула станет легкой и понятной:
=INDEX($A$1:$E$11,4,5))
=ИНДЕКС($A$1:$E$11;4;5))
Эта формула возвращает значение на пересечении 4-ой строки и 5-го столбца в диапазоне A1:E11, то есть значение ячейки E4. Просто? Да!
Поиск по нескольким критериям с ИНДЕКС и ПОИСКПОЗ
В учебнике по ВПР мы показывали пример формулы с функцией ВПР для поиска по нескольким критериям. Однако, существенным ограничением такого решения была необходимость добавлять вспомогательный столбец. Хорошая новость: формула ИНДЕКС/ПОИСКПОЗ может искать по значениям в двух столбцах, без необходимости создания вспомогательного столбца!
Предположим, у нас есть список заказов, и мы хотим найти сумму по двум критериям – имя покупателя (Customer) и продукт (Product). Дело усложняется тем, что один покупатель может купить сразу несколько разных продуктов, и имена покупателей в таблице на листе Lookup table расположены в произвольном порядке.
Вот такая формула ИНДЕКС/ПОИСКПОЗ решает задачу:
{=INDEX('Lookup table'!$A$2:$C$13,MATCH(1,(A2='Lookup table'!$A$2:$A$13)*
(B2='Lookup table'!$B$2:$B$13),0),3)}
{=ИНДЕКС('Lookup table'!$A$2:$C$13;ПОИСКПОЗ(1;(A2='Lookup table'!$A$2:$A$13)*
(B2='Lookup table'!$B$2:$B$13);0);3)}
Эта формула сложнее других, которые мы обсуждали ранее, но вооруженные знанием функций ИНДЕКС и ПОИСКПОЗ Вы одолеете ее. Самая сложная часть – это функция ПОИСКПОЗ, думаю, её нужно объяснить первой.
MATCH(1,(A2='Lookup table'!$A$2:$A$13),0)*(B2='Lookup table'!$B$2:$B$13)
ПОИСКПОЗ(1;(A2='Lookup table'!$A$2:$A$13);0)*(B2='Lookup table'!$B$2:$B$13)
В формуле, показанной выше, искомое значение – это 1, а массив поиска – это результат умножения. Хорошо, что же мы должны перемножить и почему? Давайте разберем все по порядку:
- Берем первое значение в столбце A (Customer) на листе Main table и сравниваем его со всеми именами покупателей в таблице на листе Lookup table (A2:A13).
- Если совпадение найдено, уравнение возвращает 1 (ИСТИНА), а если нет – 0 (ЛОЖЬ).
- Далее, мы делаем то же самое для значений столбца B (Product).
- Затем перемножаем полученные результаты (1 и 0). Только если совпадения найдены в обоих столбцах (т.е. оба критерия истинны), Вы получите 1. Если оба критерия ложны, или выполняется только один из них – Вы получите 0.
Теперь понимаете, почему мы задали 1, как искомое значение? Правильно, чтобы функция ПОИСКПОЗ возвращала позицию только, когда оба критерия выполняются.
Обратите внимание: В этом случае необходимо использовать третий не обязательный аргумент функции ИНДЕКС. Он необходим, т.к. в первом аргументе мы задаем всю таблицу и должны указать функции, из какого столбца нужно извлечь значение. В нашем случае это столбец C (Sum), и поэтому мы ввели 3.
И, наконец, т.к. нам нужно проверить каждую ячейку в массиве, эта формула должна быть формулой массива. Вы можете видеть это по фигурным скобкам, в которые она заключена. Поэтому, когда закончите вводить формулу, не забудьте нажать Ctrl+Shift+Enter.
Если всё сделано верно, Вы получите результат как на рисунке ниже:
ИНДЕКС и ПОИСКПОЗ в сочетании с ЕСЛИОШИБКА в Excel
Как Вы, вероятно, уже заметили (и не раз), если вводить некорректное значение, например, которого нет в просматриваемом массиве, формула ИНДЕКС/ПОИСКПОЗ сообщает об ошибке #N/A (#Н/Д) или #VALUE! (#ЗНАЧ!). Если Вы хотите заменить такое сообщение на что-то более понятное, то можете вставить формулу с ИНДЕКС и ПОИСКПОЗ в функцию ЕСЛИОШИБКА.
Синтаксис функции ЕСЛИОШИБКА очень прост:
IFERROR(value,value_if_error)
ЕСЛИОШИБКА(значение;значение_если_ошибка)
Где аргумент value (значение) – это значение, проверяемое на предмет наличия ошибки (в нашем случае – результат формулы ИНДЕКС/ПОИСКПОЗ); а аргумент value_if_error (значение_если_ошибка) – это значение, которое нужно возвратить, если формула выдаст ошибку.
Например, Вы можете вставить формулу из предыдущего примера в функцию ЕСЛИОШИБКА вот таким образом:
=IFERROR(INDEX($A$1:$E$11,MATCH($G$2,$B$1:$B$11,0),MATCH($G$3,$A$1:$E$1,0)),
"Совпадений не найдено. Попробуйте еще раз!")=ЕСЛИОШИБКА(ИНДЕКС($A$1:$E$11;ПОИСКПОЗ($G$2;$B$1:$B$11;0);ПОИСКПОЗ($G$3;$A$1:$E$1;0));
"Совпадений не найдено. Попробуйте еще раз!")
И теперь, если кто-нибудь введет ошибочное значение, формула выдаст вот такой результат:
Если Вы предпочитаете в случае ошибки оставить ячейку пустой, то можете использовать кавычки («»), как значение второго аргумента функции ЕСЛИОШИБКА. Вот так:
IFERROR(INDEX(массив,MATCH(искомое_значение,просматриваемый_массив,0),"")
ЕСЛИОШИБКА(ИНДЕКС(массив;ПОИСКПОЗ(искомое_значение;просматриваемый_массив;0);"")
Надеюсь, что хотя бы одна формула, описанная в этом учебнике, показалась Вам полезной. Если Вы сталкивались с другими задачами поиска, для которых не смогли найти подходящее решение среди информации в этом уроке, смело опишите свою проблему в комментариях, и мы все вместе постараемся решить её.
Оцените качество статьи. Нам важно ваше мнение:
Для извлечения из таблицы только нужных строк можно использовать формулы, а не только
Автофильтр
. Покажем преимущества и недостатки обеих подходов.
Пусть имеется исходная таблица с объемами продаж товаров по кварталам.
Нам требуется отобразить только строки с определенными номерами: 2, 3, 5, 10.
Это можно легко сделать с помощью
Автофильтра
в столбце А. Но. если нам требуется вывести строки не в исходной таблице, а например, на другом листе или при выводе строк отобразить не значения продаж за квартал, а продажи
нарастающим итогом
?
В этом случае можно воспользоваться
Сводными таблицами
или формулами. В этой статье воспользуемся формулами для того, чтобы сформировать своеобразный
Отчет
на основе исходной таблицы.
Выведем требуемые строки на том же листе
Сделаем заготовку таблицы, в левом столбце укажем строки, которые требуется вывести.
В ячейке
В22
введем формулу
=ИНДЕКС(B$8:B$17;ПОИСКПОЗ($A22;$A$8:$A$17;0))
и скопируем ее для всех кварталов и строк.
Примечание
: Обратите внимание на
смешенные ссылки
B$8:B$17 и
$A22 — это важно при копировании формулы.
При необходимости можно подсчитать суммарные продажи за год (см.
файл примера
).
Выведем требуемые строки на другом листе
Теперь выведем эту же таблицу на другом листе, а продажи за квартал заменим продажами
нарастающим итогом
.
Для этого в ячейку
В6
на листе
Нарастающий итог
введите формулу аналогичную рассмотренной выше
=ИНДЕКС(Лист1!B$8:B$17;ПОИСКПОЗ($A6;Лист1!$A$8:$A$17;0))
и скопируйте ее вниз.
А в ячейке
С6
введите
=ИНДЕКС(Лист1!C$8:C$17;ПОИСКПОЗ($A6;Лист1!$A$8:$A$17;0))+СУММ(B6)
Скопируем ее вниз и вправо. Получим требуемый результат.
Примечание
: О том, почему в формуле использовано выражение
+
СУММ(B6)
, а не просто
+В6
читайте
в этой статье
.
В файле примера показано как с помощью формул вывести только четные строки или только нечетные (попробуйте это сделать Автофильтром!)
В этом руководстве вы познакомитесь с новой функцией динамического массива Excel 365 под названием CHOOSECOLS и покажете, как вы можете использовать ее для извлечения любых определенных столбцов из массива.
Представьте, что вы работаете с набором данных из сотен или тысяч столбцов. Очевидно, что некоторые столбцы более важны, чем другие, и, естественно, вы можете сначала прочитать их данные. Excel 365 предлагает идеальную функцию для работы, которая может мгновенно извлекать определенные данные из массива, чтобы вы могли сосредоточиться на наиболее важной информации.
Функция CHOOSECOLS в Excel предназначена для возврата указанных столбцов из массива или диапазона.
Синтаксис включает следующие аргументы:
CHOOSECOLS(массив, col_num1, [col_num2]…)
Где:
Массив (обязательно) — исходный массив или диапазон.
Col_num1 (обязательно) — целое число, определяющее первый возвращаемый столбец.
Col_num2, … (необязательно) — порядковые номера дополнительных столбцов для возврата.
А вот так может выглядеть функция ВЫБОР РАСЧЕТОВ в вашем Excel:
Наличие функции ВЫБОР
В настоящее время функция CHOOSECOLS доступна в Excel для Microsoft 365 (Windows и Mac) и Excel для Интернета.
Кончик. Чтобы извлечь несколько строк из диапазона или массива, может пригодиться функция CHOOSEROWS.
Как использовать функцию ВЫБОР РАСЦЕН в Excel
CHOOSECOLS — это функция динамического массива, поэтому она изначально обрабатывает массивы. Формула должна быть введена только в одну ячейку — верхнюю левую ячейку целевого диапазона — и она автоматически разливается на столько столбцов, сколько указано в ее аргументах, и столько строк, сколько есть в исходном массиве. В результате получается единый динамический массив, который называется диапазоном разлива.
Чтобы создать формулу CHOOSECOLS в Excel, вам нужно сделать следующее:
- Для массива укажите диапазон ячеек или массив значений.
- Для col_num укажите положительное или отрицательное целое число, указывающее, какой столбец следует вернуть. Положительное число подтягивает соответствующий столбец из левой части массива, отрицательное число — из правой части массива. Чтобы получить несколько столбцов, можно определить их номера в отдельных аргументах или в одном аргументе в виде константы массива.
Например, чтобы получить столбцы 2, 3 и 4 из диапазона A4:E19, используйте следующую формулу:
=ВЫБОРЦВЕТ(A4:E19, 2, 3, 4)
Кроме того, вы можете использовать константу горизонтального массива, например {2,3,4}, или константу вертикального массива, например {2;3;4}, чтобы указать номера столбцов:
=ВЫБОРЦВЕТ(A4:E19, {2,3,4})
=ВЫБОРЦВЕТ(A4:E19, {2;3;4})
Все три приведенные выше формулы дадут один и тот же результат:
В некоторых ситуациях может оказаться более удобным ввести номера столбцов в некоторые ячейки, а затем ссылаться на эти ячейки по отдельности или предоставить ссылку на один диапазон. Например:
=ВЫБОРЦВЕТ(A4:E19, G4, H4, I4)
=ВЫБОРЦВЕТ(A4:E19, G4:I4)
Этот подход дает вам больше гибкости — для извлечения любых других столбцов вы просто вводите разные числа в предопределенные ячейки, не изменяя саму формулу.
Теперь, когда вы знаете основы, давайте углубимся в дополнительные возможности и рассмотрим несколько более сложные формулы CHOOSECOLS для обработки конкретных сценариев.
Получить последние столбцы из диапазона
Чтобы вернуть один или несколько столбцов из конца диапазона, укажите отрицательные числа в качестве аргументов col_num. Это заставит функцию начать подсчет столбцов с правой стороны массива.
Например, чтобы получить последний столбец из диапазона A4:D13, используйте следующую формулу:
=ВЫБОРЦВЕТ(A4:E19, -1)
Чтобы извлечь последние два столбца, используйте этот:
=ВЫБОРЦВЕТ(A4:E19, -2, -1)
Чтобы вернуть последние 2 столбца в обратном порядке, измените порядок аргументов col_num следующим образом:
=ВЫБОРЦВЕТ(A4:E19, -1, -2)
Получить каждый второй столбец в Excel
Чтобы извлечь каждый второй столбец из заданного диапазона, вы можете использовать CHOOSECOLS вместе с несколькими другими функциями. Ниже приведены две версии формулы для извлечения нечетных и четных столбцов.
Чтобы получить нечетные столбцы (например, 1, 3, 5 и т. д.), используйте следующую формулу:
=ВЫБОРЦВЕТ(A4:E19, ПОСЛЕДОВАТЕЛЬНОСТЬ(ОКРУГЛВВЕРХ(СТОЛБЦЫ(A4:E19)/2, 0), 1, 1, 2))
Чтобы вернуть четные столбцы (например, 2, 4, 6 и т. д.), формула принимает следующий вид:
=ВЫБОРСЕКТОРОВ(A4:E19, ПОСЛЕДОВАТЕЛЬНОСТЬ(ОКРУГЛЕНИЕВНИЗ(СТОЛБЦЫ(A4:E19)/2, 0), 1, 2, 2))
На скриншоте ниже показана первая формула в действии:
Как работает эта формула:
Краткое пояснение: функция ВЫБОРЦВЕТ возвращает каждый второй столбец на основе массива последовательных нечетных или четных чисел, созданного функцией ПОСЛЕДОВАТЕЛЬНОСТЬ.
Подробная расшифровка формулы:
Первый шаг — вычислить, сколько столбцов нужно вернуть. Для этого воспользуемся одной из следующих формул:
ОКРУГЛВВЕРХ(СТОЛБЦЫ(A4:E19)/2, 0)
или
ОКРУГЛВНИЗ(СТОЛБЦЫ(A4:E19)/2, 0)
COLUMNS подсчитывает общее количество столбцов в исходном диапазоне. Вы делите это число на 2, а затем, в зависимости от того, извлекаете ли вы нечетные или четные столбцы, округляете частное вверх или вниз до целого числа с помощью ОКРУГЛВВЕРХ или ОКРУГЛВНИЗ. Округление необходимо, если исходный диапазон содержит нечетное количество столбцов, что дает остаток при делении на 2.
Наш исходный диапазон имеет 5 столбцов. Таким образом, для нечетных столбцов ОКРУГЛВВЕРХ(5/2, 0) возвращает 3, а для четных столбцов ОКРУГЛВНИЗ(5/2, 0) возвращает 2.
Возвращенное число передается в первый аргумент (строки) функции ПОСЛЕДОВАТЕЛЬНОСТЬ.
Для нечетных столбцов получаем:
ПОСЛЕДОВАТЕЛЬНОСТЬ(3, 1, 1, 2)
Эта формула ПОСЛЕДОВАТЕЛЬНОСТЬ создает массив чисел, состоящий из 3 строк и 1 столбца, начиная с 1 и увеличивая на 2, что равно {1;3;5}.
Для четных столбцов имеем:
ПОСЛЕДОВАТЕЛЬНОСТЬ(2, 1, 2, 2)
В этом случае ПОСЛЕДОВАТЕЛЬНОСТЬ создает массив чисел, состоящий из 2 строк и 1 столбца, начиная с 2 и увеличивая на 2, что равно {2;4}.
Приведенный выше массив переходит к аргументу col_num1 команды CHOOSECOLS, и вы получаете желаемый результат.
Отразить массив по горизонтали в Excel
Чтобы изменить порядок столбцов в массиве слева направо, вы можете использовать функции CHOOSECOLS, SEQUENCE и COLUMNS вместе следующим образом:
=ВЫБОРСЕКТОРОВ(A4:D19, ПОСЛЕДОВАТЕЛЬНОСТЬ(СТОЛБЦЫ(A4:D19)) *-1)
В результате исходный диапазон переворачивается по горизонтали, как показано на изображении ниже:
Как работает эта формула:
Здесь мы используем функцию ПОСЛЕДОВАТЕЛЬНОСТЬ для создания массива, содержащего столько порядковых номеров, сколько столбцов в исходном массиве. Для этого мы вкладываем COLUMNS(A4:D13) в аргумент rows:
ПОСЛЕДОВАТЕЛЬНОСТЬ(СТОЛБЦЫ(A4:D19))
Другие аргументы (столбцы, начало, шаг) опущены, поэтому по умолчанию они равны 1. В результате ПОСЛЕДОВАТЕЛЬНОСТЬ создает массив последовательных чисел, таких как 1, 2, 3, …, n, где n — индекс последнего столбец в массиве. Чтобы функция CHOOSECOLS считала столбцы справа налево, мы умножаем каждый элемент сгенерированной последовательности на -1. В результате мы получаем массив отрицательных чисел, таких как {-1;-2;-3}, которые переходят к аргументу col_num функции CHOOSECOLS, указывая ей вернуть соответствующие столбцы с правой стороны массива:
ВЫБОРЦВЕТ(A4:D19, {-1;-2;-3;-4})
Извлечь столбцы на основе строки с числами
В ситуации, когда номера индексов целевых столбцов представлены в виде текстовой строки, вы можете использовать функцию TEXTSPLIT, чтобы разбить строку по заданному разделителю, а затем передать полученный массив чисел в CHOOSECOLS.
Допустим, номера столбцов перечислены в ячейке H3, разделенные запятой и пробелом. Чтобы получить интересующие столбцы, используйте эту формулу:
=ВЫБРАТЬСЕКЦИИ(A4:E19, РАЗДЕЛЕНИЕ ТЕКСТА(H3, «, «) *1)
Как работает эта формула:
Во-первых, вы разделяете строку заданным разделителем (в нашем случае это запятая и пробел):
РАЗДЕЛЕНИЕ ТЕКСТА(H3,» «»)
Промежуточным результатом является массив текстовых значений, таких как {«1″,»4″,»5»}. Чтобы преобразовать текст в числа, умножьте элементы массива на 1 или выполните любую другую математическую операцию, которая не изменяет исходные значения.
ТЕКСТРАЗДЕЛИТЬ(H3,» «») *1
Это создает массив числовых значений {1,4,5}, которые может обработать функция CHOOSECOLS, и вы получите результат, который ищете:
ВЫБОРЦВЕТ(A4:E19, {1,4,5})
Извлечение столбцов из нескольких диапазонов
Чтобы получить определенные столбцы из нескольких несмежных диапазонов, вы сначала объединяете все диапазоны в один с помощью функции VSTACK, а затем обрабатываете объединенный диапазон с помощью CHOOSECOLS.
Например, чтобы вернуть столбцы 1 и 3 из диапазонов A4:D8, A12:D15 и A19:D21, используйте следующую формулу:
=ВЫБОРСЕКТОРОВ(ВССТЕК(A4:D8, A12:D15, A19:D21), 1, 3)
Функция CHOOSECOLS не работает
Если формула CHOOSECOLS выдает ошибку, она, скорее всего, будет одной из следующих.
#ЦЕНИТЬ! ошибка
Происходит, если абсолютное значение любого аргумента col_num равно нулю или превышает общее количество столбцов в указанном массиве.
#НАЗВАНИЕ? ошибка
Происходит, если имя функции написано с ошибкой или функция недоступна в вашей версии Excel. В настоящее время CHOOSECOLS поддерживается только в Excel 365 и Excel для Интернета.
#ИГРА! ошибка
Происходит, когда что-то мешает формуле распространить результаты в соседние ячейки. Чтобы это исправить, просто очистите мешающие ячейки. Дополнительные сведения см. в разделе Как исправить ошибку #SPILL! ошибка в экселе.
Вот как можно использовать функцию CHOOSECOLS в Excel для возврата определенных столбцов из диапазона или массива. Спасибо за внимание и до встречи в нашем блоге на следующей неделе!
Практическая рабочая тетрадь для скачивания
Формула Excel CHOOSECOLS — примеры (файл .xlsx)
Вас также могут заинтересовать
У меня небольшая проблема с Excel. Я делал преобразования для некоторых столбцов в наборе данных. Я знаю количество нужных столбцов, но не смог использовать их в формуле. Например, я хочу добавить 5-й и 10-й столбец. Как мне написать эту формулу?
Примечание: я пробовал ссылочный стиль R1C1, но это не то, что я ищу.
Вы можете сделать это с:
=SUM(OFFSET($A:$A,0,5-1),OFFSET($A$:$A,0,10-1))
При необходимости замените 5 и 10 вычислениями или ссылками на ячейки с номерами столбцов.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками microsoft-excel selection.
На чтение 3 мин. Просмотров 6.1k.
= СУММ ( ИНДЕКС( данные ; 0 ; ПОИСКПОЗ( величины ; заголовок ; 0 )))
Для того, чтобы найти и вернуть сумму столбца, вы можете использовать формулу, основанную на ИНДЕКС, ПОИСКПОЗ и СУММ функций.
В примере формула в I7 равна:
= СУММ(ИНДЕКС( C5: F11; 0; ПОИСКПОЗ( I6 ; C4: F4 ; 0 )))
Ядро этой функции использует функции ИНДЕКС и ПОИСКПОЗ особым образом, чтобы вернуть полный столбец вместо одного значения.
Функция ПОИСКПОЗ используется для того, чтобы найти правильный номер столбца в I6:
ПОИСКПОЗ( I6 ; C4: F4 ; 0 )
ПОИСКПОЗ возвращает 2 внутри функции ИНДЕКС в качестве аргумента номер_столбца, где массив установлен в диапазоне С5: F11.
Содержание
- Поиск всего столбца
- Поиск всей строки
- Поиск наименьшего значения
- Поиск стоимости товара или услуги
- Поиск с именем переменной
Поиск всего столбца
= ИНДЕКС( данные ; 0 ; ПОИСКПОЗ( значение ; заголовки ; 0 ))
Для поиска и извлечения всего столбца, вы можете использовать формулу, основанную на функциях ИНДЕКС и ПОИСКПОЗ. В примере используется формула для поиска всех результатов H7:
=ИНДЕКС(C5:F8;0;ПОИСКПОЗ(H6;C4:F4;0))
Суть: использовать ПОИСКПОЗ, чтобы определить индекс столбца, а затем ИНДЕКС, чтобы получить весь столбец, приравняв номер строки к нулю.
Поиск всей строки
= ИНДЕКС( данные; ПОИСКПОЗ( значение ; массив ; 0 ); 0 )
Для поиска и извлечения всей строки, можно использовать ИНДЕКС и ПОИСКПОЗ функции. В приведенном примере формула, используемая для поиска всех значений для Центрального региона:
= ИНДЕКС( C5: F8 ; ПОИСКПОЗ( H5 ; B5: B8 ; 0 ); 0 )
Суть: использовать ПОИСКПОЗ, чтобы определить индекс строки, а затем ИНДЕКС, чтобы получить всю строку, приравняв номер столбца к нулю.
Поиск наименьшего значения
= ИНДЕКС( диапазон; ПОИСКПОЗ( МИН(величины ); величины; 0 ))
Для поиска информации, связанной с наименьшим значением в таблице, вы можете использовать формулу, основанную на ИНДЕКС, ПОИСКПОЗ и функции МИН.
В примере формула используется для определения имени исполнителя с низким предложением. Формула в F6 является:
= ИНДЕКС( B5: B9 ; ПОИСКПОЗ( МИН( C5: C9 ); C5: C9 ; 0 ))
Поиск стоимости товара или услуги
= ВПР ( продукт ; таблица ; столбец ; ЛОЖЬ)
Если у вас есть список продуктов или услуг (или связанные с ними варианты), с соответствующими затратами, вы можете использовать ВПР, чтобы найти и получить стоимость для конкретного варианта.
В примере формула в ячейке F5 является:
=ВПР(E5;B4:C6;2;0)
Эта формула использует значение ячейки E6 для поиска и извлечения правильной стоимости в диапазоне B5: C7.
Если ВПР находит соответствующее значение, связанные с этим расходы будут извлечены из 2-го столбца (столбец C). Если совпадение не найдено, ВПР возвращает #Н/A ошибку.
Поиск с именем переменной
= ВПР( величина; ДВССЫЛ( » ‘» & листов & «‘!» & «Диапазон» ); столбец; 0 )
Чтобы создать поиск с именем переменной листа, вы можете использовать функцию ВПР вместе с функцией ДВССЫЛ.
В примере формула в С5:
= ВПР ($B5 ; ДВССЫЛ( » ‘» &C$4 & «‘!» & «B5: C11»); 2; 0 )