Як змусити VLOOKUP повернути * останній * матч?


12

Я звик працювати з 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. Я також можу поміняти місцями колонки одержувача / категорії. Просто не змінюйте стовпчик сортування, будь ласка.


Бонусні бали за рішення, яке вибирає найчастіше значення, а не останнє!

Відповіді:


3

Ви можете використовувати формулу масиву, щоб отримати дані з останнього відповідного запису.

=INDEX(IF($A$1:$A$20="c",$B$1:$B$20),MAX(IF($A$1:$A$20="c",ROW($A$1:$A$20))))

Введіть формулу, використовуючи Ctrl+ Shift+ Enter.

Це працює як INDEX/ MATCHконструкція VLOOKUP, але MAXзамість цього використовується умовно MATCH.

Зауважте, що це передбачає, що таблиця починається з рядка 1. Якщо ваші дані починаються з іншого рядка, вам потрібно буде відкоригувати ROW(...)частину, віднімаючи різницю між верхнім рядком та 1.


Мене плутає буквальне "с" - я думаю, що оцінка завжди помилкова, і що вона насправді робить?
Torben Gundtofte-Bruun

Я перевірив вашу пропозицію (і перевірив, чи вона прийнята як формула масиву). Я припускаю, що Кол А - одержувач платежу, а В - категорія, правда? На жаль, LibreOffice повертає "ERR: 502", що перекладається на "Недійсний аргумент: Аргумент функції недійсний. Наприклад, від'ємне число для функції SQRT (), для цього будь ласка, використовуйте IMSQRT ()". Я перевірив, що всі функції існують з цим ім'ям у LibreOffice, але мені цікаво, чи LibreOffice не IFможе обробляти масиви.
Torben Gundtofte-Bruun

Вибачте, буквальне "с" було лише іменем одержувача платежу, якому ви хотіли відповідати. Це була реліквія з моїх зразкових даних, з якими я грав. Я припускаю, що буде замінено посиланням на клітинку у вашому аркуші.
Excellll

@ TorbenGundtofte-Bruun Care, щоб поділитися формулою, яку ви використовуєте? Я, можливо, зможу його усунути, якщо зможу побачити. Крім того, ви завжди можете спробувати перейти через формулу, Evaluate Formulaщоб побачити, яка частина формули генерує помилку. Ця функція існує в Excel, і я буду здивований, якщо у LibreOffice Calc немає тієї самої функції.
Excellll

Моя оригінальна формула є простою, тому вона недостатня :-) =VLOOKUP(J1061;$J$2:$K$9999;2;0)де col J містить одержувачів та col K категорії. Він повертає перший матч, як очікувалося.
Torben Gundtofte-Bruun

2

(Відповідаючи тут, як немає окремого запитання щодо відсортованих даних.)

Якщо дані були відсортовані, можна використовувати VLOOKUPз range_lookupаргументом TRUE(або опущено, так як це за замовчуванням), який офіційно описаний для Excel , як «пошук приблизного матчу».

Іншими словами, для відсортованих даних:

  • встановлення останнього аргументу для FALSEповернення першого значення та
  • встановлення останнього аргументу для TRUEповернення останнього значення.

Це значною мірою незадокументоване і незрозуміле, але воно датується VisiCalc (1979), і сьогодні воно є принаймні у Microsoft Excel, LibreOffice Calc та Google Sheets. Це в кінцевому рахунку пов'язане з початковою реалізацією LOOKUPVisiCalc (а звідти VLOOKUPі HLOOKUP), коли не було четвертого параметра. Значення знаходить шляхом двійкового пошуку , використовуючи включену ліву та виключну праву межу (загальна та елегантна реалізація), що призводить до такої поведінки.

