重複データ検索関数

重複データ検索関数 AcuMatch

VBAで作ったユーザー定義関数です。ダウンロードは最下行にて行えます

重複するデータを抽出する場合、オートフィルタでしぼりこめば済むことなのでしょうが、SHEETのフォルムに重きを置いた場合(データのあるSHEETを操作するのではなく、別のシートに抽出結果として表す等)、何とか関数でできないものかと思ったのが始まりです。つまり、データ(データベース)のあるSHEETは、データとして、それそのものをソートしたり、折りたたんだりなどの操作は行わず残したままで、抽出する目的で制作しました。

AcuMatch というのが、その中核となる関数です。

この関数の特徴は、検索したい文字列と同じデータ および 検索したい文字列を含むデータ の存在する位置(検索にあてたレコード範囲の何番目にあるか)を抽出して、カンマ区切りのテキストデータとして表示する(書き出す)ものです。

スクリーンショット 2016-02-13 17.19.18

 

上の図の Sheet1にある30件のデータを用いて、説明します。

住所のレコード (Sheet1!$D$2:$D$31) の中に”鵜曽野西”が存在する位置を拾うこととします。

スクリーンショット 2016-02-14 01.12.53

Sheet2のB3セルには【=AcuMatch($B$8,Sheet1!$D$2:$D$31)】と入力されてます。$B$8[B8]セル(黄色で塗りつぶされている「鵜曽野西」という文字列)が、検索にあてる文字列です。”鵜曽野西”という文字列が、Sheet1の$D$2:$D$31の範囲を検索していって、該当する位置を戻り値として書き出します。結果Sheet2のB3セルには 1,7,12,18,21,27 と表示されます。これが何を意味するかというと、Sheet1の$D$2:$D$31の30個のレコード中の1個目と7個目と12個目と18個目と21個目と27個目 に”鵜曽野西”が含まれるデータが存在しますよ ということです。

AcuMatch は基本的には、該当するデータが存在するレコード位置を返すわけですが、それだけにとどまりません。オプション値を指定すると、その位置のデータそのものを返してきます。Sheet2のB4セルがその結果です。

  • このB4セルには、【=AcuMatch($B$8,Sheet1!$D$2:$D$31,1)】と入っています。オプションとして 1 と入れると、位置ではなく、データそのもので返してきます。
  • またB5セルには、【=AcuMatch($B$8,Sheet1!$D$2:$D$31,-1)】と入力されており、オプション値を -1  にした場合のものです。R1C1形式(行 列)で位置を示しています。1  1 とは1行目の1列目に、7  1 ならば7行目の1列目に該当データが存在するということです。なおこの際の行と列の区切り文字は半角スペースにしてあります。

AcuMatch はまだまだ機能があります。2つ目のオプションです。Sheet2のB6セルがその結果です。ここは、【=AcuMatch($B$8,Sheet1!$D$2:$D$31,1,-2)】となっており、一つ目のオプションで 1 とし、データそのもので返すことを指定した上で、二つ目のオプションには -2 を入れたものです。この二つ目のオプションは、オフセットの取り出し列を表しています。検索する範囲がSheet1!$D$2:$D$31 、つまりD列なので、取り出す際には -2列(2つ前の列=B列)のデータにするということです。つまり、”鵜曽野西”に住んでいるのは、”赤井 葉菜,白井 聡史,只見 照代,滝 裕子,片山 由佳,相模 武蔵” ということを表しています。

ここで、AcuMatch の構文を書いておきましょう。

AcuMatch(SrcSt As String, BoundAR As Range, Optional hyoujikeitai As Integer = 0, Optional offsetval As Long = 0)

AcuMatch(検索文字列, 検索範囲, [表示形態], [オフセット値])   です。※[ ]内はオプション

 

※これで、該当データがどうあるかを抽出はできましたが、カンマ区切りのこの値をどう使うかが、次の課題となります。

 

テキストデータ読み込み関数 CSVChoose

カンマ区切りのテキストデータを配列として読み込み、その n番目のデータを取り出す関数です。上記図のB9~B18セルに、CSVChoose関数が使われています。ちなみにB9セルは、【=CSVChoose($A9,$B$6)】となっています。

CSVChoose の構文は、

CSVChoose(n番目 As Double, strArray As String,Optional 抽出形式 As Integer = 0, Optional エラー除去 As Boolean = True) As Variant

CSVChoose(n番目, 配列値, [抽出形式], [エラー除去])  です。※[ ]内はオプション

AcuMatch によって取り出されたカンマ区切りの値($B$6)を参照し、それを配列として読み込み、$A9にある値 1 (この場合1番目)によって、”赤井 葉菜” を取り出しています。

スクリーンショット 2016-02-14 12.18.44

上記のように、

重複データ検索関数 AcuMatch と テキストデータ読み込み関数 CSVChoose をくみあわせて使用することにより、大元のデータベースを操作せずに抽出することが可能となります。

❤重複データ検索関数 と 関連関数群

  • AcuMatch 重複データ検索テキスト抽出関数
  • ListUP    重複データは1つにまとめてリストとして抽出する関数
  • ArrayUP    重複しようがしまいが全てを抽出する関数

❤テキストデータ読み込み関数 と 関連関数群

  • CSVChoose   カンマ区切りのテキストデータを読み込み、その配列中のn番目を抽出
  • CSVVlookup カンマ区切りのテキストデータを読み込み、n番目に一致するデータの抽出
  • CSVCount     カンマ区切りのテキストデータの配列を読み込み、その配列の個数を抽出

AMatch(旧AcuMatch)を加えて、5.8Plus としました。

ACMatch 追加 8/15 = 上記AMatch と AcuMatch を統合し、6.0 としました。

AMatchが完全一致抽出用、AcuMatchが近似一致用 だったものを統合し、オプションで切り替えられるようにし、引数(オプション)の順序を エクセル標準関数 Vlookup にならって、変更しました。

これらの関数群のダウンロード⇒RuisekikensakuBOX_5.8Plus

ACMatchを加えた6.0のDL⇒RuisekikensakuBOX_6.0

微調整版ACMatchを加えた6.1のDL⇒RuisekikensakuBOX_6.1

11/15 ACMatch CSVChoose  を まとめた重複データ検索累積抽出関数BOX_1.0をUPしました。

New)重複データ検索累積抽出関数BOX_1.0のDL⇒duplicate-data-accumulation-functionbox_ver1-0

 

 

コメントを残す

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