ВПР в Excel: как пользоваться, ошибка #Н/Д и чем заменить
Функция ВПР на примере платежей и справочника клиентов: аргументы, ЛОЖЬ и ИСТИНА, причины #Н/Д, дубли ключа, ПРОСМОТРX, ИНДЕКС+ПОИСКПОЗ и то же самое через LEFT JOIN.
Содержание статьи
Платежи за 16 августа пришли выгрузкой из биллинга: номер платежа, user_id, сумма. Руководитель просит разбить их по странам, а страна хранится в другом файле — справочнике клиентов, который CRM выгрузила 31 июля. Задача на одну формулу: ВПР подтянет страну по user_id. Только ошибается эта формула обычно молча: подставляет страну соседнего клиента, показывает 0 вместо пустой ячейки, берёт устаревшую строку из двух одинаковых. Ниже — синтаксис по справке Microsoft, пример на платежах из учебной базы «Маяк», подвохи с посчитанными результатами, ПРОСМОТРX и ИНДЕКС+ПОИСКПОЗ и тот же сценарий в SQL, где ВПР оказывается обычным LEFT JOIN.
Коротко: что делает ВПР
ВПР (в английском Excel — VLOOKUP) ищет значение в первом столбце диапазона и возвращает значение из той же строки в столбце с указанным номером. Для аналитика это соединение двух таблиц: к каждой строке приписывается поле из справочника, а число строк не меняется. Ошибки прячутся в том, что подставилось.
- Формула для точного поиска:
=ВПР(B2;Клиенты!$A$2:$D$8;3;ЛОЖЬ). Четвёртый аргументЛОЖЬ(или 0) обязателен: без него Excel ищет приблизительно. #Н/Дпри точном поиске значит «ключ не найден». Причины — ключа действительно нет, в ячейке лишний пробел или число сохранено как текст.- Если ключ в справочнике встречается дважды, ВПР молча берёт первое совпадение сверху.
- Пустая ячейка справочника превращается в 0.
- ПРОСМОТРX по умолчанию ищет точно, умеет брать столбец левее ключа и выводить свой текст вместо #Н/Д, но в Excel 2016 и 2019 её нет.
- В SQL та же операция — LEFT JOIN, только дубль ключа в справочнике там не прячется, а размножает строки.
Синтаксис ВПР: четыре аргумента
Справка Microsoft записывает функцию так: ВПР(искомое_значение; таблица; номер_столбца; [интервальный_просмотр]). В русской версии Excel аргументы разделяются точкой с запятой. Первые три обязательны, четвёртый в квадратных скобках — нет, и это главный источник ошибок: если его пропустить, Excel выполнит приблизительный поиск.
Ключ ВПР ищет только в первом, левом столбце таблицы, и номер столбца отсчитывается от него: 1 — сам ключ, 2 — соседний справа. Номер больше ширины диапазона даст #ССЫЛКА!. Столбец левее ключа ВПР не вернёт — для этого есть ПРОСМОТРX и ИНДЕКС с ПОИСКПОЗ.
В Google Таблицах функция тоже называется ВПР (VLOOKUP). Аргументы там подписаны запрос, диапазон, индекс, [отсортировано], а умолчание то же: без последнего аргумента поиск приблизительный. Google советует ставить ЛОЖЬ и пишет, что из нескольких подходящих строк вернётся первая.
| Аргумент | Что передать | В примере |
|---|---|---|
| искомое_значение | ключ из текущей строки | B2 — user_id платежа |
| таблица | диапазон справочника, ключ в первом столбце, ссылка закреплена $ | Клиенты!$A$2:$D$8 |
| номер_столбца | номер столбца результата внутри диапазона, считая с 1 | 3 — страна |
| интервальный_просмотр | ЛОЖЬ или 0 — точное совпадение; ИСТИНА, 1 или пропуск — приблизительное | ЛОЖЬ |
Пример: платежи и справочник клиентов из базы «Маяк»
Возьмём шесть платежей за 16 августа 2026 года из учебной базы «Маяк» — той же, на которой работает SQL-песочница. Лист «Платежи»: в столбце A номер платежа, в B user_id, в C сумма. В строках 2–7 платежи 901, 903, 904, 906, 908 и 911 от пользователей 60, 972, 1021, 1481, 2392 и 2727 на 19, 19, 19, 29, 39 и 19 — всего 144.
Лист «Клиенты» — справочник, выгруженный 31 июля: user_id, дата регистрации, страна, канал привлечения. Семь клиентов, отсортированы по user_id. Двух вещей в нём нет, и это не подстроено: в базе у пользователя 1021 не заполнена страна, а пользователь 2727 зарегистрировался 1 августа, уже после выгрузки.
Перед формулой убедитесь, что ключ совпадает по смыслу и по типу: одинаковый заголовок id ещё не значит, что в обеих системах это номер клиента. Здесь оба столбца — номер пользователя, и оба хранят его числом.
| Строка | A: user_id | B: signup_date | C: country | D: channel |
|---|---|---|---|---|
| 2 | 60 | 02.06.2026 | KZ | organic |
| 3 | 61 | 02.06.2026 | RU | partner |
| 4 | 972 | 29.06.2026 | AM | organic |
| 5 | 1021 | 30.06.2026 | (пусто) | referral |
| 6 | 1481 | 10.07.2026 | RU | organic |
| 7 | 1641 | 14.07.2026 | RU | referral |
| 8 | 2392 | 27.07.2026 | KZ | referral |
Формула и результат: где ВПР ответил верно, а где нет
В ячейку D2 листа «Платежи» пишем =ВПР(B2;Клиенты!$A$2:$D$8;3;ЛОЖЬ) и протягиваем до D7. Знаки $ закрепляют диапазон справочника: при протягивании меняется только ссылка на ключ — B2, B3 и дальше до B7.
Платёж 911 получил #Н/Д: пользователя 2727 в справочнике нет. Это честная ошибка — её видно и можно посчитать. Опаснее платёж 904: у пользователя 1021 страна пустая, а Excel возвращает пустую ячейку как 0. В сводной появится страна «0», которую легко принять за мусор, а не за клиента с незаполненным полем.
Чтобы отличать «не найден» от «пусто», подпишите #Н/Д через ЕСНД: =ЕСНД(ВПР(B2;Клиенты!$A$2:$D$8;3;ЛОЖЬ);"нет в справочнике"). ЕСЛИОШИБКА тоже сработает, но заодно спрячет #ССЫЛКА! от неверного номера столбца, а это ошибка самой формулы, и её нужно видеть.
| payment_id | user_id | amount | Формула в столбце D | Результат |
|---|---|---|---|---|
| 901 | 60 | 19 | =ВПР(B2;Клиенты!$A$2:$D$8;3;ЛОЖЬ) | KZ |
| 903 | 972 | 19 | =ВПР(B3;Клиенты!$A$2:$D$8;3;ЛОЖЬ) | AM |
| 904 | 1021 | 19 | =ВПР(B4;Клиенты!$A$2:$D$8;3;ЛОЖЬ) | 0 — страна в справочнике пустая |
| 906 | 1481 | 29 | =ВПР(B5;Клиенты!$A$2:$D$8;3;ЛОЖЬ) | RU |
| 908 | 2392 | 39 | =ВПР(B6;Клиенты!$A$2:$D$8;3;ЛОЖЬ) | KZ |
| 911 | 2727 | 19 | =ВПР(B7;Клиенты!$A$2:$D$8;3;ЛОЖЬ) | #Н/Д — клиента нет в справочнике |
ВПР из другого листа и другой книги
Ссылка на другой лист — это имя листа и восклицательный знак перед диапазоном: Клиенты!$A$2:$D$8. Имя с пробелом Excel берёт в апострофы. Адрес не обязательно набирать: начните формулу, выделите диапазон мышью на листе справочника, а F4 добавит знаки $.
Справочник в другой книге работает так же, в ссылке появляется имя файла в квадратных скобках. Связь хрупкая: файл переименовали или перенесли — и формула смотрит в старую копию. Для еженедельного отчёта надёжнее загрузить справочник через Power Query.
Диапазон $A$2:$D$8 сам не растёт, когда в справочник дописывают клиентов. Новый клиент в строке 9 для формулы не существует, и его платежи получат #Н/Д. Выходов два: ссылаться на целые столбцы Клиенты!$A:$D или оформить справочник как таблицу Excel (Ctrl+T) — её диапазон расширяется вместе с новыми строками.
=ВПР(B2;'Справочник клиентов'!$A$2:$D$8;3;ЛОЖЬ)Апострофы вокруг имени листа Excel ставит сам, если выделить диапазон мышью.
Интервальный просмотр: ЛОЖЬ против ИСТИНА
С ЛОЖЬ (или 0) ВПР ищет точное совпадение и, не найдя его, возвращает #Н/Д. С ИСТИНА (или 1), а также когда аргумент пропущен, функция ищет приблизительно: если точного ключа нет, берёт ближайший меньший. Справка Microsoft требует для этого режима отсортированный первый столбец и предупреждает, что без сортировки возвращаемое значение может быть непредвиденным.
Вот что это значит для нашего примера. Уберите ЛОЖЬ из формулы для платежа 911 — справочник отсортирован, формально всё по правилам. Пользователя 2727 в нём нет, но ошибки не будет: Excel найдёт ближайший меньший ключ 2392 и вернёт KZ. Ни красной ячейки, ни предупреждения: Казахстан получит лишние 19, а дыра в справочнике останется незамеченной. На несортированном справочнике приблизительный поиск может вернуть чужую строку даже для ключа, который там есть.
Приблизительный поиск нужен для шкал, а не для идентификаторов. Допустим, комиссия от 0 ₽ — 5%, от 10 000 ₽ — 4%, от 50 000 ₽ — 3% (пороги условные). Для заказа на 12 500 ₽ формула с ИСТИНА вернёт 4% — последнюю ступень, не превышающую сумму; точный поиск дал бы #Н/Д.
| Формула | Результат | Что произошло |
|---|---|---|
=ВПР(B7;Клиенты!$A$2:$D$8;3;ЛОЖЬ) | #Н/Д | ключа нет, ошибка видна |
=ВПР(B7;Клиенты!$A$2:$D$8;3) | KZ | взята строка ближайшего меньшего ключа 2392 |
=ВПР(B7;Клиенты!$A$2:$D$8;3;ИСТИНА) | KZ | то же самое: пропуск равен ИСТИНА |
=ВПР(12500;Шкала!$A$2:$B$4;2;ИСТИНА) | 4% | шкала по возрастанию порогов — правильное применение |
Ошибка #Н/Д в ВПР: ключа нет, число как текст, лишний пробел
При точном поиске #Н/Д значит одно: Excel не нашёл в первом столбце значение, равное искомому. «Равное» здесь строже, чем кажется глазу. Число 972 и текст «972» выглядят одинаково, но для ВПР это разные значения. Ключ «1481 » с пробелом в конце не равен числу 1481.
Число как текст обычно приезжает из CSV; признаки — выравнивание по левому краю и зелёный треугольник в углу ячейки. Microsoft в справке ВПР советует не хранить числа и даты как текст. Быстрое исправление — ЗНАЧЕН(B3) в формуле, надёжное — правильный тип столбца при загрузке.
С пробелами есть ловушка второго порядка. СЖПРОБЕЛЫ убирает пробелы в начале и в конце, но возвращает текст: «1481 » превращается в «1481», а не в число, и #Н/Д остаётся. Для числовых ключей нужна пара ЗНАЧЕН(СЖПРОБЕЛЫ(A6)), результат которой вставляют обратно в справочник как значения. И ещё одно: СЖПРОБЕЛЫ удаляет только обычный пробел с кодом 32. Неразрывный пробел с кодом 160, который часто приезжает со скопированных веб-страниц, она не трогает — его убирают через ПОДСТАВИТЬ(A6;СИМВОЛ(160);"").
Когда #Н/Д много, найдите один ключ в справочнике через Ctrl+F. Нашёлся — дело в типе или невидимых символах. Не нашёлся — справочник неполный, и это вопрос к источнику данных.
| Что в ячейках | Формула | Результат | Исправление |
|---|---|---|---|
| Клиента 2727 нет в справочнике | =ВПР(B7;…;3;ЛОЖЬ) | #Н/Д | обновить справочник; до тех пор — ЕСНД(…;"нет в справочнике") |
| В B3 текст «972», в справочнике число 972 | =ВПР(B3;…;3;ЛОЖЬ) | #Н/Д | =ВПР(ЗНАЧЕН(B3);…;3;ЛОЖЬ) → AM |
| В справочнике A6 = «1481 » с пробелом | =ВПР(B5;…;3;ЛОЖЬ) | #Н/Д | ключ ЗНАЧЕН(СЖПРОБЕЛЫ(A6)) → RU |
| То же, ключ очищен только СЖПРОБЕЛЫ | =ВПР(B5;…;3;ЛОЖЬ) | #Н/Д | СЖПРОБЕЛЫ вернула текст «1481», нужен ещё ЗНАЧЕН |
Дубли ключа: ВПР берёт первое совпадение
Справочники копятся годами: клиента заводят повторно, новую выгрузку вставляют под старой. Допустим (учебная вставка), в строку 9 листа «Клиенты» дописали пользователя 1481 со страной BY — клиент переехал, старую строку не удалили. ВПР идёт сверху вниз, останавливается на строке 6, и платёж 906 остаётся в России.
О втором совпадении ВПР не сообщает. SQL-соединение размножило бы платёж, и сумма выросла бы; здесь меняется только подпись. Дубли стоит искать до формулы: СЧЁТЕСЛИ(Клиенты!$A:$A;B5) в соседнем столбце покажет, сколько раз ключ встречается в справочнике. Всё, что больше 1, требует решения, какая из строк правильная.
Если для ваших данных верно правило «последняя запись актуальна», ПРОСМОТРX найдёт её: шестой аргумент -1 включает поиск снизу вверх. Но правильнее держать в справочнике одну строку на ключ и проверять это при обновлении.
| Формула | Результат | Что это значит |
|---|---|---|
=ВПР(B5;Клиенты!$A$2:$D$9;3;ЛОЖЬ) | RU | первое совпадение сверху, строка 6 |
=ПРОСМОТРX(B5;Клиенты!$A$2:$A$9;Клиенты!$C$2:$C$9;"нет";0;-1) | BY | поиск с последней строки |
=СЧЁТЕСЛИ(Клиенты!$A:$A;B5) | 2 | ключ встречается в справочнике дважды |
Вставили столбец — ВПР вернул не тот
Номер столбца в ВПР — число, а не ссылка. Вставьте между датой регистрации и страной столбец с месяцем регистрации: Excel расширит диапазон до $A$2:$E$8, но тройка останется тройкой, и вместо стран в отчёт поедут «2026-06» и «2026-07». Ошибки нет, формула выглядит как вчера.
Защита — вычислять номер столбца по заголовку: ПОИСКПОЗ("country";Клиенты!$A$1:$E$1;0) вернёт 4 после вставки и 3 до неё. Ещё проще перейти на ПРОСМОТРX или ИНДЕКС+ПОИСКПОЗ: они ссылаются на сам столбец результата, а такая ссылка при вставке сдвигается вместе со столбцом.
Удаление столбца заметнее, но не всегда. Если номер станет больше ширины диапазона, вы увидите #ССЫЛКА!. Если столбцов останется достаточно, формула молча вернёт соседний.
| Формула | Результат |
|---|---|
=ВПР(B2;Клиенты!$A$2:$E$8;3;ЛОЖЬ) | 2026-06 — месяц вместо страны |
=ВПР(B2;Клиенты!$A$2:$E$8;ПОИСКПОЗ("country";Клиенты!$A$1:$E$1;0);ЛОЖЬ) | KZ |
=ИНДЕКС(Клиенты!$D$2:$D$8;ПОИСКПОЗ(B2;Клиенты!$A$2:$A$8;0)) | KZ — ссылка сама сдвинулась с C на D |
Абсолютные ссылки: почему формула верна в первой строке и врёт ниже
Если написать диапазон без $ — Клиенты!A2:D8 — и протянуть формулу вниз, диапазон поедет вместе с ней: в D3 это уже A3:D9, в D4 — A4:D10. Верхние строки справочника выпадают из поиска. В исходном порядке платежей это не проявляется: все найденные ключи остаются внутри сдвинутых диапазонов. Но отсортируйте платежи по убыванию суммы (908, 906, 901, 903, 904, 911) — и половина формул смотрит мимо нужного клиента.
Справка Microsoft советует абсолютные ссылки на таблицу именно ради протягивания. Клавиша F4 при курсоре на ссылке переключает её вид: A2, $A$2, A$2, $A2. Ссылку на ключ (B2) оставляйте относительной — она и должна меняться от строки к строке.
| Строка | user_id | Диапазон после протягивания | Результат | Должно быть |
|---|---|---|---|---|
| 2 | 2392 | A2:D8 | KZ | KZ |
| 3 | 1481 | A3:D9 | RU | RU |
| 4 | 60 | A4:D10 | #Н/Д | KZ |
| 5 | 972 | A5:D11 | #Н/Д | AM |
| 6 | 1021 | A6:D12 | #Н/Д | 0 (страна пустая) |
| 7 | 2727 | A7:D13 | #Н/Д | #Н/Д |
Регистр букв ВПР не различает
Для ВПР «pro» и «PRO» — одно и то же. Это мешает там, где регистр значим: в промокодах и токенах. Допустим (пример условный), в справочнике промокодов сначала идёт aB3k со скидкой 10%, а ниже Ab3K со скидкой 30%. Формула =ВПР("Ab3K";Промокоды!$A$2:$B$3;2;ЛОЖЬ) вернёт 10% — первую строку, совпавшую без учёта регистра.
ПОИСКПОЗ, по справке Microsoft, регистр тоже не различает. Нужна СОВПАД: =ИНДЕКС(Промокоды!$B$2:$B$3;ПОИСКПОЗ(ИСТИНА;СОВПАД(Промокоды!$A$2:$A$3;"Ab3K");0)) вернёт 30% (в старых версиях Excel — ввод через Ctrl+Shift+Enter). В SQL сравнение строк учитывает регистр, и соединение по таким кодам ведёт себя иначе.
ВПР, ПРОСМОТРX или ИНДЕКС+ПОИСКПОЗ: что выбрать
Справка Microsoft называет ПРОСМОТРX улучшенной версией ВПР. Столбцы поиска и результата задаются отдельно, поиск по умолчанию точный, четвёртый аргумент — текст на случай, если ничего не нашлось: =ПРОСМОТРX(B2;Клиенты!$A$2:$A$8;Клиенты!$C$2:$C$8;"нет в справочнике"). В названии функции латинская X. Она есть в Excel для Microsoft 365, Excel 2021 и 2024 (в том числе для Mac) и в мобильных версиях; в Excel 2016 и 2019 её нет. В Google Таблицах есть XLOOKUP, тоже с точным поиском по умолчанию.
ИНДЕКС+ПОИСКПОЗ работает в любой версии: =ИНДЕКС(Клиенты!$C$2:$C$8;ПОИСКПОЗ(B2;Клиенты!$A$2:$A$8;0)). ПОИСКПОЗ находит номер строки ключа, ИНДЕКС берёт значение с этим номером из столбца результата. Ноль в ПОИСКПОЗ обязателен: без него, как и у ВПР, идёт приблизительный поиск, которому нужна сортировка по возрастанию.
На чистом справочнике все три дают KZ, AM, 0, RU, KZ и #Н/Д (у ПРОСМОТРX — «нет в справочнике»). Разница — в том, как они переживают изменения справочника: для разовой сверки хватит ВПР с ЛОЖЬ, для живого справочника берите ПРОСМОТРX, а при старых версиях Excel у коллег — ИНДЕКС+ПОИСКПОЗ.
| ВПР | ПРОСМОТРX | ИНДЕКС+ПОИСКПОЗ | |
|---|---|---|---|
| Поиск по умолчанию | приблизительный, нужен ЛОЖЬ | точный | приблизительный, нужен 0 в ПОИСКПОЗ |
| Результат левее ключа | нет | да | да |
| Вставка столбца в справочник | сдвигает ответ: номер столбца — число | не ломает | не ломает |
| Ключ не найден | #Н/Д | #Н/Д или свой текст | #Н/Д |
| Ключ встречается дважды | первое совпадение сверху | первое или последнее (режим поиска -1) | первое совпадение сверху |
| Где работает | все версии Excel, Google Таблицы | Excel 365, 2021, 2024, мобильные; XLOOKUP в Google Таблицах; нет в Excel 2016 и 2019 | все версии Excel, Google Таблицы |
ВПР — это LEFT JOIN по одному ключу: то же на базе «Маяк»
Если перевести ВПР на язык баз данных, получится LEFT JOIN: левая таблица — та, где стоит формула, правая — справочник, условие соединения — равенство ключей. Все строки слева сохраняются, у ненайденных справа пусто: в SQL это NULL, в Excel — #Н/Д. Но ВПР берёт первое совпадение и не различает регистр, а SQL возвращает все совпадения и регистр учитывает.
Проверим на всей базе. В «Маяке» 1 251 платёж на 30 639. Справочником, как в примере, служат клиенты, зарегистрированные по 31 июля включительно, — 2 718 строк, ключ в них уникален. Запрос ниже — ВПР, протянутый на все платежи, и сразу сводная по результату, включая ненайденных клиентов и пустые страны. Выполнить его можно в SQL-песочнице на той же базе.
Без пары остались 256 платежей на 6 234 — 20,3% выручки: августовских клиентов справочник ещё не знает. В Excel это 256 ячеек #Н/Д, и сводная по найденным клиентам показала бы 24 405 вместо 30 639. Ещё 7 платежей на 233 нашли клиента без страны — в Excel там был бы 0.
| country | payments | revenue |
|---|---|---|
| RU | 553 | 13 817 |
| нет в справочнике | 256 | 6 234 |
| KZ | 211 | 5 009 |
| AM | 113 | 2 737 |
| BY | 111 | 2 609 |
| найден, страна пустая | 7 | 233 |
WITH clients AS (
SELECT user_id, country
FROM users
WHERE signup_date <= DATE '2026-07-31'
)
SELECT
CASE
WHEN c.user_id IS NULL THEN 'нет в справочнике'
WHEN c.country IS NULL THEN 'найден, страна пустая'
ELSE c.country
END AS country,
COUNT(*) AS payments,
SUM(p.amount) AS revenue
FROM payments AS p
LEFT JOIN clients AS c ON c.user_id = p.user_id
GROUP BY 1
ORDER BY payments DESC;Дубли в справочнике: SQL размножает строки, ВПР молчит
Повторим историю с дублем на всей базе. В запросе к справочнику добавлены две строки — это учебная вставка, в самой базе дублей нет: клиенту 320 приписана вторая страна RU (в справочнике у него KZ), клиенту 444 — AM (было RU). У каждого из них по три платежа.
Обычный LEFT JOIN возвращает каждую пару совпавших строк, поэтому шесть платежей этих клиентов удвоились: 1 257 строк вместо 1 251 и выручка 30 873 вместо 30 639, на 234 больше. Вариант «как ВПР» оставляет для ключа первую строку по порядку загрузки (row_order) и возвращает исходные 1 251 строку и 30 639. Сумма сходится, но клиенту 320 приписан KZ лишь потому, что эта строка выше.
У строк в базе нет порядка «сверху вниз», поэтому правило первого совпадения в SQL записывают явно. В Excel оно действует тоже, только его никто не выбирал. Как ловить размножение строк — в статье о JOIN без потерь и дублей.
| method | rows_after | revenue | rows_user_320 |
|---|---|---|---|
| LEFT JOIN как есть | 1 257 | 30 873 | 6 |
| первое совпадение, как ВПР | 1 251 | 30 639 | 3 |
WITH clients AS (
SELECT user_id, country, 1 AS row_order
FROM users
WHERE signup_date <= DATE '2026-07-31'
UNION ALL
-- учебная вставка: повторные строки для двух клиентов
SELECT user_id, country, row_order
FROM (VALUES (320, 'RU', 2), (444, 'AM', 2)) AS added(user_id, country, row_order)
),
first_match AS (
SELECT user_id, country
FROM (
SELECT user_id, country,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY row_order) AS rn
FROM clients
) AS ranked
WHERE rn = 1
)
SELECT 'LEFT JOIN как есть' AS method,
COUNT(*) AS rows_after,
SUM(p.amount) AS revenue,
COUNT(*) FILTER (WHERE p.user_id = 320) AS rows_user_320
FROM payments AS p
LEFT JOIN clients AS c ON c.user_id = p.user_id
UNION ALL
SELECT 'первое совпадение, как ВПР',
COUNT(*),
SUM(p.amount),
COUNT(*) FILTER (WHERE p.user_id = 320)
FROM payments AS p
LEFT JOIN first_match AS f ON f.user_id = p.user_id
ORDER BY rows_after DESC;Как проверить результат ВПР
После протягивания формулы посчитайте несколько чисел, прежде чем строить сводную. Сколько строк не нашли пару: =СУММПРОИЗВ(--ЕНД(D2:D7)). Сколько денег за ними стоит: =СУММПРОИЗВ(ЕНД(D2:D7)*C2:C7). Сколько строк получили 0 вместо значения: =СЧЁТЕСЛИ(D2:D7;0). И сколько раз каждый ключ встречается в справочнике: столбец =СЧЁТЕСЛИ(Клиенты!$A:$A;B2) с фильтром по значениям больше 1.
Затем сверьте суммы. ВПР не добавляет строк, поэтому сумма столбца C не меняется; проверять нужно, что итог сводной по странам равен общей сумме. Если #Н/Д и нули отфильтровали, итог окажется меньше. В нашем примере общая сумма 144, из них 19 приходится на #Н/Д и ещё 19 — на страну «0». Сводная только по найденным странам покажет 106, и разницу в 38 нужно объяснить, а не потерять.
В pandas аналог ВПР — merge с how="left" к справочнику без дублей. indicator=True показывает строки без пары, validate="many_to_one" останавливает расчёт при неуникальном ключе — проверка, которой ВПР не делает. Пустая страна 1021 здесь None, а не 0. Подробнее — в статье про groupby и merge.
| Проверка | Формула | Результат |
|---|---|---|
| Строк с #Н/Д | =СУММПРОИЗВ(--ЕНД(D2:D7)) | 1 |
| Сумма в строках с #Н/Д | =СУММПРОИЗВ(ЕНД(D2:D7)*C2:C7) | 19 |
| Строк с 0 вместо страны | =СЧЁТЕСЛИ(D2:D7;0) | 1 |
| Сумма всех платежей | =СУММ(C2:C7) | 144 |
| Повторы ключа в справочнике | =СЧЁТЕСЛИ(Клиенты!$A:$A;B2) по каждой строке | везде 1 или 0 |
import pandas as pd
payments = pd.DataFrame({
"payment_id": [901, 903, 904, 906, 908, 911],
"user_id": [60, 972, 1021, 1481, 2392, 2727],
"amount": [19, 19, 19, 29, 39, 19],
})
clients = pd.DataFrame({
"user_id": [60, 61, 972, 1021, 1481, 1641, 2392],
"country": ["KZ", "RU", "AM", None, "RU", "RU", "KZ"],
})
# ВПР с ЛОЖЬ: первое совпадение сверху, число строк слева не меняется
lookup = clients.drop_duplicates("user_id", keep="first")
result = payments.merge(lookup, on="user_id", how="left",
validate="many_to_one", indicator=True)
print(result[["payment_id", "user_id", "country", "_merge"]].to_string(index=False))
print("нет в справочнике:", (result["_merge"] == "left_only").sum())
print("найден, страна пустая:",
(result["country"].isna() & (result["_merge"] == "both")).sum())
print("сумма до и после:", payments["amount"].sum(), result["amount"].sum())
# дубль ключа: merge без проверки размножит платёж, validate остановит расчёт
clients_dup = pd.concat(
[clients, pd.DataFrame({"user_id": [1481], "country": ["BY"]})],
ignore_index=True,
)
print("строк после merge с дублем:",
len(payments.merge(clients_dup, on="user_id", how="left")))
try:
payments.merge(clients_dup, on="user_id", how="left", validate="many_to_one")
except pd.errors.MergeError as error:
print("MergeError:", error)Частые вопросы
Почему ВПР выдаёт #Н/Д, хотя значение есть?
Почти всегда ключи различаются типом или невидимыми символами. Проверьте ячейку функциями ЕТЕКСТ и ДЛСТР: у «1481 » длина 5, а не 4.
Как сделать ВПР из другого листа?
Укажите диапазон с именем листа и восклицательным знаком: =ВПР(B2;Клиенты!$A$2:$D$8;3;ЛОЖЬ). Если в имени листа есть пробел, имя берётся в апострофы.
Можно ли вернуть сразу несколько столбцов?
ВПР возвращает один столбец на формулу. ПРОСМОТРX вернёт несколько, если указать в возвращаемом массиве соседние столбцы.
Чем заменить ВПР, если нет ПРОСМОТРX?
Связкой ИНДЕКС и ПОИСКПОЗ с нулём в третьем аргументе ПОИСКПОЗ: она есть во всех версиях и переживает вставку столбцов.
Итог
ВПР — это LEFT JOIN по одному ключу с тремя молчаливыми правилами: первое совпадение сверху, пустая ячейка как 0 и приблизительный поиск, если не написать ЛОЖЬ. Пишите ЛОЖЬ, закрепляйте диапазон $, проверяйте дубли ключа и считайте #Н/Д с суммой за ними до построения отчёта. Для живого справочника берите ПРОСМОТРX или ИНДЕКС+ПОИСКПОЗ.
Дальше результат обычно идёт в сводную таблицу и дашборд в Excel — сверяйте итог на каждом шаге. Формулу подскажет и нейросеть, но проверки остаются за вами. Когда справочников много и они обновляются ежедневно, соединяйте таблицы запросом: начните с LEFT JOIN в SQL.
Материалы по теме

Нейросеть для Excel: формулы, сводные таблицы и проверка
Нейросеть для Excel и Google Таблиц: формулы ВПР и СУММЕСЛИМН, сводные таблицы, Power Query. Какие инструменты есть в 2026 году, где ИИ ошибается и как проверить формулу.

Сводные таблицы в Excel: как сделать и что анализировать
Создаём сводную таблицу на 23 496 учебных бронированиях: поля, суммы и доли, группировка дат, срезы, обновление и проверка ошибок.

Как загружать Excel, JSON и Parquet в pandas
Практический разбор источников в pandas: прочитать Excel и JSON, выбрать лист, сохранить типы и перейти с CSV на Parquet без сюрпризов.