MATCH関数で 2つ目以降を見つける方法

カテゴリ : 日記

[最終更新 : 2023/9/11 | 記事作成日 : 2012/10/27]

更新内容 (2023/9/11) : 文章の順序入れ替え


MATCH関数といえば、表計算ソフトの検索に使う基本的な関数です。
しかし、同じ値が複数ある場合は、最初のものしか見つけられません。
なんとかして、すべて見つけられないものか?
という試行錯誤の話。


わたしが使っている方法は、MATCH関数とOFFSET関数の組み合わせです。


概要

. A B C D E
1 すいか . 検索語 バナナ .
2 なし . リスト行数 10 .
3 バナナ . 該当数 3 .
4 みかん . 検索結果 . .
5 りんご . 1 3 行目
6 みかん . 2 7 行目
7 バナナ . 3 9 行目
8 なし . . . .
9 バナナ . . . .
10 りんご . . . .

こんな感じで、検索語を入力すると、 それが何行目にあるか表示します。
(通常、MATCH関数では、最初の 3行目しか分からないハズ)
これを実現する方法の話。


興味のある方は続きをどうぞ


解決策の進化の軌跡 ?

[追記 : 2023/8/19]

[Lv.1] : VLOOKUP + 作業列

  • 欠点 : 検索列は左端のみ
  • 欠点 : VLOOKUP の 検索範囲が固定

- - - ↓ - - -

[Lv.2] : INDEX,MATCH + 作業列 または XLOOKUP + 作業列

  • 欠点解消 : 検索列は任意に
  • 欠点 : INDEX,MATCH / XLOOKUP の 検索範囲が固定

- - - ↓ - - -

[Lv.3] : OFFSET,MATCH + 作業列

  • 欠点解消 : OFFSET は検索範囲の指定が必要ない。
    (始点の指定のみで終点の指定はない)
  • 欠点 : MATCH の 検索範囲が固定
  • 注意点 : 行・列の指定方法が変わる

    (左上の指定例)

    • INDEX (範囲,1,1)
    • OFFSET (始点,0,0)
      (始点には範囲の左上を指定する)

- - - ↓ - - -

[Lv.4] : OFFSET + MATCH,OFFSET : この記事の解説内容

MATCH の検索範囲を OFFSET で指定する。

  • 欠点解消 : 作業列を元データに追加しなくてもよい。
  • 欠点解消 : MATCH の検索範囲を任意に変更できる。
  • 欠点 : 検索条件は 1つ

- - - ↓ - - -

[Lv.5] : FILTER

  • 欠点解消 : 1つの関数で全てを抽出できる。
  • 欠点解消 : 複数条件の検索も可能
  • 欠点 : FILTER の 検索範囲が固定

補足

  • [Lv.1-3] データを並べ替えてから検索すると作業列は必要ない。
  • [Lv.1-3] の「作業列」や「並べ替え」は元データを加工している。
  • [Lv.4,5] は元データをそのまま利用できる。
  • [Lv.4 以外] 検索範囲を自動で拡張したい場合は OFFSET で範囲を指定する。

注 : 配列式を使う方法もあるようですが、詳しくないので割愛。


目次


以下は方法の紹介のみです。

具体的な使い方はリンク先にある別サイトの解説をご覧ください。


[Lv.4] MATCH、OFFSETの併用 (わたしが使っている方法)

[ 目次へ戻る ]

以下、解説


. A B C D E F
1 すいか . 検索語 バナナ . .
2 なし . リスト行数 10 . .
3 バナナ . 該当数 3 . .
4 みかん . 検索結果 . . .
5 りんご . 1 3 行目 [0]
6 みかん . 2 7 行目 [3]
7 バナナ . 3 9 行目 [7]
8 なし . . . . .
9 バナナ . . . . .
10 りんご . . . . .

[数値] : 作業セル


この方法の特徴

  • 元リストに手を加えていない
  • 作業セル数は、該当数のみ

作業セルが元リストではなく、 結果表示の方にあるのが特徴のひとつです。
これだけ見ても何も分からないと思います。
簡単にいうと、ひとつ見つけるごとに 検索範囲をずらしています。


サンプルデータ

[ 目次へ戻る ]

[追記 : 2014/3/8]

動作確認用のサンプルデータ (テキストファイル、3126バイト)
使い方は、テキストを読んでください。


