「最新ファイルはどれ?」を毎回目視で探していませんか?
プロジェクトが進むにつれ、こんなファイル名が増えていきます。
report_v1.xlsx report_v2.xlsx report_v3.xlsx … report_v12.xlsx
ファイルが10個、20個と増えていくと、「最新バージョンはどれだっけ?」と毎回スクロールして目視確認するのは非常に手間です。更新のたびに確認作業が発生し、うっかり古いファイルを開いてしまうミスも起きがちです。
この記事では、LOOKUP・ISNUMBER・FIND の3つの関数を組み合わせることで、キーワードに一致する最後のファイル名をリストから自動取得する方法を解説します。
完成形と目指すゴール
まず完成形を確認しましょう。以下のようなファイル名リスト(A列)から、キーワード「report」を含む最後のファイル名を1つの数式で取得します。
| A列 |
|---|
| report_v1.xlsx |
| report_v2.xlsx |
| report_v3.xlsx |
| memo_v1.xlsx |
| memo_v2.xlsx |
完成数式:
=IFERROR(LOOKUP(2, 1/ISNUMBER(FIND("report", A2:A6)), A2:A6), "見つかりません")
結果:report_v3.xlsx
この数式がどのように動くのかを、3つのステップで分解して解説します。
ステップ1:FINDでキーワードの有無を調べる
=FIND("report", A2:A6)
FIND は、対象文字列の中にキーワードが含まれていれば開始位置(数値)を、含まれていなければ #VALUE! エラーを返します。
| セル | FIND結果 |
|---|---|
| report_v1.xlsx | 1 |
| report_v2.xlsx | 1 |
| report_v3.xlsx | 1 |
| memo_v1.xlsx | #VALUE! |
| memo_v2.xlsx | #VALUE! |
配列として処理されるため、A2:A6全体に対して一度に結果が返ります。
ステップ2:ISNUMBERでTRUE/FALSEに変換する
=ISNUMBER(FIND("report", A2:A6))
FIND の結果は「数値かエラー」なので、ISNUMBER を使って真偽値に変換します。
結果:{TRUE, TRUE, TRUE, FALSE, FALSE}
これで「キーワードを含むか否か」が明確になりました。
ステップ3:LOOKUP(2, 1/条件, 範囲) で最後の一致を取得する
ここが今回の核心です。
=LOOKUP(2, 1/ISNUMBER(FIND("report", A2:A6)), A2:A6)
「1/TRUE」「1/FALSE」で何が起きるか?
1 / TRUE→1 / 1→ 11 / FALSE→1 / 0→ #DIV/0!(ゼロ除算エラー)
結果として検索配列はこうなります:
{1, 1, 1, #DIV/0!, #DIV/0!}
なぜ検索値に「2」を使うのか?
LOOKUP は「検索値以下の最大値」を返す関数です。検索値 2 はこの配列の中に存在しないため、エラーを除いた値の中で最大(かつ最後)の 1 を返すという動作をします。
⚠️ 注意: この
LOOKUPのエラースキップ動作は、Microsoftが公式に保証した仕様ではなく、Excelユーザーの間で広く使われている慣用的なテクニックです。現時点では多くのバージョンで安定して動作しますが、将来のアップデートで動作が変わる可能性もゼロではありません。業務での使用時はその点を念頭に置いてください。
結果として、配列の最後にある 1(= report_v3.xlsx)が返り、最新バージョンのファイル名が取得できます。
実践:そのまま使えるパターン集
キーワードをセル参照にして動的に切り替える
B1にキーワードを入力することで、取得するファイル名を動的に変更できます。
=IFERROR(LOOKUP(2, 1/ISNUMBER(FIND(B1, A2:A100)), A2:A100), "見つかりません")
B1に「memo」と入力すれば memo_v2.xlsx、「report」と入力すれば report_v3.xlsx が返ります。
大文字・小文字を区別しない場合
FIND は大文字・小文字を区別します。区別が不要なら SEARCH に置き換えてください。
=IFERROR(LOOKUP(2, 1/ISNUMBER(SEARCH(B1, A2:A100)), A2:A100), "見つかりません")
エラー処理を加えて安全に使う
該当ファイルが存在しない場合、IFERROR でメッセージを返すことでエラー表示を防げます。
=IFERROR(LOOKUP(2, 1/ISNUMBER(FIND(B1, A2:A100)), A2:A100), "見つかりません")
応用:最新ファイル名からバージョン番号だけを抽出する
C1に取得したファイル名(例:report_v3.xlsx)が入っている場合、バージョン番号のみを取り出せます。
=MID(C1, FIND("v", C1), FIND(".", C1) - FIND("v", C1))
この数式は "v" から "." の直前までを抽出するため、.xlsx や .csv など拡張子に依存しない汎用的な書き方です。拡張子をハードコーディングした場合と異なり、ファイル形式が変わっても修正不要です。
Excel 365 / 2021ユーザーへ:より新しい代替手段
今回紹介した LOOKUP パターンはExcelのあらゆるバージョンで使える汎用テクニックですが、Excel 365や2021以降をお使いであれば、動的配列関数を使ったよりモダンな書き方も選択肢に入ります。
例えば FILTER 関数を使えば、条件に一致するファイル名を全件リストアップしたうえで最後の行を取得するアプローチも可能です。古いバージョンとの互換性が不要な環境であれば、こちらも検討してみてください(詳細は別記事で解説予定です)。
まとめ
LOOKUP(2, 1/ISNUMBER(FIND(...)), ...) のパターンを使えば、条件に一致する最後の値を1つの数式で取得できます。
| 関数 | 役割 |
|---|---|
FIND |
キーワードの位置(数値)またはエラーを返す |
ISNUMBER |
数値ならTRUE、エラーならFALSEに変換 |
1/条件 |
FALSEをゼロ除算エラーに変換して除外する |
LOOKUP(2, ...) |
エラーをスキップして最後の一致を返す |
ファイルバージョン管理に限らず、「条件に合う最後の行を取りたい」あらゆる場面で応用できる汎用パターンです。ぜひ手元のExcelで試してみてください。
【Lookupシリーズ】では、LOOKUP系関数の実践的な活用方法を定期的に紹介しています。他の記事もあわせてご覧ください。