Excel関数 逆引き集 | 最新日付の値取得 → MAX+XLOOKUP

Excel VBA Excel
スポンサーリンク

概要

「この一覧の中で“いちばん新しい日付”のデータだけ取りたい」
「最新日付の在庫数」「最後に購入された金額」など、“最新の1件”を出したい場面はすごく多いです。

ここで使える定番パターンが
MAX(最新日付を求める)+ XLOOKUP(その日の値を取る)
の組み合わせです。

Excel では日付は「大きいほど新しい数値」として扱われるので、MAX で「一番新しい日付」を求め、その日付を XLOOKUP の検索値に使えば、「最新日付の行の値」を簡単に取ってこられます。


日付と MAX+XLOOKUP の基本イメージ

なぜ MAX で最新日付が分かるのか

Excel の日付は「古い日付ほど小さい数、新しい日付ほど大きい数」として保存されています。
そのため、日付がたくさん並んでいるとき、MAX 関数をかけると「一番大きい日付=最新日付」が返ってきます。

例えば、A2:A10 に日付が入っているとき、最新日付はこう出せます。

=MAX(A2:A10)

この結果を、そのまま XLOOKUP の「検索値」に使うのが今回のパターンです。

MAX+XLOOKUP の基本形

典型的な形はこうなります。

=XLOOKUP(
    MAX(日付範囲),
    日付範囲,
    取りたい列
)

中でやっていることは

  1. MAX(日付範囲) で最新日付を求める
  2. その最新日付を XLOOKUP で日付範囲から探す
  3. 見つかった行の「取りたい列」の値を返す

という3ステップです。


最新日付の「値」を1つだけ取得する基本パターン

例1:最新日の売上金額を取る

前提の表:

A列:日付
B列:売上金額

A2:B100 にデータが入っているとします。
この中で「いちばん新しい日付の売上金額」を C2 に表示したい場合、式はこうです。

=XLOOKUP(
    MAX(A2:A100),   /* 最新日付を求める */
    A2:A100,        /* 日付の一覧 */
    B2:B100         /* 売上金額の列 */
)

ここでのポイントは「MAX(A2:A100) がそのまま XLOOKUP の検索値になっている」ことです。
XLOOKUP が「最新日付の行」を見つけ、その行の B列(売上金額)を返します。

例2:最新日の在庫数を取る

少し列名を変えてみます。

A列:日付
B列:在庫数

最新日付の在庫数を D2 に表示する式は、列範囲を変えるだけです。

=XLOOKUP(
    MAX(A2:A100),
    A2:A100,
    B2:B100
)

最新日付の「複数列の情報」を取りたいときの考え方

現場では「最新日付の売上金額」だけでなく、
「最新日付の顧客名」「最新日付の担当者」などもまとめて見たいことが多いです。

最新日の行が何行目かを一度求めるパターン(INDEX+MATCH)

A列:日付
B列:顧客名
C列:担当者
D列:売上

最新日付の「顧客名」「担当者」「売上」を、それぞれ別セルに表示したいケースで考えます。

まず、「最新日付が日付列の何行目か」を求める式を、例えば F1 に書きます。

=MATCH(MAX(A2:A100), A2:A100, 0)

これで F1 には、「A2:A100 の中で、最新日付が何番目にあるか」が入ります。
たとえば F1=15 なら、「A2:A100 の 15番目=A16 が最新日付」という意味です。

この F1 を使って、INDEX で各列を参照すると、最新日の情報を横並びで取れます。

最新日付の顧客名を G1 に表示:

=INDEX(B2:B100, $F$1)

最新日付の担当者を H1 に表示:

=INDEX(C2:C100, $F$1)

最新日付の売上を I1 に表示:

=INDEX(D2:D100, $F$1)

MAX+MATCH で「最新日の行番号」、
その行番号を使って INDEX で「好きな列」を取る、という流れです。

最新日の値を XLOOKUP で直接列ごとに取るパターン

INDEX+MATCH が少し難しく感じる場合は、
「列ごとに XLOOKUP する」書き方もできます。

最新日の顧客名:

=XLOOKUP(MAX(A2:A100), A2:A100, B2:B100)

最新日の担当者:

=XLOOKUP(MAX(A2:A100), A2:A100, C2:C100)

最新日の売上:

=XLOOKUP(MAX(A2:A100), A2:A100, D2:D100)

MAX(A2:A100) という“最新日付”を共通の検索値として使い回しているイメージです。


条件付き「最新日付の値」を取る応用パターン

「全体の中で最新」ではなく、
「特定の顧客ごとに最新日付の値」を取りたいことも多いです。

例:顧客ごとに最新日付の売上を取る(FILTER+MAX+XLOOKUP)

前提:

A列:顧客名
B列:日付
C列:売上

F2 に顧客名(例:佐藤商事)が入っていて、
「佐藤商事の中で、最新日付の売上」を G2 に表示したいとします。

最新日付だけを取るなら、本来は「顧客で絞ってから MAX」をかける必要があります。
考え方はこうです。

  1. FILTER で「顧客=F2」の行だけの日付を取り出す
  2. その中で MAX をかけて最新日付を求める
  3. その最新日付を使って XLOOKUP で売上を取る

式の一例です(365 前提の少しレベル高めの書き方):

=XLOOKUP(
    MAX(FILTER(B2:B100, A2:A100=F2)),   /* その顧客だけの最新日付 */
    B2:B100,                             /* 全体の日付列 */
    C2:C100                              /* 売上列 */
)

FILTER(B2:B100, A2:A100=F2) で「顧客=F2」の日付だけを抜き出し、
その中で MAX を取ることで「その顧客にとっての最新日付」を作っています。
その最新日付を XLOOKUP の検索値にして、対応する売上を返しています。


よくあるつまずきポイントと対策

日付が「文字列」扱いだと MAX でうまく比較できない

見た目は日付でも、実際は文字列として入力されていると
MAX で正しく「最新日付」が取れません。

対策としては、セルの表示形式を「日付」に揃えたり、
文字列日付を DATEVALUE などで日付シリアルに変換する必要があります。

同じ最新日付が複数行ある場合

同じ最新日付の行が複数あるとき、XLOOKUP は「最初に見つかった行」の値だけを返します。

「最新日付のレコードを全部一覧にしたい」場合は、
FILTER と組み合わせて

=FILTER(A2:C100, B2:B100=MAX(B2:B100))

のように、「最新日付と等しい行をまとめて抽出する」ほうが向いています。

空白日付が混ざっている場合

日付列に空白が混じっているときは、
MAX が空白を特に問題視せず無視してくれることが多いですが、
「未入力があると不安」という場合は、FILTER で空白を除いてから MAX をかける方法もあります。

=MAX(FILTER(A2:A100, A2:A100<>""))

例題

問題1

A2:A100 に日付、B2:B100 に売上金額が入っています。
この中で「最新日付の売上金額」を C2 に表示する MAX+XLOOKUP の式を書いてください。

=XLOOKUP(MAX(A2:A100), A2:A100, B2:B100)

問題2

A2:A100 に日付、B2:B100 に在庫数が入っています。
「最新日付の在庫数」を D2 に表示する式を書いてください。

=XLOOKUP(MAX(A2:A100), A2:A100, B2:B100)

問題3

A2:A100 に日付、B2:B100 に顧客名、C2:C100 に売上があります。
最新日付の「顧客名」を E2 に表示する式を書いてください(MAX+XLOOKUP を使ってください)。

=XLOOKUP(MAX(A2:A100), A2:A100, B2:B100)

問題4

問題3と同じ表で、最新日付の「売上金額」を F2 に表示する式を書いてください。

=XLOOKUP(MAX(A2:A100), A2:A100, C2:C100)

問題5

A2:A100 に顧客名、B2:B100 に日付、C2:C100 に売上があります。
F2 に顧客名が入力されているとき、その顧客について「最新日付の売上」を G2 に表示する式を、FILTER・MAX・XLOOKUP を組み合わせて書いてください。

=XLOOKUP(
    MAX(FILTER(B2:B100, A2:A100=F2)),
    B2:B100,
    C2:C100
)

まとめ

「最新日付の値取得 → MAX+XLOOKUP」の型は、とてもシンプルです。

最新日付の1値だけ欲しいときの基本形はこれです。

=XLOOKUP(MAX(日付範囲), 日付範囲, 取りたい列)

これに、

  • 取りたい列を変える(顧客名・担当者・金額など)
  • 条件付きで MAX する(FILTER と組み合わせて顧客別など)

という工夫を足していくだけで、
「最新の売上」「最新の在庫」「顧客ごとの最新取引」など、
“新しい1件”を自動で取るシートがどんどん作れるようになります。

タイトルとURLをコピーしました