概要
「この取引一覧で“いちばん古い日付”のデータだけを知りたい」
「初回購入日の金額」「最初に登録された担当者」など、“最古の日付に対応する値”を取りたい場面もよくあります。
ここで使える定番パターンが
MIN(最古日付を求める)+ XLOOKUP(その日の値を取る)
の組み合わせです。
Excel では日付は「小さいほど古い数値」として扱われるので、MIN で「いちばん古い日付」を求め、その日付を XLOOKUP の検索値に使えば、「最古日付の行の値」を簡単に取れます。
日付と MIN+XLOOKUP の基本イメージ
なぜ MIN で最古日付が分かるのか
Excel の日付は「昔の日付ほど小さい数、新しい日付ほど大きい数」として保存されています。
そのため、日付がたくさん並んでいるところに MIN をかけると、「一番小さい日付=最も古い日付」が返ってきます。
例えば、A2:A100 に日付が入っているとき、最古日付は次のように求められます。
=MIN(A2:A100)
この結果を、そのまま XLOOKUP の「検索値」に使うのが今回のパターンです。
MIN+XLOOKUP の基本形
形としては、まずこれを覚えてください。
=XLOOKUP(
MIN(日付範囲),
日付範囲,
取りたい列
)
中でやっていることは次の3ステップです。
- MIN(日付範囲) で「一番古い日付」を求める
- その最古日付を XLOOKUP で日付範囲から探す
- 見つかった行の「取りたい列」の値を返す
これで「最古日付の行の値」が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 に表示したいとします。
やりたいことは、
- FILTER で「顧客=F2」の行だけに絞る
- その中の日付に MIN をかけて“その顧客の最古日付”を求める
- その最古日付を 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件”を自動で拾う仕組みを、どんな表でも作れるようになります。
