ES000010_VBAエキスパート(ExcelVBAスタンダード)合格講座/第十回:オートフィルター

VBAエキスパート(ExcelVBAスタンダード)合格講座/第十回:オートフィルター ExcelVBA Standard

このページの内容について

このページは、VBAエキスパート(ExcelVBAスタンダード)試験合格講座の第十回記事です。公式テキスト第6章「セルの検索とオートフィルターの操作」の内容について解説します。自分でも手を動かしながら読み進めてください。主に講座受講者の復習での利用を想定しています。

AutoFilterメソッド

Excelには表にフィルターをかけて絞り込みや並び替えを行う機能があります。RangeオブジェクトのAutoFilterメソッドは、このフィルターの絞り込み機能をマクロで呼び出すことができます。

文法

引数役割
FieldVariant(Long)絞り込みをしたい列番号を指定します。左から1、2、3…。
Criteria1Variant絞り込みの条件を指定します。ワイルドカードを使用できます。
OperatorXlAutoFilterOperatorxlAnd ・・ Criteria1とCriteria2の両方を満たす(既定値)
xlOr ・・ Criteria1とCriteria2のいずれかを満たす
xlFilterValues ・・ Criteria1に指定した配列の要素のいずれかを満たす
その他は公式サイト参照
Criteria2Variant絞り込み条件2。Criteria1の補助。
VisibleDropDownVariant(Boolean)True ・・・ フィルターのドロップダウン矢印を表示(既定値)
False ・・・ フィルターのドロップダウン矢印を非表示

AutoFilterメソッドには、多くの引数があります。特にOperatorで指定する値によって、各引数の持つ意味や、実行結果に様々な違いがでます。ここでは公式テキストの説明範囲に従い、一般的な「値(表示値)」による絞り込みについて解説をします。

データの準備

AutoFilterメソッドでは、表を扱うためサンプルデータをランダムで書き出すコードを用意しました。サンプルデータの利用は任意です。ご自身の業務で使用している表や、オリジナルのデータを使っても解説に支障はありませんが、適宜、自身で読み替えてください。以降の解説ではマクロが記述されているブックの1番目(一番左)のシートにExcelが表とみなせるデータがあることを前提に解説をします。

サンプルコード(クリックでコピー)

Private Sub SetSalesTran()

Dim ws As Worksheet
Dim r As Long, last_row As Long
Set ws = ThisWorkbook.Worksheets(1)

last_row = 31

Call ws.Range("A1").CurrentRegion.Clear
ws.Range("A1:G" & last_row).Borders.LineStyle = xlContinuous
ws.Range("A1:G1").Font.Color = vbWhite
ws.Range("A1:G1").Interior.Color = RGB(126, 53, 14)

r = 1
ws.Cells(r, 1).Value = "売上ID"
ws.Cells(r, 2).Value = "商品ID"
ws.Cells(r, 3).Value = "商品名"
ws.Cells(r, 4).Value = "販売単価"
ws.Cells(r, 5).Value = "個数"
ws.Cells(r, 6).Value = "割引率"
ws.Cells(r, 7).Value = "税抜売上"

For r = 2 To last_row Step 1
ws.Cells(r, 1).Value = "U" & Format(r - 1, "0000")
ws.Cells(r, 2).Value = "F00" & Int(Rnd * 5 + 1)
Select Case ws.Cells(r, 2).Value
Case "F001"
ws.Cells(r, 3).Value = "みかん"
ws.Cells(r, 4).Value = "100"
Case "F002"
ws.Cells(r, 3).Value = "りんご"
ws.Cells(r, 4).Value = "350"
Case "F003"
ws.Cells(r, 3).Value = "ぶどう"
ws.Cells(r, 4).Value = "500"
Case "F004"
ws.Cells(r, 3).Value = "すいか"
ws.Cells(r, 4).Value = "800"
Case "F005"
ws.Cells(r, 3).Value = "めろん"
ws.Cells(r, 4).Value = "1200"
End Select
ws.Cells(r, 5).Value = Int(Rnd * 10 + 1)
ws.Cells(r, 6).Value = WorksheetFunction.Ceiling(Int(Rnd * 20) - 4, 5) & "%"
ws.Cells(r, 7).Formula = "=RoundDown(D" & r & "*E" & r & "*(1-F" & r & "),0)"
Next r

End Sub
実行結果

上記サンプルコードは、以下のようなランダムなサンプル表を出力します。

基本の使い方

AutoFilterメソッドには多くの引数がありますが、すべて省略可能な引数です。すべての引数を省略して実行すると、フィルターボタンを押したときと同じ動作になります。

サンプルコード(クリックでコピー)
Private Sub Test_AutoFilter()

Dim ws As Worksheet
Dim rng As Range

Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("A1")

Call rng.AutoFilter

End Function
実行結果

上記サンプルコードは、セル「A1」を含む表にフィルターボタンを押したときと同じ処理をします。つまり、フィルターが設定されているときに実行するとフィルターが解除され、設定されていないときに実行するとフィルターが設定されます。実行ごとに下記のようにフィルターがON/OFFされます。

フィルターをセットしただけでは、まだ何も「絞り込み」がされていない状態です。

商品名「みかん」のみを絞り込みする

商品名列のプルダウンの矢印を押して、みかん以外のチェックを外した状態をマクロで再現します。AutoFilterメソッドの第一引数「Feild」に商品名の列番号である「3」、第二引数「Criteria1」に絞り込み条件である「みかん」を指定します。

サンプルコード(クリックでコピー)
Private Sub Test_AutoFilterMikanOnly()

