VBAの勉強を始めてみた

色々試しています。

三つ以上の完全一致条件で絞り込みを行う(オートフィルター使用)

前回の「飛び飛びのセルからデータをコピーするマクロ」を使用し、コピーした複数データを検索条件(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内から「めぐすり」、「ポーション」、「ギサールのやさい」を検索条件としてクリップボードに取り込んでみます。

f:id:kouten0430:20180225161055j:plain

 

クリップボードにはこんな感じで、データが入ります。

f:id:kouten0430:20180225161647j:plain

 

 

取り込んだ完全一致条件を元に絞り込みを行う

 次に、絞り込みを行いたい列のセルを選択(例では、商品より下のデータのある場所ならどこでも)した状態で、下記のマクロを実行します。

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条件として、絞り込みが行われました。表にオートフィルターが設定されていなければ、オートフィルターを設定した上で絞り込みが行われます。既にオートフィルターが設定されていれば、絞り込みのみ行います。

f:id:kouten0430:20180225161205j:plain

 

 

ざっくりとコードの説明

Sub 飛び飛びのセルのデータをコピーする()

  • 前回と同じなので割愛

 

Sub 三つ以上の完全一致条件で絞込みを行う()

  • まず、クリップボードのデータを取り込み、Split関数で改行までを一つのデータとして配列に格納します。
  • 現在選択しているセルを含むアクティブセル領域をオートフィルターに設定します。
  • 現在選択しているセルの列に対して、配列のデータを元に絞り込みを行います。

※もちろん三つ未満の条件でも絞り込みできます

 

ここでポイントになるのが、引数の検索条件(Criteria1:=)に配列を使用するということです。配列を使用することで、3つ以上の完全一致条件を指定することができます。文字列にワイルドカードを付加し、部分一致条件とすることもできますが、その場合、配列に3つ以上の部分一致条件が入っていると、正しく絞り込みが行われません(というか、絞り込みの結果何も表示されなくなる)。不思議ですね。

 

 

次回予告

次回は、上記の不具合?仕様?に対抗すべく、オートフィルターに頼らない絞り込みのマクロを作ってみたいと思います。ちなみに私は、特にFFが好きな訳じゃありません←(ぇ)