Оглавление
В учебнике показано, как использовать функцию VLOOKUP для копирования данных из другого рабочего листа или рабочей книги, Vlookup в нескольких листах и динамический поиск для возврата значений из разных листов в разные ячейки.
При поиске информации в Excel редко когда все данные находятся на одном листе. Чаще всего приходится искать на нескольких листах или даже в разных рабочих книгах. Хорошая новость заключается в том, что Microsoft Excel предоставляет несколько способов сделать это, а плохая - в том, что все они немного сложнее, чем стандартная формула VLOOKUP. Но если проявить немного терпения, то мыразберется с ними :)
Как выполнить VLOOKUP между двумя листами
Для начала рассмотрим простейший случай - использование VLOOKUP для копирования данных с другого рабочего листа. Это очень похоже на обычную формулу VLOOKUP, которая выполняет поиск на том же рабочем листе. Разница в том, что вы включаете имя листа в формулу массив_таблиц аргумент, указывающий вашей формуле, в каком рабочем листе находится диапазон поиска.
Общая формула для VLOOKUP с другого листа выглядит следующим образом:
VLOOKUP(lookup_value, Лист! ассортимент , col_index_num, [range_lookup])В качестве примера приведем данные о продажах из Ян отчитываться перед Резюме лист. Для этого мы определяем следующие аргументы:
- Поиск_значений находятся в колонке А на Резюме лист, и мы обращаемся к первой ячейке данных, которая называется A2.
- Массив_таблиц это диапазон A2:B6 на листе Jan. Чтобы сослаться на него, префикс ссылки на диапазон содержит имя листа, за которым следует восклицательный знак: Jan!$A$2:$B$6.
Обратите внимание, что мы фиксируем диапазон с помощью абсолютных ссылок на ячейки, чтобы предотвратить его изменение при копировании формулы в другие ячейки.
Col_index_num равно 2, потому что мы хотим скопировать значение из столбца B, который является вторым столбцом в массиве таблицы.
- Range_lookup имеет значение FALSE для поиска точного совпадения.
Сложив аргументы вместе, мы получаем такую формулу:
=VLOOKUP(A2, Jan!$A$2:$B$6, 2, FALSE)
Перетащите формулу вниз по столбцу и получите такой результат:
Аналогичным образом вы можете выполнить Vlookup данных из Февраль и Мар листы:
=VLOOKUP(A2, Feb!$A$2:$B$6, 2, FALSE)
=VLOOKUP(A2, Mar!$A$2:$B$6, 2, FALSE)
Советы и примечания:
- Если имя листа содержит пространства или неалфавитные символы , он должен быть заключен в одинарные кавычки, например 'Январские продажи'!$A$2:$B$6 Более подробную информацию можно найти в разделе Как сослаться на другой лист в Excel.
- Вместо того чтобы вводить имя листа непосредственно в формуле, можно переключиться на рабочий лист поиска и выбрать диапазон там. Excel автоматически вставит ссылку с правильным синтаксисом, избавив вас от необходимости проверять имя и устранять неполадки.
Vlookup из другой рабочей книги
Чтобы выполнить VLOOKUP между двумя рабочими книгами, заключите имя файла в квадратные скобки, затем имя листа и восклицательный знак.
Например, для поиска значения A2 в диапазоне A2:B6 на Ян лист в Sales_reports.xlsx рабочей книги, используйте эту формулу:
=VLOOKUP(A2, [Sales_reports.xlsx]Jan!$A$2:$B$6, 2, FALSE)
Для получения подробной информации см. раздел VLOOKUP из другой рабочей книги в Excel.
Vlookup по нескольким листам с IFERROR
Когда вам нужно найти соответствие между более чем двумя листами, самым простым решением является использование VLOOKUP в сочетании с IFERROR. Идея заключается в том, чтобы вложить несколько функций IFERROR для проверки нескольких рабочих листов по очереди: если первый VLOOKUP не находит соответствия на первом листе, ищите на следующем листе, и так далее.
IFERROR(VLOOKUP(...), IFERROR(VLOOKUP(...), ..., " Не найдено "))Чтобы увидеть, как этот подход работает на реальных данных, давайте рассмотрим следующий пример. Ниже приведен файл Резюме таблицу, которую мы хотим заполнить названиями товаров и суммами, найдя номер заказа в Запад и Восток листы:
Сначала мы собираемся извлечь товары. Для этого мы поручаем формуле VLOOKUP найти номер заказа в A2 на Восток листа и вернуть значение из столбца B (2-й столбец в массив_таблиц A2:C6). Если точное совпадение не найдено, то поиск в Запад лист. Если оба Vlookup не работают, верните "Не найдено".
=IFERROR(VLOOKUP(A2, East!$A$2:$C$6, 2, FALSE), IFERROR(VLOOKUP(A2, West!$A$2:$C$6, 2, FALSE), "Not found"))
Чтобы вернуть сумму, просто измените номер индекса столбца на 3:
=IFERROR(VLOOKUP(A2, East!$A$2:$C$6, 3, FALSE), IFERROR(VLOOKUP(A2, West!$A$2:$C$6, 3, FALSE), "Not found"))
Совет. При необходимости можно указать разные массивы таблиц для разных функций VLOOKUP. В данном примере оба листа поиска имеют одинаковое количество строк (A2:C6), но ваши рабочие листы могут отличаться по размеру.
Vlookup в нескольких рабочих книгах
Чтобы выполнить Vlookup между двумя или более рабочими книгами, заключите имя рабочей книги в квадратные скобки и поставьте его перед именем листа. Например, вот как вы можете выполнить Vlookup в два разных файла ( Книга1 и Книга2 ) с помощью одной формулы:
=IFERROR(VLOOKUP(A2, [Book1.xlsx]East!$A$2:$C$6, 2, FALSE), IFERROR(VLOOKUP(A2, [Book2.xlsx]West!$A$2:$C$6, 2, FALSE), "Не найдено"))
Сделать номер индекса столбца динамическим для Vlookup нескольких столбцов
В ситуации, когда вам нужно вернуть данные из нескольких столбцов, делая col_index_num динамика может сэкономить вам время. Есть несколько корректировок, которые необходимо сделать:
- Для col_index_num используйте функцию COLUMNS, которая возвращает количество столбцов в указанном массиве: COLUMNS($A$1:B$1). (Координата строки не имеет значения, это может быть любая строка).
- В lookup_value аргумент, зафиксируйте ссылку на столбец знаком $ ($A2), чтобы она оставалась фиксированной при копировании формулы в другие столбцы.
В результате вы получаете своего рода динамическую формулу, которая извлекает совпадающие значения из разных столбцов, в зависимости от того, в какой столбец копируется формула:
=IFERROR(VLOOKUP($A2, East!$A$2:$C$6, COLUMNS($A$1:B$1), FALSE), IFERROR(VLOOKUP($A2, West!$A$2:$C$6, COLUMNS($A$1:B$1), FALSE), "Не найдено"))
При вводе в столбец B, COLUMNS($A$1:B$1) оценивается в 2, что говорит VLOOKUP вернуть значение из второго столбца массива таблицы.
При копировании в столбец C (т.е. вы перетащили формулу из B2 в C2), B$1 меняется на C$1, поскольку ссылка на столбец является относительной. Следовательно, COLUMNS($A$1:C$1) оценивается в 3, заставляя VLOOKUP возвращать значение из третьего столбца.
Эта формула отлично работает для 2 - 3 листов поиска. Если у вас больше, повторяющиеся IFERROR становятся слишком громоздкими. Следующий пример демонстрирует немного более сложный, но гораздо более элегантный подход.
Vlookup нескольких листов с помощью INDIRECT
Еще один способ Vlookup между несколькими листами в Excel - использовать комбинацию функций VLOOKUP и INDIRECT. Этот метод требует небольшой подготовки, но в итоге у вас будет более компактная формула для Vlookup в любом количестве электронных таблиц.
Общая формула для Vlookup по листам выглядит следующим образом:
VLOOKUP( lookup_value , INDIRECT("'"&INDEX( Таблицы поиска , MATCH(1, --(COUNTIF(INDIRECT("'" & Таблицы поиска & "'! диапазон поиска "), lookup_value )>0), 0)) & "'! массив_таблиц "), col_index_num , FALSE)Где:
- Таблицы поиска - именованный диапазон, состоящий из имен листов поиска.
- Поиск_значения - значение для поиска.
- Lookup_range - диапазон столбцов в листах поиска, в котором следует искать искомое значение.
- Массив_таблиц - диапазон данных в листах поиска.
- Col_index_num - номер столбца в массиве таблицы, из которого нужно вернуть значение.
Чтобы формула работала правильно, пожалуйста, учитывайте следующие предостережения:
- Это формула массива, которую нужно заполнить, нажав вместе клавиши Ctrl + Shift + Enter.
- Все листы должны иметь одинаковый порядок колонок .
- Поскольку мы используем один массив таблиц для всех таблиц поиска, укажите параметр наибольший диапазон если ваши листы имеют разное количество строк.
Как использовать формулу для Vlookup на всех листах
Чтобы выполнить Vlookup нескольких листов одновременно, выполните следующие действия:
- Запишите все имена листов поиска где-нибудь в рабочей книге и назовите этот диапазон ( Таблицы поиска в нашем случае).
- поиск значения A2 ( поиск_значения )
- в диапазоне A2:A6 ( диапазон поиска ) в четырех рабочих листах ( Восток , Север , Юг и Запад ), и
- извлеките совпадающие значения из столбца B, который является столбцом 2 ( col_index_num ) в диапазоне данных A2:C6 ( массив_таблиц ).
С приведенными выше аргументами формула принимает такой вид:
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets&"'!$A$2:$A$6"), $A2)>0), 0)) &"'!$A$2:$C$6"), 2, FALSE)
Обратите внимание, что мы фиксируем оба диапазона ($A$2:$A$6 и $A$2:$C$6) с помощью абсолютных ссылок на ячейки.
В результате мы получили формулу для поиска номера заказа в 4 листах и извлечения соответствующего элемента. Если определенный номер заказа не найден, выводится ошибка #N/A, как в строке 14:
Чтобы вернуть сумму, просто замените 2 на 3 в строке col_index_num аргумент, так как суммы находятся в 3-м столбце массива таблицы:
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 3, FALSE)
Если вы хотите заменить стандартное обозначение ошибки #N/A своим собственным текстом, оберните формулу в функцию IFNA:
=IFNA(VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 3, FALSE), "Не найдено")
Vlookup нескольких листов между рабочими книгами
Эта общая формула (или ее любая вариация) также может быть использована для Vlookup нескольких листов в другая тетрадь Для этого объедините имя рабочей книги внутри INDIRECT, как показано в следующей формуле:
=IFNA(VLOOKUP($A2, INDIRECT("'[Book1.xlsx]" & INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'[Book1.xlsx]" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 2, FALSE), "Не найдено")
Vlookup между листами и возврат нескольких столбцов
Если вы хотите получить данные из нескольких столбцов, то для этого можно использовать функцию формула многоячейкового массива может сделать это за один раз. Чтобы создать такую формулу, предоставьте константу массива для col_index_num аргумент.
В данном примере мы хотим вернуть названия товаров (столбец B) и суммы (столбец C), которые являются 2-м и 3-м столбцами в массиве таблицы соответственно. Таким образом, требуемый массив имеет вид {2,3}.
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets &"'!$A$2:$C$6"), $A2)>0), 0)) &"'!$A$2:$C$6"), {2,3}, FALSE)
Чтобы правильно ввести формулу в несколько ячеек, нужно сделать вот что:
- В первой строке выделите все ячейки, которые нужно заполнить (B2:C2 в нашем примере).
- Введите формулу и нажмите Ctrl + Shift + Enter . Это введет ту же формулу в выбранные ячейки, которая вернет разное значение в каждом столбце.
- Перетащите формулу на оставшиеся строки.
Как работает эта формула
Чтобы лучше понять логику, давайте разложим эту базовую формулу на отдельные функции:
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets&"'!$A$2:$A$6"), $A2)>0), 0)) &"'!$A$2:$C$6"), 2, FALSE)
Работает изнутри наружу, вот что делает формула:
КОУНТИФ и ИНДИРЕКТ
В двух словах, INDIRECT строит ссылки для всех листов поиска, а COUNTIF подсчитывает количество вхождений значения поиска (A2) в каждом листе:
--(COUNTIF( INDIRECT("'"&Lookup_sheets&"'!$A$2:$A$6"), $A2)>0)
Более подробно:
Сначала вы объединяете имя диапазона (Lookup_sheets) и ссылку на диапазон ($A$2:$A$6), добавляя апострофы и восклицательный знак в нужных местах для создания внешней ссылки, и передаете полученную текстовую строку функции INDIRECT для динамической ссылки на листы поиска:
INDIRECT({"'East'!$A$2:$A$6"; "'South'!$A$2:$A$6"; "'North'!$A$2:$A$6"; "'West'!$A$2:$A$6"})
COUNTIF проверяет каждую ячейку в диапазоне A2:A6 на каждом листе поиска по значению в A2 на основном листе и возвращает количество совпадений для каждого листа. В нашем наборе данных номер заказа в A2 (101) найден в файле Запад лист, который является 4-м в названном диапазоне, поэтому COUNTIF возвращает этот массив:
{0;0;0;1}
Далее, вы сравниваете каждый элемент вышеуказанного массива с 0:
--({0; 0; 0; 0; 1}>0)
Это дает массив значений TRUE (больше 0) и FALSE (равно 0), которые вы преобразуете в 1 и 0 с помощью двойного унари (--) и получаете в результате следующий массив:
{0; 0; 0; 1}
Эта операция является дополнительной мерой предосторожности для обработки ситуации, когда лист поиска содержит несколько вхождений искомого значения, и в этом случае COUNTIF вернет счетчик больше 1, в то время как мы хотим, чтобы в конечном массиве были только 1 и 0 (сейчас вы поймете почему).
После всех этих преобразований наша формула выглядит следующим образом:
VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, {0;0;0;1} , 0)) &"'!$A$2:$C$6"), 2, FALSE)
ИНДЕКС и МАТЧ
В этот момент в дело вступает классическая комбинация INDEX MATCH:
INDEX(Lookup_sheets, MATCH(1, {0;0;0;0;1}, 0))
Функция MATCH, настроенная на точное совпадение (0 в последнем аргументе), ищет значение 1 в массиве {0;0;0;0;1} и возвращает его позицию, которая равна 4:
INDEX(Lookup_sheets, 4)
Функция INDEX использует число, возвращаемое MATCH, в качестве аргумента номера ряда (row_num) и возвращает 4-е значение в названном диапазоне Таблицы поиска , который Запад .
Таким образом, формула далее сводится к:
VLOOKUP($A2, INDIRECT("'"&" West "&"'!$A$2:$C$6"), 2, FALSE)
VLOOKUP и INDIRECT
Функция INDIRECT обрабатывает текстовую строку внутри нее:
INDIRECT("'"& "West"&"'!$A$2:$C$6")
И преобразует его в ссылку, которая переходит в массив_таблиц аргумент VLOOKUP:
VLOOKUP($A2, 'West'!$A$2:$C$6 , 2, FALSE)
Наконец, эта очень стандартная формула VLOOKUP ищет значение A2 в первом столбце диапазона A2:C6 на странице Запад и возвращает совпадение из 2-го столбца. Вот и все!
Динамический VLOOKUP для возврата данных из нескольких листов в разные ячейки
Прежде всего, давайте определим, что именно означает слово "динамический" в данном контексте и чем эта формула будет отличаться от предыдущих.
Если у вас есть большие куски данных в одном формате, разделенные на несколько электронных таблиц, вы можете захотеть извлечь информацию из разных листов в разные ячейки. Приведенное ниже изображение иллюстрирует эту концепцию:
В отличие от предыдущих формул, которые извлекали значение из определенного листа на основе уникального идентификатора, на этот раз мы хотим извлечь значения из нескольких листов одновременно.
Для решения этой задачи существует два различных решения. В обоих случаях необходимо провести небольшую подготовительную работу и создать именованные диапазоны для ячеек данных в каждом листе поиска. Для данного примера мы определили следующие диапазоны:
- Восток_продажи - A2:B6 на восточном листе
- Северные_продажи - A2:B6 на северном листе
- Южные_продажи - A2:B6 на южном листе
- Запад_продажи - A2:B6 на западном листе
VLOOKUP и вложенные IF
Если у вас есть разумное количество листов для поиска, вы можете использовать вложенные функции ЕСЛИ для выбора листа на основе ключевых слов в заранее определенных ячейках (ячейки B1 - D1 в нашем случае).
При использовании значения поиска в A2 формула выглядит следующим образом:
=VLOOKUP($A2, IF(B$1="восток", East_Sales, IF(B$1="север", North_Sales, IF(B$1="юг", South_Sales, IF(B$1="запад", West_Sales)))), 2, FALSE)
В переводе на английский язык часть IF гласит:
Если В1 Восток , посмотрите в диапазоне под названием Восток_продажи ; если B1 является Север , посмотрите в диапазоне под названием Северные_продажи ; если B1 является Юг , посмотрите в диапазоне под названием Южные_продажи ; и если B1 является Запад , посмотрите в диапазоне под названием Запад_продажи .
Диапазон, возвращаемый IF, доходит до массив_таблиц VLOOKUP, который извлекает подходящее значение из 2-го столбца соответствующего листа.
Умелое использование смешанных ссылок для значения поиска ($A2 - абсолютный столбец и относительная строка) и логического теста IF (B$1 - относительный столбец и абсолютная строка) позволяет копировать формулу в другие ячейки без каких-либо изменений - Excel автоматически корректирует ссылки, основываясь на относительном положении строки и столбца.
Итак, мы вводим формулу в B2, копируем ее вправо и вниз на столько столбцов и строк, сколько необходимо, и получаем следующий результат:
КОСВЕННЫЙ ПРОСМОТР
При работе с большим количеством листов несколько вложенных уровней могут сделать формулу слишком длинной и трудночитаемой. Гораздо лучшим способом будет создать динамический диапазон vlookup с помощью INDIRECT:
=VLOOKUP($A2, INDIRECT(B$1&"_Sales"), 2, FALSE)
Здесь мы конкатенируем ссылку на ячейку, содержащую уникальную часть именованного диапазона (B1) и общую часть (_Sales). В результате получается текстовая строка типа "East_Sales", которую INDIRECT преобразует в имя диапазона, понятное Excel.
В результате вы получаете компактную формулу, которая прекрасно работает на любом количестве листов:
Вот как сделать Vlookup между листами и файлами в Excel. Я благодарю вас за чтение и надеюсь увидеть вас в нашем блоге на следующей неделе!
Рабочая тетрадь для тренировок для скачивания
Примеры Vlookup для нескольких листов (файл .xlsx)