Dim ws As Worksheet
Dim rng As Range

Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("A1")

Call rng.AutoFilter(3, "みかん")

End Sub
実行結果

上記サンプルコードを実行すると、商品名「みかん」のみが絞り込みされました。データはランダムなので、みなさんの結果と私の結果は異なっています。

複数の商品名で絞り込む

同じ列に対して複数の条件で絞り込みを実行する方法はいくつかあります。ここでは3つ紹介します。

Operator「xlOr」を使う方法

AutoFilterメソッドの第三引数「Operator」には「xlOr」をは、第二引数「Criteria1」と第四「Criteria2」のいずれかに一致するように絞り込みます。

サンプルコード(クリックでコピー)
Private Sub Test_AutoFilter_xlOr()

Dim ws As Worksheet
Dim rng As Range

Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("A1")

Call rng.AutoFilter(3, "みかん", xlOr, "ぶどう")

End Sub
実行結果

上記サンプルコードを実行すると、商品名「みかん」と「ぶどう」が絞り込みされました。Operator「xlOr」を指定すると、Criteria1またはCriteria2の条件に一致するものが絞り込まれます。こ

Operator「xlFilterValues」を使う方法

「xlOr」を使う方法だと、条件は最大2つまでしか指定できません。それ以上の条件を指定したい場合「xlFilterValues」を指定します。「xlFilterValues」は一次元配列を使って条件を指定することができます。

サンプルコード(クリックでコピー)
Private Sub Test_AutoFilter_xlFilterValues()

Dim ws As Worksheet
Dim rng As Range
Dim arr(0 To 2) As String

Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("A1")

arr(0) = "みかん"
arr(1) = "ぶどう"
arr(2) = "すいか"

Call rng.AutoFilter(3, arr, xlFilterValues)

End Sub
実行結果

上記サンプルコードを実行すると、商品名「みかん」と「ぶどう」が絞り込みされました。Operator「xlOr」を指定すると、Criteria1またはCriteria2の条件に一致するものが絞り込まれます。

番外編:Operator「xlAnd」を使う方法

試験範囲ではありませんが「xlAnd」を使用する場面について解説します。「xlOr」はCriteria1とCriteria2のいずれかに一致するものを絞り込む機能でした。対になる「xlAnd」はCriteria1とCriteria2の両方に一致するものを絞り込む機能です。しかし「Field(列番号)」は1つしか指定できないため「xlAnd」を機能させるには、同じ列内で「2つの条件を満たされる」必要があります。「みかん」と「ぶどう」など、定数を指定してもこの条件は機能しません。そのため「xlAnd」は条件にワイルドカードを指定することを想定した機能であると考えられます。

サンプルコード(クリックでコピー)
'■「xlAnd」の意味のない使い方
Private Sub Test_AutoFilter_xlAnd_Failed()

Dim ws As Worksheet
Dim rng As Range

Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("A1")

Call rng.AutoFilter(3, "みかん", xlAnd, "ぶどう")

End Sub

'■「xlAnd」を使うシーン
Private Sub Test_AutoFilter_xlAnd_Sucess()

Dim ws As Worksheet
Dim rng As Range

Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("A1")

Call rng.AutoFilter(3, "み*", xlAnd, "*ん")

End Sub
実行結果

上記サンプルコード上段では「みかん」かつ「ぶどう」に絞り込みしようとするため、なにも表示されません。下段では「み」から始まり「ん」で終わるという条件で絞り込みが実行できます。実行後にユーザー設定のフィルターを見ると以下のように設定されています。

複数の列に条件を指定する方法

ここまで1つの列の絞り込みについて解説してきましたが、実務では複数列の絞り込みがしたい場面の方が多いかと思います。これはAutoFilterを連続して実行すると実現できます。

サンプルコード(クリックでコピー)
Private Sub Test_AutoFilter_Multi()

Dim ws As Worksheet
Dim rng As Range

Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("A1")

Call rng.AutoFilter(3, "めろん")
Call rng.AutoFilter(6, "0%")

End Sub
実行結果

上記サンプルコードを実行すると、もっとも単価の高い商品「めろん」を割引なし(割引率0%)で購入してくれたリストを表示します。

なお「0%」は本来「0」と同義ですが、条件に「0」を指定しても何も絞り込まれません。これはAutoFilterがデフォルトでは、表示値をもとにフィルターをする機能であるためです。

絞り込み後の件数や合計を得る

Excelの「SUBTOTAL」関数を使うとフィルターによる絞り込み後の表から件数や合計を得ることができます。

サンプルコード(クリックでコピー)
Private Sub Test_SubTotal()

Dim ws As Worksheet
Dim rng As Range

Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("A1")

Call rng.AutoFilter(3, "めろん")
Call rng.AutoFilter(6, "0%")

Debug.Print WorksheetFunction.Subtotal(9, ws.Range("G:G"))

End Sub
実行結果

上記サンプルコードを実行すると、割引なしメロンの売り上げ合計をイミディエイトウィンドウに出力します。

【PR】VBAエキスパート試験対策記事

当サイトでは、オデッセイコミュニケーションズ社が運営する試験であるVBAエキスパートExcel VBA ベーシックExcel VBA スタンダード)の出題範囲をベースに用語や各種関数の解説などを行っています。試験合格に向けて必須と言われる公式テキストに沿って解説をしています。受験をするか悩んでいる方、テキストとは別視点の解説を見てみたい方、受験はしないがExcelVBA(マクロ)に興味がある方へ向けた記事です。

Comment