doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

【Lookupシリーズ】「〜で始まらない」最初の値をINDEX+MATCH+LEFTで一発取得する方法

スポンサーリンク


【Lookupシリーズ】「〜で始まらない」最初の値をINDEX+MATCH+LEFTで一発取得する方法のサンプル ▲ Lookup サンプル

はじめに:否定条件の検索、VLOOKUPでは対応できない

Excelや Google Sheetsで「商品コードが"T"で始まらない最初の品番を取り出したい」という場面、実務でよくあります。

たとえば、取引先別にコードが振られた商品リストから、自社扱い以外("T"で始まる他社品番を除く)の最初のエントリを素早く特定したいケースです。

VLOOKUPや単純なMATCHのワイルドカード(*?)は「〜を含む」「〜で始まる」には使えますが、否定条件(〜で始まらない)には使えません

この記事を読めば、INDEX + MATCH + LEFT を組み合わせた数式1つで、否定条件のLookupができるようになります。


基本の考え方

数式の基本構造

=INDEX(返したい列, MATCH(TRUE, LEFT(検索列, 文字数)<>"プレフィックス", 0))

この数式は配列数式(複数のセルをまとめて一括計算する特殊な入力方法)を使って動作します。処理の流れは次のとおりです。

  1. LEFT(検索列, 文字数) — 各セルの先頭N文字を取り出す
  2. <>"プレフィックス" — 指定文字列と等しくないかどうかをTRUE/FALSEの配列に変換
  3. MATCH(TRUE, ..., 0) — 最初にTRUEになる行番号を見つける
  4. INDEX — その行番号に対応する値を返す

シンプルに言えば「先頭文字が違う最初の行はどこか?」を配列で全件チェックして返す仕組みです。


実践例①:検索列の値をそのまま返す

データ例

A列(商品コード) B列(商品名)
T-001 Tシャツ
T-002 タオル
H-010 帽子
T-003 タンクトップ
S-001 スニーカー

A列の商品コードが「T」で始まらない最初のコードを取り出します。

=INDEX(A2:A6, MATCH(TRUE, LEFT(A2:A6, 1)<>"T", 0))

Excelの場合:通常のEnterではなく Ctrl + Shift + Enter で配列数式として確定します。数式バーに {=...} と波括弧が付けば成功です。

Google Sheetsの場合ARRAYFORMULA を使います。

=INDEX(A2:A6, MATCH(TRUE, ARRAYFORMULA(LEFT(A2:A6,1)<>"T"), 0))

どちらか使いやすい方で試せば十分です。

結果H-010 が返ります。


実践例②:検索列と返す列が異なる場合(実務で最頻出)

実務では「A列のコードで条件判定して、B列の商品名を返したい」というパターンがほとんどです。INDEX の範囲をB列に変えるだけで対応できます。

=INDEX(B2:B6, MATCH(TRUE, LEFT(A2:A6, 1)<>"T", 0))

MATCH 側の検索条件はA列のまま据え置き、INDEX でB列を参照する点がポイントです。

結果帽子 が返ります。


実践例③:複数文字のプレフィックスに対応する

「旧_」(2文字)で始まらない最初の商品名を探す場合は、LEFT の第2引数をプレフィックスの文字数に合わせます。

=INDEX(B2:B10, MATCH(TRUE, LEFT(A2:A10, 2)<>"旧_", 0))

(※配列数式として入力。Excelは Ctrl + Shift + Enter


応用編:2番目・3番目の一致も取得する

条件を満たす2番目・3番目の値も連続して取得したい場合は、SMALL + IF + ROW を組み合わせます。

=INDEX(A$2:A$10, SMALL(IF(LEFT(A$2:A$10,1)<>"T", ROW(A$2:A$10)-ROW(A$2)+1), 1))
  • SMALL(..., 1) → 最初の一致
  • SMALL(..., 2) → 2番目の一致
  • SMALL(..., 3) → 3番目の一致

基本パターンより難易度が上がるため、まず実践例①②で動きを確認してから試してください。


よくあるエラーと対処法

#N/A が返る

MATCHが一致する値を見つけられない場合に発生します。

  • 検索範囲に該当する値が本当に存在するか確認
  • 配列数式として正しく入力されているか(波括弧 {} があるか)確認
  • IFERROR でラップして「見つからない」を明示する
=IFERROR(INDEX(A2:A10, MATCH(TRUE, LEFT(A2:A10,1)<>"T", 0)), "該当なし")

注意:大文字・小文字の扱い

LEFT はデフォルトで大文字・小文字を区別しません("T" と "t" は別物として扱われます)。大文字小文字を無視して比較したい場合は、LOWER で統一してから比較します。

=INDEX(A2:A10, MATCH(TRUE, LOWER(LEFT(A2:A10,1))<>"t", 0))

この点は見落としやすいので、思った結果が返らないときは真っ先に確認してください。


まとめ

やりたいこと 使う関数
〜で始まらない最初の値 INDEX + MATCH + LEFT + 否定(<>
検索列と異なる列の値を返す INDEX の範囲を別列に変えるだけ
N番目の一致を取得 INDEX + SMALL + IF + ROW

「始まらない」否定条件のポイントは、LEFT で先頭文字を切り出して不等号(<>)で比較することです。配列数式として入力することで、セル1つの数式で全行を動的にチェックできます。

実務のデータ整理や集計作業にぜひ活用してみてください。


このシリーズでは、INDEX・MATCH・VLOOKUPなどのLookup系関数を使った実践的なテクニックを順次紹介しています。


関連記事