Excel の VLOOKUP は、誰もが一度は使ったことのある関数だろう。
「ID を入れたら名前が出る」「マスタから値を引いてくる」──便利で分かりやすい。
しかし同時に、こんな経験はないだろうか。
- 昨日まで合っていたのに、今日は結果が違う
- 数字は合っているのに、意味が合わない
- なぜその値が出ているのか説明できない
- 誰も触れない Excel ファイルが出来上がった
結論を先に言えば、
VLOOKUP が危険なのではない。
VLOOKUP に「やらせすぎている」ことが危険なのだ。
VLOOKUP が実際にやっていること
まず、VLOOKUP の仕様を冷静に見る。
VLOOKUP は次のことしかしていない。
- 指定した範囲の左端列を上から順に探す
- 検索値と一致した最初の行を見つける
- 指定した列番号の値を返す
重要なのは、VLOOKUP は次のことを 一切考慮しない 点だ。
- キーが一意かどうか
- 複数行が一致していないか
- どの行が「正しい」か
- 業務的に意味のある順序か
つまり VLOOKUP は意味を理解しない配列検索 である。
ユーザーが VLOOKUP に期待していること
一方、ユーザーの期待はこうだ。
- 「正しいマスタ情報を取りたい」
- 「1対1で対応しているはず」
- 「欠損や不一致があれば気づきたい」
- 「業務的に正しい値を返してほしい」
つまりユーザーは無意識に、
- JOIN
- 関係の解決
- データ整合性の保証
を VLOOKUP に期待している。
ここに、最初のズレがある。
1対1でも VLOOKUP は安全ではない
よく言われる説明にこういうものがある。
「1対1なら VLOOKUP は問題ない」
これは 設計論としては誤り だ。
1対1は「事実」ではなく「期待」
実務で言う「1対1」は、大抵次のような意味だ。
- そう設計した
- そうなるはず
- 今のところはそう見える
しかし現実には、
- 片側にデータがない
- キーが一致しない
- 重複が混入する
といったことは日常的に起こる。なぜなら、ユーザーはデータを事前に検証していないからだ。
VLOOKUP は壊れた 1対1 を検出しない
1対1が壊れたとき、
- マージ(結合)なら、欠損や重複が可視化される
- VLOOKUP は、沈黙したまま「それっぽい値」を返す
これは データ安全性の観点で最悪 だ。
1対1を期待する処理であっても、
VLOOKUP をいきなり使うのは正しい選択ではない。
1対多で VLOOKUP が破綻する理由
1対多とは、1つのキーに複数行が対応する関係だ。
- 顧客 → 注文
- 商品 → 売上明細
この場合、本来の正しい答えは 集合(複数行) である。
VLOOKUP はどの値を選ぶのか?
答えはシンプルだ。
一番上にある行
これは、
- ソート順
- データの読み込み順
- 偶然の配置
に依存する。
つまり、
1対多が発生した瞬間、
VLOOKUP の結果は予測不能になる。
1対多で「欲しい値」がある場合、それは必ず次のいずれかである。
- 最新
- 最大/最小
- 有効フラグが立っている
- 条件を満たすもの
これらは 業務ルール であり、データを整理・定義する工程が先に必要 である。
VLOOKUP は、この工程を代替できない。
多対多はさらに危険になる
多対多とは、両側に複数の対応がある関係だ。
- 商品 ↔ キャンペーン
- 社員 ↔ プロジェクト
多対多が分かりにくい理由
- どれが代表なのか分からない
- 中間構造が必要
- 組み合わせ自体が意味を持つ
人間の直感に合わない構造である。
「一部だけ多対多」が最悪
特に危険なのがこのケースだ。
- 大半は 1対1 に見える
- しかし一部のキーだけ多対多
この場合、
- 普段は正しく見える
- 特定条件でだけ結果が変わる
- 原因を説明できない
という 最悪の事故パターン になる。
検証できない処理は、
- バグがあっても気づけない
- レビューできない
- 監査に耐えない
VLOOKUP は、この状況をさらに悪化させる。
多対多が見えた瞬間にすべきこと
- 「探す」のをやめる
- 関係を明示する
- 中間表を作る
- 条件を言語化する
つまり、
計算を始める前に、データ構造を確定させる
期待する結果を得るには、まずデータを整理する
1対多や多対多で「欲しい値」がある場合、それは必ず次のいずれかだ。
- 最新
- 最大/最小
- 有効フラグが立っているもの
- 条件を満たすもの
これは 業務ルール であり、
計算の問題ではない。
つまり、
VLOOKUP の前に、
参照データの整理と定義が必要
である。
ユーザーが本当に理解すべきこと
ここまでの問題は、すべて一つに集約される。
関係構造を理解しないまま計算を始めている
必要なのはスタースキーマの「考え方」
難しいデータベース理論は不要だ。
理解すべきなのは、次の最小限だけでよい。
- 数値は 事実(Fact)
- 名前や分類は 属性(Dimension)
- Fact から Dimension への関係は「多対一」
- 多対多は中間構造が必要
これが、いわゆる スタースキーマの思考 である。
(Dimension から見れば 1対多だが、設計と計算の基準は常に Fact → Dimension の多対一である)
スタースキーマは「安全装置」になる
この考え方を少しでも持っていれば、
- 「これ本当に 1対1?」と立ち止まれる
- 「どの1件を取るの?」と考えられる
- 「これは計算じゃない」と気づける
この 立ち止まれる感覚 が、事故を防ぐ。
まとめ:VLOOKUP を書く前に考えること
やるべきこと
- データを Fact / Dimension に分けて考える
- 関係が 1対1 か 1対多かを意識する
- 多対多が見えたら計算を止める
- 結合は前処理(マージ)で行う
- VLOOKUP は最後の手段にする
やらなくていいこと
- VLOOKUP の小技を極める
- 数式で多対多をねじ伏せる
- IFERROR で問題を隠す
- 「たぶん大丈夫」を信じる
おわりに
VLOOKUP は間違った関数ではない。
だが、間違った期待を背負わされすぎた関数 である。
本当に重要なのは、
VLOOKUP をどう書くかではなく、
そもそも書いてよい構造かどうかを判断すること
その判断を可能にする最小限の知識が、スタースキーマという「考え方」 だ。
Excel を「計算ツール」から安全なデータ処理ツールとして使いたいなら、最初に見直すべきなのは VLOOKUP ではなく、データを理解することなのである。