Я привык работать с VLOOKUP, но на этот раз у меня есть проблема. Я не хочу первое соответствующее значение, но последнее. Как? (Я работаю с LibreOffice Calc, но решение MS Excel должно быть одинаково полезным.)
Причина в том, что у меня есть два текстовых столбца с тысячами строк, скажем, один - это список получателей транзакций (Amazon, Ebay, работодатель, продуктовый магазин и т. Д.), А другой - список категорий расходов (заработная плата, налоги, домашнее хозяйство, аренда и др.). Некоторые транзакции не всегда имеют одну и ту же категорию расходов, и я хочу получить самую последнюю использованную. Обратите внимание, что список отсортирован ни по одному столбцу (фактически по дате), и я не хочу менять порядок сортировки.
То, что у меня есть (исключая обработку ошибок), это обычная формула «первое совпадение»:
=VLOOKUP(
[payee field] , [payee+category range] , [index of category column] ,
0 )
Я видел такие решения , но я получаю #DIV/0!
ошибки:
=LOOKUP(2 , 1/( [payee range] = [search value] ) , [category range] )
Решением может быть любая формула, не обязательно VLOOKUP. Я также могу поменять местами столбцы получателя / категории. Просто не меняйте колонку сортировки, пожалуйста.
Бонусные баллы за решение, которое выбирает наиболее частое значение, а не последнее!
источник
IF
может ли LibreOffice обрабатывать массивы.Evaluate Formula
чтобы увидеть, какая часть формулы вызывает ошибку. Эта функция существует в Excel, и я был бы удивлен, если бы LibreOffice Calc не имел этой функции.=VLOOKUP(J1061;$J$2:$K$9999;2;0)
где col J содержит получателей, а col K категории. Возвращает первое совпадение, как и ожидалось.(Ответ здесь как отдельный вопрос для отсортированных данных.)
Если бы данные были отсортированы, вы могли бы использовать
VLOOKUP
сrange_lookup
аргументомTRUE
(или опустить, так как это по умолчанию), который официально описан для Excel как «поиск приблизительного соответствия».Другими словами, для отсортированных данных:
FALSE
возврата первого значения иTRUE
возвращает последнее значение.Это в значительной степени недокументировано и неясно, но относится к VisiCalc (1979), и на сегодняшний день действует по крайней мере в Microsoft Excel, LibreOffice Calc и Google Sheets. В конечном счете, это связано с первоначальной реализацией
LOOKUP
в VisiCalc (а затемVLOOKUP
иHLOOKUP
), когда четвертого параметра не было. Значение определяется двоичным поиском с использованием включающей левой границы и исключительной правой границы (распространенная и элегантная реализация), что приводит к такому поведению.Технически это означает, что поиск начинается с интервала-кандидата
[0, n)
, гдеn
есть длина массива, а условие инварианта цикла состоит в том, чтоA[imin] <= key && key < A[imax]
(левая граница <= цель, правая граница, которая начинается одна после конца, равна > цель; для проверки либо проверять значения в конечных точках до, либо проверять результат после) и последовательно разбивать и выбирать любую сторону, сохраняющую этот инвариант: путем исключения одна сторона будет, пока вы не доберетесь до интервала с 1 членом[k, k+1)
, и алгоритм затем возвращаетk
. Это не должно быть точное совпадение (!): Это просто самое близкое совпадение снизу. В случае дублирующих совпадений это приводит к возвращению последнего совпадения, так как требует, чтобы следующее значение было большечем ключ (или конец массива). В случае дубликатов вам нужно некоторое поведение, и это разумно и легко реализовать.Это поведение явно указано в этой старой статье базы знаний Майкрософт (выделение добавлено): «XL: Как вернуть первое или последнее совпадение в массиве» ( Q214069 ):
Официальная документация для некоторых таблиц приведена ниже; ни в одном из них не указано поведение «последнее совпадение», но оно подразумевается в документации Google Sheets:
Майкрософт Эксель
Google Sheets :
источник
Если значения в массиве поиска являются последовательными (т. Е. Вы ищете наибольшее значение, например, самую последнюю дату), вам даже не нужно использовать функцию INDIRECT. Попробуйте этот простой код:
Снова введите формулу, нажав CTRL + SHIFT + ВВОД.
источник
У меня была попытка в наиболее частом значении. Не уверен, что это будет работать в libreOffice, но, похоже, работает в Excel
Столбец A будет получателем, столбец B будет категорией, D2 - получатель, по которому вы хотите фильтровать. Я не уверен, почему он добавляет дополнительные разрывы строк в функцию выше.
Моя функция найти последнюю ячейку будет выглядеть следующим образом:
Косвенный позволяет мне указать столбец, который я хочу вернуть, и найти строку напрямую (поэтому мне не нужно вычитать количество строк заголовка.
Обе эти функции должны быть введены с помощью Ctrl + Shift + Enter
источник
Это даст вам последнее значение
Получу ли я бонусные баллы за опоздание на 3 года?
источник
Вы получили
#DIV/0!
ошибки, потому что вы должны написать свою формулу, например:это будет работать и найдет последний матч.
([payee range] = [search value])
: булева матрица ИСТИНА / ЛОЖЬIF(([payee range] = [search value]);1;"")
: псевдобулева матрица 1 / ""=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range])
: всегда возвращать последнюю1
позициюисточник
LOOKUP
работает только с отсортированным списком, вывод вашей комбинации приведет к несортировке списка1
s и пробелов, поэтому он не даст правильного результата.