拡張累積検索関数

エクセルを使っていて、データを検索・抽出しようとする際、困ったことはありませんか?
1件だけ抽出できればいいのであれば、VLOOKUP関数(HLOOKUP関数・MATCH関数)等でまかなえますが、一致するデータが複数ある時(重複データ検索)は、標準のEXCEL関数では最初の1件のみ抽出して終わってしまいます。
解決法としては、「オートフィルタ」を用いて該当データを探ることとなるのですが、行をたたんでの表示となる故、体裁として自由度のあるものではありませんでした。
何とか、関数を用いて重複データをスマートに抽出できないかと思い、ユーザー定義関数(VBAによる自作関数)での作成を試みました。
その結果

GxMatch
GDxVlookup
GDxHlookup

が生まれたわけです。

しかし、上記の関数には欠点があります。これらの関数を使えば使うほど重複するデータをその都度探しに行くため、処理が重くなってしまうことです。重複するデータを探す処理は1回だけにとどめられれば良いのですが、関数の性質上そうもいきませんでした。

この問題を解決するにあたり、処理の分割(関数を分割)してみました。

① 重複するデータの位置を累積して、テキストとして書き出すユーザー定義関数

AcuMatch

② ①により書き出されたテキスト(CSVカンマ区切り)を基にし、それを配列として読み込 み表示させるユーザー定義関数

CSVVLookup
CSVChoose

AcuMatchの結果を表示させる作業用セルとして、1つセルを使うことになりますが、処理は単純化されたと思います。

 
検索値に該当するデータを累積検索し、その位置や値(データ)を抽出する関数群(一括処理型モジュールのため、重くなりがち)
GxMatch  GDxVlookup  GDxHlookup  MutVlookup
 
GxMatch(何番目, 条件, 検索範囲)
検索範囲からn番目に発見された検索値(条件)の位置を返す関数

何番目:複数該当する値が存在する際の「何個目」の位置をとりだすか。
条件:検索するデータ(値)[条件には aa* 等のワイルドカードも使用可]
検索範囲:検索にかける範囲を指定します(注:範囲は単一方向の範囲として入力のこと)
レコード(縦方向)なら、単一列 $D$4:$D$17 等
フィールド(横方向)なら、単一行 $D$4:$Q$4 等
◇戻り値=検索範囲中の何番目のデータのある位置(何行目か)を返します。
何番目のデータが存在しない場合は 0 を返します。

 
GDxVlookup(n番目,検索値,検索範囲,検索値の存在する列,抽出列,<抽出形式>,<エラー除去>)
検索範囲からn番目に発見された検索値の位置にある値を返す関数

n番目:複数該当する値が存在する際の「何個目」の位置をとりだすか。
検索値:検索するデータ(値)〈条件には aa* 等のワイルドカードも使用可〉
検索範囲:検索にかける範囲を指定します。
存在列:検索値が存在する列(何列目か)を指定。
抽出列:検索範囲中の実際に取り出す列(何列目か)を指定。
抽出形式<オプション指定>省略可:検索範囲中から抽出するデータの戻り値の形式を指定。 省略時=0
0(標準)=値で抽出,1=該当行位置(GxMatch と同じとなる), 2=該当番地位置(Row,Col)
エラー除去<オプション指定>省略可:エラーの際にヌルストリングを返すかどうか。 省略時=1(エラー除去を行う)
◇戻り値=検索値が存在する列のn番目のデータのある相対位置(何行目,何列目)にある値を返します。
・エラー除去オプションは省略できますが、その際は True[1]とみなされます。
該当データが見つからない場合、エラー除去が False[0]の時は 0 を返し、True[1]の時は、””[ヌルストリング]を返します。

 
GDxHlookup(n番目,検索値,検索範囲,検索値の存在する行,抽出行,<抽出形式>,<エラー除去>)
検索範囲からn番目に発見された検索値の位置にある値を返す関数

GDxVlookup 関数の、行と列を入れ替えて作成したものです。

 
MutVlookup(n番目,検索値,検索範囲,抽出列,<抽出形式>,<エラー除去>)
GDxVlookupのモジュールを用いて、いままで単一列(単一レコード)のみの検索検索)であったものを、検索範囲中からすべて拾い上げるようにしたもの

n番目:複数該当する値が存在する際の「何個目」の位置をとりだすか。
検索値:検索するデータ(値)〈条件には aa* 等のワイルドカードも使用可>
検索範囲:検索にかける範囲を指定します。
抽出列:検索範囲中の実際に取り出す列(何列目か)を指定。
抽出形式<オプション指定>省略可:検索範囲中から抽出するデータの戻り値の形式を指定。 省略時=0
0(標準)=値で抽出,1=該当行位置(GxMatch と同じとなる), 2=該当番地位置(Row,Col)
エラー除去<オプション指定>省略可:エラーの際にヌルストリングを返すかどうか。 省略時=1(エラー除去を行う)
◇戻り値=検索値が存在する範囲のn番目のデータのある相対位置(何行目,何列目)にある値を返します。
エラー除去オプションは省略できますが、その際は True[1]とみなされます。
該当データが見つからない場合、エラー除去が False[0]の時は 0 を返し、True[1]の時は、””[ヌルストリング]を返します。
【例】=MutVlookup(1,”東京”,$C$3:$C$22,3,0,1)
=MutVlookup(B3,D$2,$C$3:$C$22,3,0,1) ・・・・

