複数条件で絞り込む(配列)
昨日に引き続き、ArrayEditクラスの機能拡張に挑戦。
今日は、複数の条件で配列を絞り込んでみる。
今日も、なんちゃって個人情報のお世話になる。
今回は、5000人分の情報をダウンロード。この中から、以下を抽出する。
- 男性
- 既婚
- 愛知県在住
- ドコモユーザー
- カレーの食べ方は「奥ルー」
作戦としては、こんな感じだ。
- 既に作成済みのRowFilter関数を用いる。
- 条件の数を限定できないので、ParamArrayで受け取る。
- 絞り込んで抽出することから、今回は「残す」のみとする。
※「絞り込んだ結果を削除」はしない。
ParamArrayには、
- 処理する列番号
- 絞り込みキーワード
を交互に充てる必要がある。従って、これがずれた場合はエラーになってしまう。今回は・・・注意して使って欲しい、ということで。
既に作成済みの機能を繰り返し使うだけなので、今回は非常にシンプル。
' 行フィルター抽出の複数指定版 Public Function RowMultiFilter(rf_LookAt As Excel.XlLookAt, _ rf_header As Excel.XlYesNoGuess, _ ParamArray ColumnAndFilters()) Dim i As Long For i = 0 To UBound(ColumnAndFilters) Step 2 source_array = RowFilter(ColumnAndFilters(i + 1), _ CLng(ColumnAndFilters(i)), _ rf_LookAt, _ rf_header, _ rdRemain) Next RowMultiFilter = source_array End Function
それでは、早速テストしてみよう。先の条件で抽出してみる。
Enum 列名 名前 = 2 ふりがな アドレス 性別 年齢 誕生日 婚姻 都道府県 携帯 キャリア カレーの食べ方 End Enum
Sub test() Dim arr As Variant arr = ActiveSheet.UsedRange With New Seaquence arr = .TargetArray(arr).RowMultiFilter(xlPart, xlYes, _ 列名.性別, "男", _ 列名.婚姻, "既婚", _ 列名.都道府県, "愛知県", _ 列名.キャリア, "ドコモ", _ 列名.カレーの食べ方, "奥ルー") .TargetArray(arr).PasteArray "A1", "集計結果", , , ptTable, True End With End Sub
5000件であれば、1秒程度で処理が終わる(端末の性能にもよる)。
早速、正式にArrayEditに追加するとしよう。
infoment.hatenablog.com
参考まで。