「最初の数値」を取り出そうとして、うまくいかなかった経験はありませんか?
月次売上レポートを集計しているとき、こんなことはないでしょうか。
担当者ごとに入力されたデータが1列に並んでいるはずなのに、空白セルがあったり、「未入力」「確認中」といった文字列が混ざっていたりする。そこから「最初に記録された数値だけ」を取り出そうとVLOOKUPやFINDを試してみたけれど、うまく動かない——。
実はこのケース、通常の検索関数では対応しにくいのです。VLOOKUPは「値で検索」するので、「数値かどうか」という条件では動けません。FINDは文字列専用です。正しいアプローチを知らないと、意外なほど時間を取られます。
この記事では、空白・文字列・エラー値が混在するリアルなデータから「範囲内の最初の数値」を確実に取り出す方法を、Excelのバージョン別に解説します。
今回使うサンプルデータ
月次売上レポートの「B列:1月分の売上」に、以下のようなデータが入っているとします。
| B列 | 内容 |
|---|---|
| B1 | (空白):未入力 |
| B2 | 確認中:文字列 |
| B3 | (空白):未入力 |
| B4 | 42000:数値 ← これを取り出したい |
| B5 | 98000:数値 |
| B6 | #N/A:エラー値 |
「最初に記録された売上数値(42000)」を自動で取り出す、というゴールで解説を進めます。
方法①:XLOOKUP + ISNUMBER(Excel 365 / 2021 推奨)
数式
=XLOOKUP(TRUE, ISNUMBER(B1:B6), B1:B6, "データなし")
仕組みの解説
| パーツ | 役割 |
|---|---|
ISNUMBER(B1:B6) |
各セルが数値なら TRUE、そうでなければ FALSE の配列を生成 |
XLOOKUP(TRUE, ..., B1:B6) |
先頭から走査し、最初に TRUE となる位置の値を返す |
"データなし" |
数値が1つもない場合のフォールバック表示 |
XLOOKUPはデフォルトで「先頭から順に完全一致検索」を行うため、追加の引数なしで「最初に TRUE になる位置=最初の数値」を正確に取得できます。
エラー値が含まれる場合の注意
ISNUMBER はエラー値(#N/A、#DIV/0! など)に対して FALSE を返します。そのためエラー値は自動的にスキップされ、余分な対処は不要です。上記のサンプルデータでも問題なく 42000 が返ります。
おすすめ度:◎ シンプルで可読性が高く、保守もしやすい。まずこちらを試してください。
方法②:INDEX + MATCH + ISNUMBER(Excel 2019 / 2016 対応)
Excel 365や2021が使えない環境では、こちらの組み合わせが定番です。
数式
=IFERROR(INDEX(B1:B6, MATCH(TRUE, ISNUMBER(B1:B6), 0)), "データなし")
⚠️ Excel 2019・2016では Ctrl + Shift + Enter で配列数式として入力してください。数式バーに
{=IFERROR(...)}のように波括弧が表示されれば正しく入力されています。Excel 365では通常のEnterで動作します。
仕組みの解説
| パーツ | 役割 |
|---|---|
ISNUMBER(B1:B6) |
TRUE/FALSE の配列を生成 |
MATCH(TRUE, ..., 0) |
最初に TRUE となる位置(行番号)を返す |
INDEX(B1:B6, ...) |
その行番号の値を取り出す |
IFERROR(..., "データなし") |
数値が見つからない場合のエラー回避 |
MATCH の第3引数を 0(完全一致)にするのが重要です。1 や -1 にすると意図しない動作になります。
エラー値が含まれる場合の注意
方法①と同様、ISNUMBER がエラー値を FALSE として処理するため、エラーセルは自動的にスキップされます。外側の IFERROR は「数値が1つも存在しないとき」のための保険です。
おすすめ度:○ 旧バージョンでも確実に動作する。IFERROR を忘れずに。
方法の比較まとめ
| 方法 | 対応バージョン | 配列入力 | エラー値への対応 | 可読性 |
|---|---|---|---|---|
| XLOOKUP + ISNUMBER | 365 / 2021以降 | 不要 | 自動でスキップ | ◎ |
| INDEX + MATCH + ISNUMBER | 2016以降 | 旧Verは必要 | 自動でスキップ | ○ |
AGGREGATEについて: ネット記事によっては「AGGREGATE関数で最初の数値を取得できる」と紹介されているケースがありますが、AGGREGATEは「最小値」や「k番目に小さい値」を返す関数です。「最初の数値(位置が先頭のもの)」とは用途が異なるため、この記事のテーマには適しません。混同しないよう注意してください。
実践的な応用:エラー回避と横方向への展開
応用①:行方向(横並び)のデータにも使える
月ごとのデータが横に並んでいる場合も、範囲を変えるだけで対応できます。
=XLOOKUP(TRUE, ISNUMBER(B2:M2), B2:M2, "データなし")
B2からM2まで(1月〜12月)の行データから、最初に入力された月の数値を取得します。
応用②:特定の列・行範囲に絞って検索
=XLOOKUP(TRUE, ISNUMBER(C5:C100), C5:C100, "データなし")
ヘッダー行を除いたデータ範囲のみを対象にしたい場合など、範囲を明示的に指定することで誤取得を防げます。
まとめ
空白・文字列・エラー値が混在するExcelデータから「最初の数値」を取り出すには、ISNUMBERで数値かどうかを判定し、その結果を検索関数で利用するという考え方が核心です。
- Excel 365 / 2021 を使っているなら →
XLOOKUP + ISNUMBER(第4引数でエラー対策も忘れずに) - Excel 2019 / 2016 を使っているなら →
IFERROR + INDEX + MATCH + ISNUMBER(配列入力を忘れずに)
どちらの方法も、エラー値は ISNUMBER が自動的に無視してくれるため、思ったよりシンプルに書けます。まずは今日のサンプルデータをそのまま使って、手元のExcelで動作確認してみてください。実際に動かすのが、最速の習得方法です。
このブログでは、ExcelのLookup系関数を中心に実践的なテクニックを定期的に紹介しています。他の記事もあわせてご覧ください。