vlookup を使用してテーブル内の最後の値を返すにはどうすればよいでしょうか?

vlookup を使用してテーブル内の最後の値を返すにはどうすればよいでしょうか?

たとえば、Table1 というテーブル (名前として定義しました) には、新しいデータが追加されます。vlookup を使用して、Table1 の下部にある最後のデータ ポイントの 2 番目の列の値を取得するにはどうすればよいですか?

答え1

最初の列は数値ですか、それともテキストですか? 範囲検索オプションを使用して、テーブル内のどの値よりも大きい値を検索できます。最初の列に単語が含まれている場合は、次の操作を試してください。

=VLOOKUP("ZZZZZ", Table1, 2, TRUE)

または、最初の列が 5 桁の数字の場合は、次のようにします。

=VLOOKUP("99999", Table1, 2, TRUE)

そして、これも機能するが、より遅いことに気付きました。Table1 の最初の列を Table1Col1 として定義します。

=VLOOKUP(MAX(Table1Col1), Table1, 2, TRUE)

答え2

選択している列を動的に更新する場合は、MATCH() 式を使用して col_index_num 値を入力できます。例:

=VLOOKUP("d", Table1, 2, FALSE)

2 番目の列の値を返します。一方、

=VLOOKUP("d",Table1[#All],MATCH("value2",Table1[#Headers],0),FALSE)

ヘッダーが value2 である列の値を返します。さらに動的に、次のように記述することもできます。

=VLOOKUP("d", Table1, MATCH(Table1[[#Headers],[value2]],Table1[#Headers],0), FALSE)

テーブルの列ヘッダーの名前を変更すると自動的に更新されます

答え3

=VLOOKUP(A2,Table1,2,MAX(Table1Col2))

説明: =VLOOKUP(**Data being looked up**,**Name of Table or data range**,**column of data being looked up**,MAX(**Name or data range of data being looked up**))

lookup_valueに一致する行の最後の値を返します。

答え4

主に現在の検索者向けに現代的な回答を提供するために回答します(「現代」 = 2021 年)。

を使用しますXLOOKUP()。これは完全な代替品ではなく、状況によっては適さない場合があります。ただし、これは単純なものであり、ベータ リリースではこれを実行するために再設計されました。

興味深い機能は、最後から最初に向かって検索するパラメータがあることです。つまり... スラムダンクです。

しかし、回答を読んでいると、投稿されたときに機能したであろう言葉で質問に対する明確な答えがないことに気付きました。真ん中の回答は質問にまったく答えておらず、3番目の回答は極限まで嘘をついています。TRUE単に入力するだけでもTRUE(または、0それらにとってはそれが好ましいとされるもの)まったく同じことを実行できるのに、ブール値を生成するために何か凝ったものを使用しています。回答者は、見た目が凝った、気取ったものが値のように見えることを期待していたという印象を与えます。やれやれ。そして、それは間違っていない答えを与えることはできるものの、それは単なる偶然であるという点で、正しくないわけではありません。主な失敗モードは、目的の値が範囲内の最後の項目である場合であるため、かなりの確率で発生しますが、特にこれが日付ベースである可能性があることを考えると、それが起こる可能性はかなりあります。

最初の答えは、試してみるべきいくつかの実用的な方法を示しており、データによっては、そのうちの 1 つ、またはそれらからヒントを得た方法がうまくいくかもしれません。3 番目の答えは、かなり詐欺師からヒントを得たもので、結果に強い自信を与え、上司が失敗を叫んで来たときに唖然とすることになるようなものではありません。

しかし、それらは単なる実用的なもので、必ずしも解決策ではありません。インターネットの「あちこち」で入手できる、LOOKUP()賢い方法を使用する標準的なアプローチがあります。しかし、もっと直接的で仕組みを理解しやすいものはどうでしょうか? (ほとんどの人にとって、このLOOKUP()方法は、賢く、本当に賢く、実際とても簡単ですが、ただ困惑するだけで、一目見た段階で理解できず、簡単に理解できるにもかかわらず、そのことに気づくまでには至りません。)

このINDEX()関数を使用すると、いわばテーブルを上下逆にして、数式の残りの部分に表示される最初の行が元の (「物理的な」) 範囲の最後の行になるようにすることができます。これは、行パラメータに、最も高い行番号 (最も高い「インデックス」) から始まり 1 まで下がる一連の数字を生成するものを指定することによって行われます。

これは、2012/2013 で巧妙なトリックを使用して、行番号をシーケンスで生成することで実現されています。1、2、3 ROW(1:100)、... 98、99、100 のシーケンスが提供されます。これを元に戻すには、 を使用すればいいと思うかもしれませんROW(100:1)が、Excel は、好むと好まざるとにかかわらず、愚かな間違いを「修正」して提供しますROW(1:100)。これを克服する方法はありません。ただし、使用されている最大の行番号がわかっていて、問題にならない場合は、それに 1 を加算できます。この例では 100 + 1 です。次に、Excel が生成したシーケンスをそこから減算します。101 - 1、100 - 2、100 - 3、... であるため、100、99、98、... となり、101 - 100、つまり 1 になります。

これを行パラメータに使用して、INDEX()行を最後から最初になるように反転します。

の列についてはINDEX()、 の通常の経験を超えて考える必要がありますVLOOKUP()。通常、多数の列を持つテーブル/範囲を指定します。したがって、A2:W900 などです。列 A を検索し、列 T (または列 20) で何かを見つけたいとします。したがって、 のようなものが考えられますVLOOKUP("cow",A2:W900,20,false)。さて、 では、INDEX()指定された範囲のすべての列を使用するのではなく、配列定数というちょっとしたトリックを使用して、特定の列のみを指定できます。

Array ConstantsExcel に値の配列を渡す方法です。3 番目のパラメーターである列パラメーターの場合は、次のようになります: {"a","cow",13,999,"fisherman","circu"}. So in this example, you want to have columns A and T, or 1 and 20, so you'd giveINDEX() {1,20}`。

これらすべてのポイントは、INDEX()実際のテーブルの代わりに数式で使用する仮想テーブルを作成することです。仮想テーブルには行 2 ~ 900 と列 AW はありません。行 900 ~ 2 と列 A と T のみがあります。この関数は、例では次のようになります。

INDEX( A2:W900, 900-ROW(1:899), {1,20} )

(2 行目から 900 行目までを使用しているので、900 行目ではなく 899 行目しかないことに注意してください。したがって、Excel の 2 行目は範囲内の「インデックス」1 で、900 行目はインデックス 899 です。899 + 1 = 900 なので、901 ではなく 900 を使用します。そうすれば、数式内の数字が「意味をなす」ようになります。たとえば、最初のハード ドライブを「ドライブ 1」ではなく「ドライブ 0」と呼ぶのと同じです。)

これで、列 A と列 T のみの仮想テーブルが作成され、行 900 から行 2 までが最初に表示され、これが で使用するテーブルになりますVLOOKUP()。したがって、「cow」という単語を検索して完全一致を取得するための完全な数式は、END から開始して先頭に向かって逆方向に処理すると、次のようになります。

=VLOOUP( "cow", INDEX( A2:W900, 900-ROW(1:899), {1,20} ), 2, false )

「実際の」テーブルのデータは行 2 ~ 900 であるため、これは、データを行 900 ~ 2 に反転したテーブルを使用して最後の一致を検索します。また、23 列のデータすべてではなく、ルックアップを実行する列とデータを取得する列の 2 つの列のみを使用します。列が 2 つしかないため、回答を返す列は常に簡単です。つまり、列 2 です。"false" は、完全一致 (存在する場合) を保証します。

そして、これは必ず機能します。

余談ですが、使用した配列定数ですが、{1,20}...これらの値を逆にするとどうなると思いますか? のように{20,1}。列の順序が逆になります。 を使用したいがVLOOKUP()、この例の参照列が列 T で、列 A の結果が必要な場合は、運が悪いことになります。(私が米国海軍の原子力プログラムにいたころの「運の悪い事故」です。ああ、「OOL」事故... 何年も前に「LOL」を作成するところだったのに... できなかった... まあ、原子炉プラントの事故は笑い事ではなかったでしょうから、おそらくそれが最善だったのでしょう?) 使用するには、参照列が結果列の左側になければなりませんVLOOKUP()... ダメです!

ただし、列を逆にした仮想テーブルを作成すると、参照列が突然左側になってしまいます。すばらしい!

さらに余談ですが、列 (または行、ただし通常は列) の配列定数では、いくつかの数字のみを使用でき、任意の順序で使用でき、必要に応じて複数回使用することもできます。

SEQUENCE()「現代的な方法」を思い出すと、現在では、899 から 1 までの逆シーケンスを直接生成するために使用できます。

関連情報