選択範囲のデータをカンマ区切りのデータとして書き出す関数群
AcuMatch  ListUP  ArrayUP
 
 
AcuMatch(SrcStr , BoundAR,〈hyoujikeitai〉,〈offsetval〉 )
条件に見合う検索値の存在する位置を抽出し、カンマ区切りで書き出す(重複データ検索)オプションにて位置ではなく、データとして抽出可にした。旧AcuMatch の機能拡張版
オプション①変更 2015.2.15  行と列の相対表示書出し追加

条件(SrcStr):検索するデータ(値)[条件には aa* 等のワイルドカードも使用可]
検索範囲(BoundAR):検索にかける範囲を指定します(注:範囲は単一方向の範囲として入力のこと)
レコード(縦方向)なら、単一列 $D$4:$D$17 等
フィールド(横方向)なら、単一行 $D$4:$Q$4 等
◇戻り値=BoundAR中に条件(SrcStr)に見合う検索値の存在する位置をすべて引き抜きます。
値は文字列で表示されます。戻り値表示 例:3,8,14,15,19,27
◇オプション1(hyoujikeitai):省略時(0)
0: データでは返さない レコード位置を数値(文字列)でかえす(AcuMatchと同じ)
1: データとしてかえす
-1: BoundAR中の行列の相対位置表示(区切りは半角スペース)
◇オプション2(offsetval):省略時0:取り出すデータの位置を表す
BoundARの列を基準として、そこからオフセット(BoundARの列ならば0、その前列なら-1、一つ先の列なら1)の値を入れる

 
ListUP(選択範囲 , 〈件数〉,〈isnul〉)
検索範囲(BoundAR)中に存在する重複データは1つにまとめ、リストとしてCSV形式(「,」区切り)のテキストデータとして書き出す(重複データ割愛・まるめ検索2014.12.18 オプション②〈isnul〉追加
空白データ(セル)は詰めて書き出すかのオプション

オプション①True時は、その件数を表示します
ListUP(B2:B21)   ⇒○○○,△△△,×××,◇◇◇,
ListUP(B2:B21,true)⇒ 4
オプション②True時は、空白セルを割愛して(詰めて)表示します

 
 ArrayUP(検索範囲,  〈件数 〉)
検索範囲(BoundAR)中に存在するデータをすべて、(重複データもまるめずに)リストとしてCSV形式(「,」区切り)のテキストデータとして書き出す(配列検索)

オプションTrue時は、その件数を表示します
ArrayUP(B2:B21)   ⇒○○○,△△△,×××,◇◇◇
ArrayUP(B2:B21,true)⇒ 4

上記AcuMatch,ListUP,ArrayUPにより書き出されたカンマ区切りのテキストデータを配列として読み込み、表示する関数群
CSVVLookup  CSVChoose  CSVCount
 
CSVVLookup(n番目,配列値,対象範囲,<対象列>,<エラー除去>)
カンマ区切りのテキストデータの配列を読み込み、その配列に見合う値を指定した範囲から抽出するもの

n番目(banme):複数該当する値が存在する際の「何個目」の位置をとりだすか。
配列値(strArray):CSV形式(コンマ区切り)のテキストデータ(値)または存在するセル番地。
対象範囲:検索にかける範囲を指定します。
対象列<オプション指定>省略可:対象範囲中から実際に取り出す列(何列目か)を指定。省略時=1 ⇒ 1列目のデータを抽出
エラー除去<オプション指定>省略可:エラーの際にヌルストリングを返すかどうか。 省略時=1(TRUE) ⇒ エラー除去を行う
【入力例】
=CSVVLookup(3,”2,5,7,10,18″,$AB$3:$AH$27,2,True) または
=CSVVLookup(3,$W$1,$AB$3:$AH$27,2,True)

 
CSVChoose(n番目,配列値,<エラー除去>)
カンマ区切りのテキストデータの配列を読み込み、その配列中のn番目を抽出する

n番目:複数該当する値が存在する際の「何個目」の位置をとりだすか。
配列値(strArray):CSV形式(コンマ区切り)のテキストデータ(値)または存在するセル番地。
エラー除去<オプション指定>省略可:エラーの際にヌルストリングを返すかどうか。 省略時=1(TRUE) ⇒ エラー除去を行う
【入力例】
=CSVChoose(3,”2,5,7,10,18″,True) または
=CSVChoose(3,$W$1,True)

 
CSVCount(テキストデータ)
カンマ区切りのテキストデータの個数(件数)を表示

テキストデータ(CSVData):CSV形式(カンマ区切り)のテキストデータ(値)または存在するセル番地。
カンマ区切りのテキストデータの個数を表示
例:=CSVCount($B$3), =CSVCount(“6,12,8,3,17,9”)

 

ダウンロードはこちら⇒ RuisekikensakuBOX Ver5.0Plus.zip

フリーソフトです。Zip形式ですが、解凍すると、xlsの標準エクセルファイルとなります。(アドイン形式ではありません)
使う際には、ご自分のエクセルBOOKのVBEの「標準モジュール」-「Module1」等に本コードをコピペしてお使いください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です