*最後の*一致を返すためにVLOOKUPを取得する方法は?


11

私はVLOOKUPでの作業に慣れていますが、今回は課題があります。最初に一致する値は必要ありませんが、最後の値は必要ですどうやって?(LibreOffice Calcを使用していますが、MS Excelソリューションも同様に役立つはずです。)

その理由は、数千行の2つのテキスト列があり、1つは取引先(Amazon、Ebay、雇用者、食料品店など)のリストであり、もう1つは支出カテゴリ(賃金、税金、世帯、家賃など)。一部のトランザクションは毎回同じ支出カテゴリを持たないため、最近使用したものを取得したいと思います。リストはどちらの列でも(実際には日付で)ソートされていないことに注意してください。ソート順は変更しません。

私が持っているもの(エラー処理を除く)は、通常の「最初の一致」式です。

=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ます。

これはa のINDEX/ MATCH構築と同様に動作しますが、代わりにVLOOKUP条件がMAX使用されますMATCH

これは、テーブルが行1から始まることを前提としていることに注意してください。データが別の行から始まる場合ROW(...)は、一番上の行と1の差を差し引くことで部品を調整する必要があります。


私はそのリテラル「c」について混乱しています-評価は常に偽であると思いますが、それは実際に何をしますか?
トーベンGundtofte・ブルーン

私はあなたの提案をテストしました(そして、それが配列式として受け入れられたことを確認しました)。列Aが受取人で、Bがカテゴリであると仮定しますか 残念ながら、LibreOfficeは「ERR:502」を返し、これは「無効な引数:関数の引数は無効です。たとえば、SQRT()関数の負の数、これにはIMSQRT()を使用してください」に変換します。LibreOfficeにその名前の関数がすべて存在することを確認しましたが、LibreOfficeがIF配列を処理できないのではないかと思います。
トーベンGundtofte・ブルーン

申し訳ありませんが、文字通りの「c」は、一致させたいお支払い受取人の名前です。それは、私が遊んでいたサンプルデータの遺物でした。シート内のセル参照に置き換えられると思います。
Excellll 14

@ TorbenGundtofte-Bruun Careは、使用している数式を共有しますか?私はそれを見ることができればそれを解決できるかもしれません。また、式のEvaluate Formulaどの部分でエラーが発生しているかを確認するために、いつでも式をステップスルーすることができます。この機能はExcelに存在しますが、LibreOffice Calcに同じ機能がない場合は驚くでしょう。
Excellll 14

私の元の式は簡単です。だからそれは適切=VLOOKUP(J1061;$J$2:$K$9999;2;0)ではありません:-) col Jには受取人が含まれ、col Kにはカテゴリが含まれます。予想どおり最初の一致を返します。
トーベンGundtofte・ブルーン

2

(ソートされたデータに関する個別の質問ではないことをここに答えます。)

データが場合して並べ替え、あなたは使用することができVLOOKUPrange_lookup、引数TRUE(それがデフォルトだからか、省略、)、正式に「近似一致の検索」としてエクセルで説明されています。

つまり、ソートされたデータの場合:

  • 最後の引数を設定しFALSE最初の値を返す
  • 最後の引数を設定してTRUE最後の値を返します。

これはほとんど文書化されておらず、あいまいですが、VisiCalc(1979)にまでさかのぼり、今日は少なくともMicrosoft Excel、LibreOffice Calc、およびGoogle Sheetsで保持されています。最終的には、4番目のパラメーターがなかっLOOKUPたVisiCalcの初期実装(およびthence VLOOKUPおよびHLOOKUP)が原因です。値は、包括的左境界と排他的右境界(一般的でエレガントな実装)を使用したバイナリ検索で検出され、この動作が発生します。

厳密には、これは候補区間[0, n)で検索を開始することを意味します。ここでnは配列の長さであり、ループ不変条件は次のとおりですA[imin] <= key && key < A[imax](左境界は<=ターゲット、右境界は終了後に開始され、 >ターゲットは、検証するために、どちらかの前に、エンドポイントでの値を確認するか、チェック結果の後)、および連続的にどちら側のジャム、この不変を二分し、選択:片側は排除によりだろう、あなたは、1期との間隔に到達するまで[k, k+1)、およびアルゴリズムはを返しますk。これは完全に一致する必要はありません(!)。下からの最も近い一致です。重複する一致の場合、次の値を大きくする必要があるため、これにより最後の一致が返されますキー(または配列の最後)よりも 重複する場合、何らかの動作が必要であり、これは合理的で簡単に実装できます。

この動作は、Microsoft Knowledge Baseの古い記事(強調を追加)に明示的に記載されています。「XL:配列の最初または最後の一致を返す方法」(Q214069):

LOOKUP()関数を使用して、ソートされたデータの配列内の値を検索し、別の配列内のその位置に含まれる対応する値を返すことができます。ルックアップ値が配列内で繰り返される場合、最後に見つかった一致を返します。この動作は、VLOOKUP()、HLOOKUP()、およびLOOKUP()関数に当てはまります。

一部のスプレッドシートの公式ドキュメントは次のとおりです。どちらにも「最後の一致」の動作は記載されていませんが、Googleスプレッドシートのドキュメントには暗示されています:

  • マイクロソフトエクセル

    TRUEは、表の最初の列が数値またはアルファベット順にソートされていると仮定し、最も近い値を検索します

  • Googleスプレッドシート

    場合がis_sortedあるTRUEか、省略、最も近い一致以下、検索キーに)が返されます


その最も近い試合は私を夢中にさせました!
dukedave

1

検索配列の値が連続している場合(つまり、最新の日付などの最大値を探している場合)、INDIRECT関数を使用する必要さえありません。この簡単なコードを試してください:

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

もう一度、CTRL + SHIFT + ENTERを使用して数式を入力します


0

私は、最も頻繁に価値を評価しました。libreOfficeで動作するかどうかはわかりませんが、Excelで動作するようです

= INDEX($ B $ 2:$ B $ 9、MATCH(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はフィルタリングの対象となる受取人です。上記の関数に余分な改行が含まれている理由がわかりません。

最後のセルを見つけるための私の機能は次のとおりです。

= INDIRECT( "B"&MAX(-($ A $ 2:$ A $ 9 = D2)* ROW($ A $ 2:$ A $ 9)))

Indirectを使用すると、返す列を指定して、行を直接見つけることができます(したがって、ヘッダー行の数を減算する必要はありません。

これらの機能は両方とも、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]) :ブール行列TRUE / FALSE

IF(([payee range] = [search value]);1;"") :擬似ブール行列1 / ""

=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range]):常に最後の1位置に戻る


LOOKUPソートされたリストでのみ機能します。比較の出力では、1ソートされていない方法でsとスペースのリストが作成されるため、正しい結果が得られません。
マテジュハス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.