複数条件で絞り込む(配列)

昨日に引き続き、ArrayEditクラスの機能拡張に挑戦。
今日は、複数の条件で配列を絞り込んでみる。
f:id:Infoment:20191027180223p:plain

今日も、なんちゃって個人情報のお世話になる。
f:id:Infoment:20191027191702p:plain

今回は、5000人分の情報をダウンロード。この中から、以下を抽出する。

  1. 男性
  2. 既婚
  3. 愛知県在住
  4. ドコモユーザー
  5. カレーの食べ方は「奥ルー」

作戦としては、こんな感じだ。

  1. 既に作成済みのRowFilter関数を用いる。
  2. 条件の数を限定できないので、ParamArrayで受け取る。
  3. 絞り込んで抽出することから、今回は「残す」のみとする。
    ※「絞り込んだ結果を削除」はしない。

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秒程度で処理が終わる(端末の性能にもよる)。
f:id:Infoment:20191027193434g:plain

早速、正式にArrayEditに追加するとしよう。
infoment.hatenablog.com


参考まで。