Приблизительное совпадение в excel
Чтобы поисковые функции Excel: ВПР, ГПР и ПОИСКПОЗ выполняли точный поиск с точным совпадением искомого и проверяемого значения ячеек или возвращали ошибку, в последнем третьем их аргументе должно быть указано – ЛОЖЬ или 0. При этом независимо отсортирован ли просматриваемый список значений или нет.
Формула приблизительного поиска неточных совпадений в Excel
Поисковые функции Excel предназначенные для выборки значений из таблиц позволяют находить данные также если необходимо найти приблизительное значение. Но только в сортированных списках значений таблицы по возрастанию.
Ниже на рисунке проиллюстрировано метод расчета суммы налога. Таблица процентных ставок налога не содержит всевозможные варианты, а только некоторые определенные их границы пределов. Сначала необходимо определить, в котором диапазоне границ налоговой ставки будет находится зарплата того или иного сотрудника. А далее следует использовать полученную информацию из найденного наиболее близкого значения для налоговых расчетов:
Формула использует три функции ВПР для считывания 3-х значений с таблицы. В последнем аргументе каждой функции находится логическое значение ИСТИНА. Это значит, что необходимо найти приблизительное значение, а необязательно точное совпадение.
Чтобы любая поисковая функция выборки в Excel: ВПР, ГПР либо ПОИСКПОЗ со значением ИСТИНА в третьем аргументе возвращала правильный результат вычисления, данные в просматриваемом столбце (в данном примере это диапазон ячеек B2:B9) должны быть отсортированы по возрастанию. Функция ВПР поочередно проверяет все значения и закончит поиск, если следующее значение будет больше чем искомое. После чего поиск прекращается. Вот почему нужно сортировать исходный диапазон по возрастанию. Таким способом найдено наибольшее значение, которое одновременно с тем меньше чем искомое.
Внимание! Поиск приблизительного соответствия значений с помощью поисковых функций Excel не предоставляют возможность находить максимально приближенное значение. Возвращается лишь только наибольшее число, которое является меньшим от искомого. Даже если очередное проверяемое значение является максимально приблизительным к искомому значению.
Внимание! Если данные в просматриваемом функцией столбце не отсортированы по возрастанию, поисковая функция при выборке вернет не ошибку, а только лишь ошибочный результат (что еще хуже ошибки)! Функции, предназначенные для приблизительного поиска соответствий, используют в своих алгоритмах бинарный метод. Согласно этому алгоритму поиск начинается от середины столбца, а в процессе происходит проверка находится ли искомое значение в верхней или нижней части. Когда определена более подходящая часть столбца, она снова делится на половину и снова проверяется от своей середины. Данный процесс повторяется пока не будет найден результат.
Поэтому бинарный поиск по неотсортированным диапазонам значений с большой вероятностью может привести к тому, что поисковая функция выберет неправильную половину просматриваемого столбца и возвратит ошибочное значение (при этом без кода ошибки).
В выше приведенном примере функция ВПР закончит поиск на второй строке просматриваемого столбца так как число 1023 является наибольшим числом, которое меньше от искомого числа 2003,89. Условно формулу можно разделить на 3, которые последовательно выполняют следующие операции:
- Первая функция ВПР возвращает базовую налоговую ставку с третьего столбца таблицы, то есть число 69,80.
- Следующая функция ВПР ищет тоже самое приблизительное значение для числа 2003,89, но уже по первому столбцу «Зарплата от». После чего найденное приближенное значение вычитаемое от искомого.
- Третья функция ВПР возвращает процентную ставку с четвертого столбца таблицы. Полученная ставка умножается на чистую зарплату netto – после всех вычетов, а результат прибавляется к базовой ставке.
Когда все функции ВПР возвратят свои результаты, выполняются следующие арифметические вычисления с числами:
Поиск данных с приблизительным совпадением выполняется существенно быстрее чем при точном поиске. При точном совпадении поисковая функция должна проверять по очереди содержимое каждой ячейки в просматриваемом столбце. Если вы уверенны что исходные данные просматриваемого столбца отсортированы по возрастанию, можно ускорить точный поиск указав в третьем аргументе поисковой функции значение ИСТИНА. В случаи приблизительного совпадения значений, всегда будет найдено точное значение с точным совпадением с искомым. Главное, чтобы оно действительно фактически присутствовало в списке значений, а сам список было отсортирован по возрастанию.
Пример формулы для приблизительного поиска ИНДЕКС и ПОИСКПОЗ в Excel
Любые поисковые функции для выборки можно заменить формулой из комбинации функций ИНДЕКС и ПОИСКПОЗ. Последний аргумент функции ПОИСКПОЗ позволяет переключатся между приблизительными и точным поиском, подобно как в функциях ВПР и ГПР. Но отличительным преимуществом функции ПОИСКПОЗ является возможность выполнять поиск с приблизительным совпадением при отсортированных значениях по убыванию.
Ниже на рисунке приведена та же таблица с налоговыми ставками, но отсортирована по убыванию. Новая формула в ячейке … использует формулу функций ИНДЕКС и ПОИСКПОЗ возвращает правильный результат:
В тоже время новая формула в ячейке D17 возвращает правильный итоговый результат вычислений.
В отличии от других поисковых функций последним аргументом функции ПОИСКПОЗ может быть и отрицательное число, а точнее одно из трех вариантов: -1, 0, 1:
- Отрицательное значение -1 используется в случаях работы с данными отсортированными по убыванию. Функция возвращает из просматриваемого столбца наименьшее значение, которое является большим по отношению к искомому. Нельзя использовать отрицательную единицу с минусом (-1) в третьем аргументе для поисковых функций выборки данных ВПР и ГПР. Там нет соответственного режима работы функции.
- Значение 0 используется для обработки неотсортированных списков данных, с целью поиска точного совпадения значений с искомым. Поведение функции ПОИСКПОЗ с нулевым значением в третьем аргументе (0) – соответствует поведению функций ВПР и ГПР с тратим аргументом равному ЛОЖЬ или 0.
- Значение 1 применяется к спискам данных отсортированных по возрастанию. В таком случае функция возвращает из просматриваемого столбца наибольшее значение, которое меньше от искомого. Положительное число 1 в третьем аргументе функции ПОИСКПОЗ работает аналогично как ИСТИНА или 1 для функций ВПР и ГПР в этом же аргументе.
Так как функция ПОИСКПОЗ с последним аргументом равным отрицательному число -1 ищет значение больше чем искомое к возвращаемому результату следует добавить число +1, чтобы получить правильный номер строки для функции ИНДЕКС.
Функция ПОИСКПОЗ в Excel используется для поиска точного совпадения или ближайшего (меньшего или большего заданному в зависимости от типа сопоставления, указанного в качестве аргумента) значения заданному в массиве или диапазоне ячеек и возвращает номер позиции найденного элемента.
Примеры использования функции ПОИСКПОЗ в Excel
Например, имеем последовательный ряд чисел от 1 до 10, записанных в ячейках B1:B10. Функция =ПОИСКПОЗ(3;B1:B10;0) вернет число 3, поскольку искомое значение находится в ячейке B3, которая является третьей от точки отсчета (ячейки B1).
Данная функция удобна для использования в случаях, когда требуется вернуть не само значение, содержащееся в искомой ячейке, а ее координату относительно рассматриваемого диапазона. В случае использования для констант массивов, которые могут быть представлены как массивы элементов «ключ» - «значение», функция ПОИСКПОЗ возвращает значение ключа, который явно не указан.
Например, массив содержит элементы, которые можно представить как: 1 – «виноград», 2 – «яблоко», 3 – «груша», 4 – «слива», где 1, 2, 3, 4 – ключи, а названия фруктов – значения. Тогда функция =ПОИСКПОЗ("яблоко";;0) вернет значение 2, являющееся ключом второго элемента. Отсчет выполняется не с 0 (нуля), как это реализовано во многих языках программирования при работе с массивами, а с 1.
Функция ПОИСКПОЗ редко используется самостоятельно. Ее целесообразно применять в связке с другими функциями, например, ИНДЕКС.
Формула для поиска неточного совпадения текста в Excel
Пример 1. Найти позицию первого частичного совпадения строки в диапазоне ячеек, хранящих текстовые значения.
Вид исходной таблицы данных:
Для нахождения позиции текстовой строки в таблице используем следующую формулу:
- D2&"*" – искомое значение, состоящее и фамилии, указанной в ячейке B2, и любого количества других символов (“*”);
- B:B – ссылка на столбец B:B, в котором выполняется поиск;
- 0 – поиск точного совпадения.
Из полученного значения вычитается единица для совпадения результата с id записи в таблице.
Сравнение двух таблиц в Excel на наличие несовпадений значений
Пример 2. В Excel хранятся две таблицы, которые на первый взгляд кажутся одинаковыми. Было решено сравнить по одному однотипному столбцу этих таблиц на наличие несовпадений. Реализовать способ сравнения двух диапазонов ячеек.
Вид таблицы данных:
Для сравнения значений, находящихся в столбце B:B со значениями из столбца A:A используем следующую формулу массива (CTRL+SHIFT+ENTER):
Чтобы вычислить остальные значения «протянем» формулу из ячейки C2 вниз для использования функции автозаполнения. В результате получим:
Как видно, третьи элементы списков не совпадают.
Поиск ближайшего большего знания в диапазоне чисел Excel
Пример 3. Найти ближайшее меньшее числу 22 в диапазоне чисел, хранящихся в столбце таблицы Excel.
Вид исходной таблицы данных:
Для поиска ближайшего большего значения заданному во всем столбце A:A (числовой ряд может пополняться новыми значениями) используем формулу массива (CTRL+SHIFT+ENTER):
Функция ПОИСКПОЗ возвращает позицию элемента в столбце A:A, имеющего максимальное значение среди чисел, которые больше числа, указанного в ячейке B2. Функция ИНДЕКС возвращает значение, хранящееся в найденной ячейке.
Для поиска ближайшего меньшего значения достаточно лишь немного изменить данную формулу и ее следует также ввести как массив (CTRL+SHIFT+ENTER):
Имеем два списка. И в том и в другом примерно одни и те же элементы, но записаны они могут быть немного по-разному. Задача - подобрать к каждому элементу в первом списке максимально похожий элемент из второго списка, т.е. реализовать поиск ближайшего максимально похожего текста.
Большой вопрос, в данном случае, что считать критерием "похожести". Просто количество совпадающих символов? Или количество идущих подряд совпадений? Учитывать ли регистр символов или пробелы? Различные положения слов во фразе? Вариантов много и однозначного решения нет - для каждой ситуации тот или иной будет предпочтительнее остальных.
Если следовать принципу Оккама и не усложнять без надобности, то с помощью небольшой макрофункции на VBA можно реализовать самый очевидный вариант - поиск по максимальному количеству совпадений символов. Он не идеален, но для большинства ситуаций работает вполне надежно:
Чтобы добавить такую пользовательскую функцию, сначала войдем в редактор Visual Basic (вкладка Разработчик - Visual Basic или Alt+F11) и добавим туда новый модуль через меню Insert - Module. Затем в получившийся пустой модуль надо скопировать вот такой код нашей функции:
Теперь можно закрыть редактор и вернуться в Excel. В мастере функций на вкладке Формулы - Вставить функцию (Formulas - Insert Function) в категории Пользовательские (User defined) появится наша новая функция FuzzyLookup, которую можно использовать со следующими аргументами:
=FuzzyLookup( текст_который_ищем ; диапазон_поиска )
Т.е. в показанном выше примере в ячейку B2 надо ввести
=FuzzyLookup(A2;$D$2:$D$22)
и скопировать формулу на весь столбец.
Обратите внимание, что наша функция не чувствительна к регистру и положению отдельных букв в слове.
Область применения такой функции может быть самой широкой: от автоматического исправления кривых рук оператора, вводящего данные до сравнения списков с разными вариантами написания одной и той же информации.
Одна из самых неприятных ситуаций, с которой может столкнуться пользователь при работе в Microsoft Excel - это поиск и подстановка данных с неточным совпадением. Когда вам надо подставить данные из одной таблицы в другую, но вы при этом уверены, что в обеих таблицах совпадающие элементы называются одинаково, то проблем нет - к вашим услугам множество способов: функции ВПР и её аналоги, надстройка Power Query и т.д.
А вот если в одной таблице "Пупкин Василий", а в другой просто "Пупкин", или "Пупкин В.", или даже "Пупкен", то все эти красивые способы не работают. Причем на практике такое встречается постоянно, особенно с почтовыми адресами или названиями компаний:
Обратите внимание на различные типы несоответствий, которые могут встречаться:
- переставлены местами улица, город, дом
- отсутствует какая-то часть адреса или, наоборот, есть что-то лишнее (индекс, номер квартиры)
- по-разному записан город (с буквой "г." или без) или улица
- опечатки и ошибки (Козань вместо Казань)
Про точное соответствие или даже поиск по маске тут говорить не приходится. Помочь в таком случае могут только специальные макросы или надстройки для Excel. Про одну из таких макро-функций на VBA я уже писал, а здесь хочется рассказать про еще один вариант решения подобной задачи - надстройку Fuzzy Lookup от компании Microsoft.
Эта надстройка существует с 2011 года и совершенно бесплатно скачивается с сайта Microsoft. Системные требования: Windows 7 или новее, Office 2007 или новее, соответственно. После установки у вас в Excel появляется одноименная вкладка с единственной кнопкой на ней:
Нажатие на эту кнопку включает специальную панель в правой части окна Excel, где и задаются все настройки поиска:
Сразу хочу отметить, что эта надстройка умеет работать только с умными таблицами, поэтому все исходные таблицы нужно конвертировать в умные с помощью сочетания Ctrl + T или кнопки Форматировать как таблицу на вкладке Главная (Home - Format as Table) :
Алгоритм действий при работе с надстройкой Fuzzy Lookup следующий:
После анализа мы получаем таблицу, где каждому элементу ключевого столбца из первой таблицы подобрано максимально похожее значение из второй:
Нюансы и подводные камни
- Точность подбора можно регулировать с помощью ползунка Similarity Threshold в нижней части панели Fuzzy Lookup. Чем правее его положение, тем строже будет поиск, и - как следствие - тем меньше результатов надстройка будет находить. Если сдвинуть его влево, то результатов станет больше, но возрастет риск ошибочного совпадения. Тут все зависит от вашей конкретной ситуации - экспериментируйте.
- На больших таблицах поиск может занимать приличное количество времени (до нескольких десятков секунд), хотя многое, конечно, зависит от мощности вашего компьютера. Как вариант, для ускорения в настройках (кнопка Configure в нижней части панели) можно попробовать включить параметр UseApproximateIndexing в разделе Global Settings.
- Перед нажатием на кнопку Goне забудьте выделить пустую ячейку, начиная с которой вы хотите вывести результаты. Если случайно вы оставите активную ячейку где-нибудь в исходных данных, то надстройка выведет итоговую таблицу прямо поверх них, и вы их потеряете. Причем отмена последнего действия будет невозможна, а кнопка Undo в нижней части панели не всегда срабатывает почему-то.
- Для вывода столбца с коэффициентом подобия FuzzyLookup.Similarity необходимо, чтобы у вашего Excel была точка в качестве десятичного разделителя (целой и дробной части). Если это не так, то эту настройку временно можно поменять через Файл - Параметры - Дополнительно (File - Options - Advanced) .
- Fuzzy Lookup - это не обычная надстройка, написанная на VBA (как мой PLEX, например), а COM-надстройка. Разница в том, что она устанавливается как отдельная программа, т.е. вам нужны соответствующие права на установку ПО на вашем компьютере. Дома, ясное дело, проблем не будет, а вот многим корпоративным пользователям, скорее всего, придется обращаться к вашим айтишникам. После установки отключать и подключать ее в дальнейшем можно на вкладке Разработчик - Надстройки COM (Developer - COM Add-ins) .
В любом случае, при всех имеющихся минусах, эта надстройка однозначно стоит того, чтобы находиться в арсенале любого продвинутого пользователя Microsoft Excel.
Тема сравнения двух списков поднималась уже неоднократно и с разных сторон, но остается одной из самых актуальных везде и всегда. Давайте рассмотрим один из ее аспектов - подсчет количества и вывод совпадающих значений в двух списках. Предположим, что у нас есть два диапазона данных, которые мы хотим сравнить:
Для удобства, можно дать им имена, чтобы потом использовать их в формулах и ссылках. Для этого нужно выделить ячейки с элементами списка и на вкладке Формулы нажать кнопку Менеджер Имен - Создать (Formulas - Name Manager - Create) . Также можно превратить таблицы в "умные" с помощью сочетания клавиш Ctrl + T или кнопки Форматировать как таблицу на вкладке Главная (Home - Format as Table) .
Подсчет количества совпадений
Для подсчета количества совпадений в двух списках можно использовать следующую элегантную формулу:
В английской версии это будет =SUMPRODUCT(COUNTIF(Список1;Список2))
Давайте разберем ее поподробнее, ибо в ней скрыто пару неочевидных фишек.
Во-первых, функция СЧЁТЕСЛИ (COUNTIF) . Обычно она подсчитывает количество искомых значений в диапазоне ячеек и используется в следующей конфигурации:
=СЧЁТЕСЛИ( Где_искать ; Что_искать )
Обычно первый аргумент - это диапазон, а второй - ячейка, значение или условие (одно!), совпадения с которым мы ищем в диапазоне. В нашей же формуле второй аргумент - тоже диапазон. На практике это означает, что мы заставляем Excel перебирать по очереди все ячейки из второго списка и подсчитывать количество вхождений каждого из них в первый список. По сути, это равносильно целому столбцу дополнительных вычислений, свернутому в одну формулу:
Во-вторых, функция СУММПРОИЗВ (SUMPRODUCT) здесь выполняет две функции - суммирует вычисленные СЧЁТЕСЛИ совпадения и заодно превращает нашу формулу в формулу массива без необходимости нажимать сочетание клавиш Ctrl + Shift + Enter . Формула массива необходима, чтобы функция СЧЁТЕСЛИ в режиме с двумя аргументами-диапазонами корректно отработала свою задачу.
Вывод списка совпадений формулой массива
Если нужно не просто подсчитать количество совпадений, но и вывести совпадающие элементы отдельным списком, то потребуется не самая простая формула массива:
В английской версии это будет, соответственно:
Логика работы этой формулы следующая:
- фрагмент СЧЁТЕСЛИ(Список2;Список1), как и в примере до этого, ищет совпадения элементов из первого списка во втором
- фрагмент НЕ(СЧЁТЕСЛИ($E$1:E1;Список1)) проверяет, не найдено ли уже текущее совпадение выше
- и, наконец, связка функций ИНДЕКС и ПОИСКПОЗ извлекает совпадающий элемент
Вывод списка совпадений с помощью слияния запросов Power Query
На больших таблицах формула массива из предыдущего способа может весьма ощутимо тормозить, поэтому гораздо удобнее будет использовать Power Query. Это бесплатная надстройка от Microsoft, способная загружать в Excel 2010-2013 и трансформировать практически любые данные. Мощь и возможности Power Query так велики, что Microsoft включила все ее функции по умолчанию в Excel начиная с 2016 версии.
Для начала, нам необходимо загрузить наши таблицы в Power Query. Для этого выделим первый список и на вкладке Данные (в Excel 2016) или на вкладке Power Query (если она была установлена как отдельная надстройка в Excel 2010-2013) жмем кнопку Из таблицы/диапазона (From Table) :
Excel превратит нашу таблицу в "умную" и даст ей типовое имя Таблица1. После чего данные попадут в редактор запросов Power Query. Никаких преобразований с таблицей нам делать не нужно, поэтому можно смело жать в левом верхнем углу кнопку Закрыть и загрузить - Закрыть и загрузить в. (Close & Load To. ) и выбрать в появившемся окне Только создать подключение (Create only connection) :
Затем повторяем то же самое со вторым диапазоном.
И, наконец, переходим с выявлению совпадений. Для этого на вкладке Данные или на вкладке Power Query находим команду Получить данные - Объединить запросы - Объединить (Get Data - Merge Queries - Merge) :
В открывшемся окне делаем три вещи:
- выбираем наши таблицы из выпадающих списков
- выделяем столбцы, по которым идет сравнение
- выбираем Тип соединения = Внутреннее (Inner Join)
После нажатия на ОК на экране останутся только совпадающие строки:
Ненужный столбец Таблица2 можно правой кнопкой мыши удалить, а заголовок первого столбца переименовать во что-то более понятное (например Совпадения). А затем выгрузить полученную таблицу на лист, используя всё ту же команду Закрыть и загрузить (Close & Load) :
Если значения в исходных таблицах в будущем будут изменяться, то необходимо не забыть обновить результирующий список совпадений правой кнопкой мыши или сочетанием клавиш Ctrl + Alt + F5 .
Макрос для вывода списка совпадений
Само-собой, для решения задачи поиска совпадений можно воспользоваться и макросом. Для этого нажмите кнопку Visual Basic на вкладке Разработчик (Developer) . Если ее не видно, то отобразить ее можно через Файл - Параметры - Настройка ленты (File - Options - Customize Ribbon) .
В окне редактора Visual Basic нужно добавить новый пустой модуль через меню Insert - Module и затем скопировать туда код нашего макроса:
Воспользоваться добавленным макросом очень просто. Выделите, удерживая клавишу Ctrl , оба диапазона и запустите макрос кнопкой Макросы на вкладке Разработчик (Developer) или сочетанием клавиш Alt + F8 . Макрос попросит указать ячейку, начиная с которой нужно вывести список совпадений и после нажатия на ОК сделает всю работу:
Более совершенный макрос подобного типа есть, кстати, в моей надстройке PLEX для Microsoft Excel.
Читайте также: