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

Excel VBA Excel
スポンサーリンク

概要

「この取引一覧で“いちばん古い日付”のデータだけを知りたい」
「初回購入日の金額」「最初に登録された担当者」など、“最古の日付に対応する値”を取りたい場面もよくあります。

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

Excel では日付は「小さいほど古い数値」として扱われるので、MIN で「いちばん古い日付」を求め、その日付を XLOOKUP の検索値に使えば、「最古日付の行の値」を簡単に取れます。


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

なぜ MIN で最古日付が分かるのか

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

例えば、A2:A100 に日付が入っているとき、最古日付は次のように求められます。

=MIN(A2:A100)

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

MIN+XLOOKUP の基本形

形としては、まずこれを覚えてください。

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

中でやっていることは次の3ステップです。

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

これで「最古日付の行の値」が1発で取れます。


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

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

前提の表:

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

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

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

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

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

列名だけ変えたパターンです。

A列:日付
B列:在庫数

最古日付の在庫数を D2 に表示したいときも、列範囲を変えるだけです。

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

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

現場では「最古日付の売上」だけでなく、
「そのときの顧客名」「担当者」など、行全体の情報を見たいことが多いです。

INDEX+MATCH で「最古日の行番号」を使い回すパターン

次のような表を考えます。

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

最古日付の「顧客名」「担当者」「売上」をまとめて表示したいとします。

まず、「最古日付が A2:A100 の何行目か」を、例えば F1 に求めます。

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

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

この F1 を使えば、INDEX で各列を簡単に参照できます。

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

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

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

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

最古日の売上を I1 に表示:

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

1回求めた「最古日の行番号」を使い回しているだけなので、
日付や売上が更新されて最古日付の行が変わっても、自動で追随します。

XLOOKUP だけで列ごとに直接取るパターン

INDEX+MATCH が少し難しく感じる場合は、
「列ごとに XLOOKUP で“最古日付の値”を引く」という書き方もできます。

最古日の顧客名:

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

最古日の担当者:

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

最古日の売上:

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

MIN(A2:A100) という“最古日付”を共通の検索値として、
参照する「戻り列」だけ変えているイメージです。


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

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

例:顧客ごとに“初回取引日”の売上を取る(FILTER+MIN+XLOOKUP)

前提の表:

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

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

やりたいことは、

  1. FILTER で「顧客=F2」の行だけに絞る
  2. その中の日付に MIN をかけて“その顧客の最古日付”を求める
  3. その最古日付を XLOOKUP で検索して売上を取る

これを1つの式にまとめると、例えばこう書けます(Microsoft 365 前提):

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

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


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

日付が“文字列”扱いだと MIN が正しく動かない

見た目が日付っぽくても、実際には「文字列」として扱われている場合があります。
その状態で MIN をかけると、「古い/新しい」の比較がうまくいきません。

対策としては、入力を正しい日付形式にそろえるか、
文字列日付を DATEVALUE などで日付シリアルに変換する必要があります。

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

最古の日付が複数行にある場合、XLOOKUP は「一番上にある行」の値を返します。

「最古日付のデータを全部一覧で取りたい」場合には、FILTER を使うとよいです。

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

このようにすると、「最古日付と一致する全行」が抽出されます。

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

日付列に空白がある場合、基本的に MIN は空白を無視してくれますが、
不安な場合や特殊なデータでは、空白を除外してから MIN を使うと安心です。

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

このようにしておけば、「日付が入っている行だけ」の中の最古日付を取れます。


例題

問題1

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

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

問題2

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

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

問題3

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

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

問題4

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

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

問題5

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

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

まとめ

「最古日付の値取得 → MIN+XLOOKUP」の基本形は、とてもシンプルです。

最古日付の値を1つ取る型はこれだけです。

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

ここに、

  • 取りたい列を変える(顧客名・担当者・売上など)
  • FILTER と組み合わせて「顧客別」「商品別」の最古日付を求める

といった工夫を加えていくだけで、

「初回取引の金額」「最初の登録担当者」「最古データの明細」など、
“いちばん古い1件”を自動で拾う仕組みを、どんな表でも作れるようになります。

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