保存方法

  • Windows :
    マウス右クリック、「対象をファイルに保存」
  • Mac :
    control+クリック、「対象をファイルに保存」
    または、対象をデスクトップなどにドラッグ

作業セルの中身

ぱっと見で分かると思いますが、 ひとつ前の結果をそのまま表示しています。

  • 3行目 [0]
  • 7行目 [3] (1つ目の結果)
  • 9行目 [7] (2つ目の結果)

ひとつ前の結果を表示しているだけなので、作業セルがなくても計算はできます。
(上セルの結果を参照すればよい)
何を計算しているか分かりやすくするために、作業セルを使って説明しています。


検索範囲をずらす方法

MATCH関数の範囲指定の部分にOFFSET関数を使います。
事前にD2セルでデータの行数を調べています。


OFFSET(基準セル,行位置修正,列位置修正,範囲行数,範囲列数)

  1. OFFSET($A$1,[0],0,D$2-[0],1)
  2. OFFSET($A$1,[3],0,D$2-[3],1)
  3. OFFSET($A$1,[7],0,D$2-[7],1)

[数値] : 作業セルの値


作業セルの部分は、実際は、セルの番地を入れます。
(下記、設定例参照)


検索範囲

  1. A1から10行分の範囲
  2. A4から 7行分の範囲
  3. A8から 3行分の範囲

[追記 : 2023/8/19]

1つ目の検索範囲

. A
1 すいか
2 なし
3 バナナ
4 みかん
5 りんご
6 みかん
7 バナナ
8 なし
9 バナナ
10 りんご

(match関数の結果 : 3)


2つ目の検索範囲 (3行ずらす)

. A
4 みかん
5 りんご
6 みかん
7 バナナ
8 なし
9 バナナ
10 りんご

(match関数の結果 : 4)
(1つ目の結果 : 3)
(2つ目の位置 : 4+3=7)


3つ目の検索範囲 (7行ずらす)

. A
8 なし
9 バナナ
10 りんご

(match関数の結果 : 2)
(2つ目の結果 : 7)
(3つ目の位置 : 2+7=9)



.

設定例

. A B C D E F
1 すいか . 検索語 バナナ . .
2 なし . リスト行数 10 . .
3 バナナ . 該当数 3 . .
4 みかん . 検索結果 . . .
5 りんご . 1 3 行目 [0]
6 みかん . 2 7 行目 [3]
7 バナナ . 3 9 行目 [7]
8 なし . . . . .
9 バナナ . . . . .
10 りんご . . . . .

ここでの仮定

  • リスト範囲 : A1:A10
  • 検索語 : D1
  • リスト行数 : D2
  • 数式入力セル : D5:D7
  • 作業セル : F5:F7

MATCH(検索値,範囲,条件)

例 : D5セル

  • 変更前 : MATCH(D$1,$A$1:$A$10,0)
  • 変更後 : MATCH(D$1,OFFSET($A$1,F5,0,D$2-F5,1),0)+F5

これを該当行数分 (D5:D7) コピペすれば良い。


分かりづらいので、項目ごとに分けた表

MATCH関数の設定 : D5セル

検索値 検索範囲 照合の型 修正
D$1 $A$1:$A$10 0 .
D$1 OFFSET($A$1,F5,0,D$2-F5,1) 0 +F5

[修正]は、MATCH関数とは別の計算です。


3ヶ所の「F5」の意味

  • 1つ目の F5 : 検索開始行をずらす。

    →条件に当てはまる値が見つかったセルの次の行にします。

  • 2つ目の -F5 : 検索行数を減らす。

    →そのままだと、検索範囲の終点が下にずれてしまうので修正します。

  • 3つ目の +F5 : ずらした分を元に戻す。

    →求めたい値は、先頭からの行数なので、 最後にずらした分を足します。
    これで先頭からの行数が分かります。


作業列(F列)は、省略可能です。
その場合は、「F5」を「D4」に変更してください。


使用例

実際は、行数を表示するだけでは、あまり意味がありません。
この結果をさらに作業セルとして、 その行の取り出したい列のデータを抽出しています。


. A B C D E F G H I
1 すいか 300円 A店 . 検索語 バナナ . . .
2 なし 150円 C店 . リスト行数 10 . . .
3 バナナ 120円 A店 . 該当数 3 . . .
4 みかん 100円 A店 . 検索結果 . . . .
5 りんご 100円 B店 . 1 120円 A店 [3] [0]
6 みかん 150円 B店 . 2 140円 C店 [7] [3]
7 バナナ 140円 C店 . 3 110円 B店 [9] [7]
8 なし 170円 B店 . . . . . .
9 バナナ 110円 B店 . . . . . .
10 りんご 130円 C店 . . . . . .

