エクセル関数応用
複数条件で検索し、複数データを取得する方法

Excel関数の解説、関数サンプルと高等テクニック
公開日:2013年5月以前 最終更新日:2013-06-09

複数条件で検索し、複数データを取得する方法


各種条件でデータを絞る場合は、オートフィルタが一般的に使用されますが、
元のデータがあるシートで作業する為、間違ってデータを消してしまったり、使用する上で制約があります。


また、VLOOKUPでは、単一条件のみであり、しかも1件しか取得できません。

DGETでも1件しか扱えません。

これらの問題を解決する為の方法です。

IF関数
ISERROR関数
COUNTIF関数
ROW関数
SMALL関数
MATCH関数
INDEX関数


これらの関数を配列関数として組み込みます。

以下の表で説明します。

エクセル Excel サンプル画像
エクセル Excel サンプル画像


シート「データ」のデータを、シート「検索」2行目の指定条件で取得し、5行目以降に表示します。


「姓」「名」は完全一致、住所は部分一致で検索します。

シート「データ」に作業列を作成

  1. セルD2を選択
  2. =IF(検索!$A$2<>"",IF($A2=検索!$A$2,1,0),1)*IF(検索!$B$2<>"",IF($B2=検索!$B$2,1,0),1)*IF(検索!$C$2<>"",IF(ISERROR(FIND(検索!$C$2,$C9)),0,1))
  3. D3以降に、D2の数式をコピーする。
IF(ISERROR(FIND(検索!$C$2,$C9)),0,1)は、,IF(COUNTIF(C2,"*" & 検索!$C$2 & "*")>0,1,0))でも良い。

IF(検索!$A$2<>"",・・・で、条件が指定されている項目のみ条件対象としています。
また、住所は部分一致で検索する為、FINDまたはCOUNTIFを使用します。

これで、検索対象は「1」、対象外は「0」となります。
各関数の使用方法は、ヘルプを参照して下さい。

シート「検索」に数式を設定

  1. セルA5を選択
  2. {=IF(COUNTIF(データ!$D$2:$D$10,1)<ROW(データ!$A1),"",INDEX(データ!$A$2:$C$10,SMALL(IF(データ!$D$2:$D$10=1,ROW(データ!$A$2:$A$10)-1),ROW(データ!$A1)),MATCH(A$4,データ!$A$1:$C$1,0)))}
    {}を入力し、Ctrl+Shift+Enter。配列数式の
  3. A5の数式をB5,C5にコピーする。
  4. A5:C5の数式を6行目以降に、必要行数までコピーする。

以上で完成です。


シート「検索」のA2:C2に入力した条件で、5行目以降に複数データが表示されます。


まず、IF(COUNTIF(データ!$D$2:$D$10,1)<ROW(データ!$A1),"",・・・で、取得件数以上の行は空白にしています。

INDEXは、INDEX(配列,行番号,列番号)で、配列の中の行番号列番号で指定される要素を返します。

配列=データ!$A$2:$C$10
行番号=SMALL(IF(データ!$D$2:$D$10=1,ROW(データ!$A$2:$A$10)-1),ROW(データ!$A1))
列番号=MATCH(A$4,データ!$A$1:$C$1,0)

配列は、
シート「データ」のデータ範囲です。

行番号は、
SMALL(範囲,順位)で、範囲のなかで指定の順位に小さい値を返します。
また、ROW(データ!$A1)は5行目なら1、6行目はA2になるので2となります。
つまり、シート「データ」のD列が1の中から、1番目、2番目と、順にデータを取得しています。
さらに、IF(データ!$D$2:$D$10=1,・・・の部分が配列を使用していますので、配列数式として入力します。

列番号は、
MATCH(検査値, 検査範囲, 照合の型)で、検査値検査範囲の中で何番目にあるかを返す関数です。
シート「検索」の4行目の項目名でシート「データ」の項目名の位置を探し、その列のデータを取得するようにしています。

単一条件なら、作業列がなくてもできますが、複数条件の場合は、作業列を使用することで、変更しやすくなります。


また、作業列をさらに増やしたりすれば、シート「検索」の数式ももっと簡単にすることができます。

ここでは、いろいろなテクニックの紹介ということで、現実的で、極端に難しくない程度の数式になるようにしています。


ここで使用したエクセルのサンプルです。

はっきり言って、結構面倒です。

オートフィルタで済むならそれに越したことはありません。

また、マクロを使用すれば、さらに細かい指定も可能ですし、保守性も良いと思います。

ただ、関数を組み合わせることで、こんなこともできるという例とお考えください。



同じテーマ「エクセル関数応用」の記事

入力規則のリストを、2段階の絞り込みで作成2
ピポットテーブルの参照範囲を、追加・削除に自動対応で作成
関数を使って行列を入れ替える方法
複数条件で検索し、複数データを取得する方法
関数で銀行型丸め(最近接偶数への丸め)を行う方法
関数で他シートへ並べ替える方法(サンプル:ABC分析)
VLOOKUPを他の関数でやる方法
誕生日一覧から、指定誕生月の人を全員取り出す
徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)
セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)
グラフのデータ範囲を可変にする


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