三つ以上の完全一致条件で絞り込みを行う(オートフィルター使用)
前回の「飛び飛びのセルからデータをコピーするマクロ」を使用し、コピーした複数データを検索条件(OR条件)として絞り込みを行うマクロを作成してみたいと思います。
目次
完全一致条件に使用する文字列を取り込む
まず、前回の飛び飛びのセルからデータをコピーするマクロを再掲します。
Sub 飛び飛びのセルのデータをコピーする() Dim myRange As Range Dim V As String Dim myLib As Object Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '参照設定なしでDataObjectのインスタンスを生成する For Each myRange In Selection.SpecialCells(xlCellTypeVisible) '可視セルのみに処理を行う If myRange.Address = myRange.MergeArea(1).Address Then '結合セルの場合は左上の値のみ取り出す V = V & myRange.Value & vbCrLf End If Next myRange V = Left(V, Len(V) - 2) '最終行の改行区切りを取り除く(CrLfは2文字) myLib.SetText V '変数の値をDataObjectに格納する myLib.PutInClipboard 'DataObjectのデータをクリップボードに格納する End Sub
同一Sheet、別Sheet、別Bookなどから検索条件にしたい文字列の入ったセルを選択(複数可)した状態で上記のマクロを実行します。とりあえず、例として同一Sheet内から「めぐすり」、「ポーション」、「ギサールのやさい」を検索条件としてクリップボードに取り込んでみます。
クリップボードにはこんな感じで、データが入ります。
取り込んだ完全一致条件を元に絞り込みを行う
次に、絞り込みを行いたい列のセルを選択(例では、商品より下のデータのある場所ならどこでも)した状態で、下記のマクロを実行します。
Sub 三つ以上の完全一致条件で絞込みを行う() 'クリップボードの文字列を参照し、OR条件で絞込みします '現在選択しているセルの列をフィルタリングします 'シートにオートフィルターがない場合は、そのセルを含むアクティブセル領域をオートフィルターに設定した上で絞込みします Dim XS As Integer Dim XP As Integer Dim V As Variant Dim myLib As Object Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") '参照設定なしでDataObjectのインスタンスを生成する myLib.GetFromClipboard On Error Resume Next V = myLib.GetText On Error GoTo 0 If Not IsEmpty(V) Then V = Split(CStr(V), vbCrLf) ActiveCell.AutoFilter Field:=1 '引数は既にオートフィルターがある場合に解除しないためのダミー XP = ActiveCell.Column '現在選択しているセルの列番号を取得 XS = ActiveCell.Worksheet.AutoFilter.Range.Column 'オートフィルターが適用される範囲の左端の列番号を取得 XP = XP + 1 - XS '抽出条件の対象となる列番号 ActiveCell.AutoFilter Field:=XP, Criteria1:=V, Operator:=xlFilterValues Else MsgBox "クリップボードにデータがありません!" End If End Sub
これで、クリップボード内の文字列をOR条件として、絞り込みが行われました。表にオートフィルターが設定されていなければ、オートフィルターを設定した上で絞り込みが行われます。既にオートフィルターが設定されていれば、絞り込みのみ行います。
ざっくりとコードの説明
Sub 飛び飛びのセルのデータをコピーする()
- 前回と同じなので割愛
Sub 三つ以上の完全一致条件で絞込みを行う()
- まず、クリップボードのデータを取り込み、Split関数で改行までを一つのデータとして配列に格納します。
- 現在選択しているセルを含むアクティブセル領域をオートフィルターに設定します。
- 現在選択しているセルの列に対して、配列のデータを元に絞り込みを行います。
※もちろん三つ未満の条件でも絞り込みできます
ここでポイントになるのが、引数の検索条件(Criteria1:=)に配列を使用するということです。配列を使用することで、3つ以上の完全一致条件を指定することができます。文字列にワイルドカードを付加し、部分一致条件とすることもできますが、その場合、配列に3つ以上の部分一致条件が入っていると、正しく絞り込みが行われません(というか、絞り込みの結果何も表示されなくなる)。不思議ですね。
次回予告
次回は、上記の不具合?仕様?に対抗すべく、オートフィルターに頼らない絞り込みのマクロを作ってみたいと思います。ちなみに私は、特にFFが好きな訳じゃありません←(ぇ)