[数値] : 作業セル


設定例 : 価格・店名を取り出す

ここでもOFFSET関数を使っています。(理由は後述)

ここでの仮定

  • 品名 : A列
  • 価格 : B列
  • 店名 : C列
  • 数式入力セル : F5:G7
  • 作業セル : H5

OFFSET(基準セル,行位置,列位置)

例 : F5セル

  • OFFSET(B$1,$H5-1,0)

これを該当範囲 (この例では、F5:G7) にコピペする。


OFFSET関数の利点

OFFSET関数は、リストの量が変わっていく場合に便利です。


INDEX関数は、
範囲 (始点と終点) を指定しないといけません。
リストの量が変われば、範囲を指定しなおす必要があります。


一方、OFFSET関数は、
基準セル (始点) を指定するだけです。
そのため、リスト数が変わった時に、 範囲を指定しなおす必要がありません。

リスト行数は、事前に別セルで調べておくと、あとで楽になります。


OFFSET関数使用時の注意点

OFFSET関数の位置指定は、行数や列数ではなく、基準セルからの相対位置になります。
INDEX関数やLOOKUP関数のように、行数や列数を指定するわけではありません。

通常は、元の表の左上を基準セルにして、 参照したい座標から -1 する方法が 簡単です。


INDEX関数、OFFSET関数で、同じセルを指定する時の違い

  • INDEX(範囲,行,列)
  • OFFSET(基準セル,行-1,列-1)

追記 : [Lv.5] FILTER関数

[ 目次へ戻る ]


[修正 : 2023/6/22 | 追記 : 2018/11/11]

Excel 2021 以降や Googleスプレッドシートの場合、
専用の関数があるため、そちらを使ったほうが簡単です。



検索語に該当する行を全て抽出できるだけでなく、
検索語を複数にしたり、
複数の列の検索にも対応しているので、
使い勝手はいいと思います。

Excel 2019 以前 や LibreOffice Calc など、
他のソフトと互換性を持たせたい場合は、 別の方法を使ってください。


LibreOffice は拡張機能 ( Lox365 ) で追加可能

[追記 : 2023/8/19]


[Lv.1-3] 作業セルを使う方法

[ 目次へ戻る ]


. A B C D E F
1 すいか [0] . 検索語 バナナ .
2 なし [0] . リスト行数 10 .
3 バナナ [1] . 該当数 3 .
4 みかん [0] . 検索結果 . .
5 りんご [0] . 1 3 行目
6 みかん [0] . 2 7 行目
7 バナナ [2] . 3 9 行目
8 なし [0] . . . .
9 バナナ [3] . . . .
10 りんご [0] . . . .

[数値] : 作業セル


検索して見かけた方法のひとつに、「作業セル」を使う方法があります。


作業セルの簡単な説明

条件に当てはまった行のとなりの列に連番を表示することで、 複数の項目を取り出す方法。


気になる点

  • 元リストに手を加えている
  • 作業セルにムダが多い
    (検索語と関係ない行でも計算をしているため)

この方法については、こちらの記事を参考にしています。


おわりに

おおざっぱな説明でしたが、 わかってもらえたでしょうか?


一見、ブログの内容と関係ないようなネタですが、 記事を作る時に必要になってきます。

例えば、こんな時に

  • 同じ制作会社の作品を抽出とか
  • 同じジャンルの作品を抽出とか

このブログを良く見ている方には、 「ああ、あの記事か」と、思い当たる所があるでしょう。
おなじみのあの記事を作るために、 この「MATCH関数で 2つ目以降を見つける方法」 を使っています。


おわび

説明を簡単にするため、主要な部分以外は大幅に省略しています。
実際は、行数チェックとか、エラー表示回避とか...


わたしが実際に使っているソフトは、 ExcelではなくOpenOffice.orgのCalcです。
一応、Excelの記述に合わせて書いたつもりですが、 間違っていたらごめんなさい。


この記事では見つからないもの

「複数条件、複数列」など、 検索語や検索範囲を増やして絞り込む方法とは異なります。
これについては、ほかのサイトをご覧ください。

参考サイト

  • (リンク切れ) Excel一般機能:複数条件での検索方法 - ChiquilinSite

関連


この記事へのコメント