Технічно це означає, що починається пошук з інтервалу-кандидата [0, n), де nдовжина масиву, а інваріантною умовою циклу є те, що A[imin] <= key && key < A[imax](ліва межа <<ціль, права межа, яка починається одна після закінчення, є > ціль; перевірити значення або перевірити значення в кінцевих точках раніше, або перевірити результат після), і послідовно ділити і вибирати ту сторону, яка зберігає цей інваріант: виключенням однієї сторони буде, поки ви не досягнете інтервалу з 1 терміном [k, k+1), і алгоритм повертається k. Це не повинно бути точно збігом (!): Це лише найближчий збіг знизу. У разі дублювання збігів це призводить до повернення останнього збігу, оскільки вимагає, щоб наступне значення було більшеніж ключ (або кінець масиву). У разі дублікатів вам потрібна певна поведінка, і це розумно і легко здійснити.

Така поведінка прямо вказана в цій старій статті бази знань Microsoft (наголос додано): "XL: Як повернути першу чи останню відповідність у масиві" ( Q214069 ):

Ви можете використовувати функцію LOOKUP () для пошуку значення в масиві відсортованих даних і повернути відповідне значення, що міститься в цій позиції, в іншому масиві. Якщо значення пошуку повторюється в масиві, воно повертає останню зустрічну відповідність . Така поведінка справедлива для функцій VLOOKUP (), HLOOKUP () та LOOKUP ().

Офіційна документація для деяких електронних таблиць слідує; в жодному з них не вказано поведінку "останньої відповідності", але це мається на увазі в документації на Google Таблиці:

  • Microsoft Excel

    TRUE передбачає, що перший стовпець у таблиці відсортований чисельно чи в алфавітному порядку, а потім буде шукати найближче значення .

  • Google Таблиці :

    Якщо is_sortedє TRUEабо пропущено, найближчий збіг ( менше або рівний пошуковому ключу) повертається


Це найближчий матч , що зводить мене з розуму!
davetapley

1

Якщо значення в масиві пошуку є послідовними (тобто ви шукаєте найбільше значення, наприклад останню дату), вам навіть не потрібно використовувати функцію INDIRECT. Спробуйте цей простий код:

=MAX(IF($A$1:$A$20="c",$B$1:$B$20,)

Знову введіть формулу, використовуючи CTRL + SHIFT + ENTER


0

У мене було найчастіше значення. Не впевнений, чи працюватиме він у libreOffice, але, здається, працює в excel

= INDEX ($ B $ 2: $ B $ 9, МАТЧ (MAX (- ($ A $ 2: $ A $ 9 = D2) * COUNTIFS ($ B $ 2: $ B $ 9, $ B $ 2: $ B $ 9, $ A $ 2 : $ A $ 9, D2)), - ($ A $ 2: $ A $ 9 = D2) * COUNTIFS ($ B $ 2: $ B $ 9, $ B $ 2: $ B $ 9, $ A $ 2: $ A $ 9, D2 ), 0))

Стовпець A буде одержувачем платежів, стовпець B - категорією, D2 - одержувачем, за яким ви хочете відфільтрувати. Я не впевнений, чому це ставить додаткові перерви у функції вище.

Моя функція пошуку останньої комірки була б така:

= Непрямий ("B" і MAX (- ($ A $ 2: $ A $ 9 = D2) * ROW ($ A $ 2: $ A $ 9)))

Непрямий дозволяє мені вказати стовпчик, який я хочу повернути, і знайти рядок безпосередньо (тому мені не потрібно віднімати кількість рядків заголовка.

Обидві ці функції потрібно ввести за допомогою Ctrl + shift + enter


0
=LOOKUP([payee field] , [payee range] , [category range])

Це отримає останнє значення

Чи отримую я бонусні бали за те, що запізнився на 3 роки?


-1

У вас виникли #DIV/0!помилки, оскільки вам слід скоріше написати формулу, наприклад:

=LOOKUP(2;IF(([payee range] = [search value]);1;"");[category range])

це спрацює і знайдемо останній матч.

([payee range] = [search value]) : булева матриця ІСТИНА / ЛІЖ

IF(([payee range] = [search value]);1;"") : псевдобулева матриця 1 / ""

=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range]): завжди повертайте останню 1позицію


LOOKUPпрацює лише за відсортованим списком, вихід вашого порівняння призведе до списку 1s і пробілів у несортивному вигляді, тому це не дасть правильного результату.
Máté Juhász
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.