今回の記事では、オートフィルターをマクロ・VBAで実行する方法について解説します。
フィルターの手順をマクロで登録する方法から、VBAを使い、条件を指定してデータを抽出する方法まで、初心者の方にもわかりやすく手順を紹介します。
VBAでフィルター機能を使うことができると作業効率も良くなりますので、ぜひ参考になさってください。
VBAのそのほかの記事は下記をご覧ください。
【初心者向け】エクセルのマクロの作り方・使い方・ボタンの作成
Excel(エクセル)を使いこなすのって結構難しいです。
Excel(エクセル)は、出来ることが多くて覚えるのがかなり大変です。
そんな方のためにExcel(エクセル)の使い方や、関数のコツ、ピボットテーブルやグラフなどをまとめたページをライン登録で無料プレゼントしております。
Excel(エクセル)以外にも、Word(ワード)、パソコン基本、PowerPoint(パワーポイント)、Mac、ブラインドタッチなどの特典もございます。
ご興味ある方は下記よりご登録ください。
マクロVBAでフィルターを実行
マクロの場合
マクロでフィルターを実行する場合は、通常のマクロの記録の手順で、抽出の手順を記録すればOKです。
マクロの記録でフィルターの手順を記録すれば、あとはボタンを押すだけで簡単に抽出作業を実行することができます。
しかし、マクロでフィルターを実行した場合、記録したマクロを編集しない限り、その手順しか実行することができませんので、特定の処理をする場合はマクロが簡単です。
VBAの場合
VBAでフィルターを実行する場合は「AutoFilterメソッド」を活用します。
プログラムで直接抽出したい条件を入力することもできますが、VBAでプログラムを作る場合は、さらにInputBox関数を一緒に使うことで、抽出条件をその都度変更することが可能です。
では、VBAでフィルターを使ってデータを抽出する方法について詳しく解説します。
AutoFilterメソッドとは?
AutoFilterメソッドとは
AutoFilterメソッドを使うと、フィルターを適用して条件に一致したデータを抽出することができます。
抽出するための条件は、通常のエクセル操作同様、指定した条件に完全に一致するものや、比較演算子を使った数値での条件指定、あるいはワイルドカードを使った指定方法などがあります。
AutoFilterメソッドの構文
オブジェクト.AutoFilter Field,Criteria1,Operator,Criteria2,VisibleDropDown
AutoFilterメソッドの構文はこのようになっています。
オブジェクトには、セルやセル範囲など、「セルの位置を示す」必要があります。
引数と内容
AutoFilterメソッドの引数は以下の通りです。
最大で5つの引数があります。
引数 | 内容 |
Field | 抽出条件の対象となる列番号を設定。抽出範囲の左から何列目かを設定する |
Criteria1 | 抽出条件となる文字列を設定。省略すると条件はALLになる |
Operator | フィルターの種類を組み込み定数で設定 |
Criteria2 | 2番目の抽出条件となる文字列を設定。 引数Criteria1と引数Operatorを組み合わせて複合抽出条件も設定可能。 |
visibleDropDown | フィルターのドロップダウン矢印の表示(True)、非表示(False)を設定。 省略すると表示(True)になる |
こちらはすべての引数が省略可能となっています。
省略すると、フィルターが適用されている場合は、フィルターが解除されます。
引数が見慣れない単語ですが、少しわかりやすく解説すると…
Fieldは、表の範囲で左から数えて何列目の項目を使って抽出をするのかという引数になります。
左から数えて3列目の項目を使って抽出をしたい場合は「3」と入力します。
Criteriaは日本語で「基準」という意味になります。
Fieldで指定した列で抽出をするのに、何を基準(条件)にして抽出するのかを入力します。
Criteriaには1と2がありますが、それぞれ抽出する条件1・条件2となります。
Criteria2は、この後解説する、引数Operatorの組み込み定数の「And」や「Or」で使用することができます。
【引数】Operatorで設定できる条件
Operatorで設定できる条件は以下のようになります。
組み込み定数 | 値 | 内容 |
xlAnd | 1 | 引数Criteria1とCriteria2をAND条件で指定 |
xlOr | 2 | 引数Criteria1とCriteria2をOR条件で指定 |
xlTop10Items | 3 | 上位から引数Criteria1で指定した順位を表示 |
xlBottom10Items | 4 | 下位から引数Criteria1で指定した順位を表示 |
xlTop10Percent | 5 | 上位から引数Criteria1で指定した割合を表示 |
xlBottom10Percent | 6 | 下位から引数Criteria1で指定した割合を表示 |
xlFilterValues | 7 | フィルターの値を指定 |
xlFilterCellColor | 8 | セルの色を指定 |
xlFilterFontColor | 9 | フォントの色を指定 |
xlFilterIcon | 10 | フィルターのアイコンを指定 |
xlFilterDynamic | 11 | 動的フィルターを指定 |
組み込み定数または値で種類を指定することができますが、値を覚えるのは大変なので、基本的には組み込み定数で記述しましょう。
このあとに、実際の手順を元に、引数Operatorの解説をしますが、VBAで記述する内容は基本的にエクセルのフィルターの機能と同じです。
エクセルのフィルター機能の基本的な使い方がわかって入れば、その手順をイメージしながらVBAの記述内容と比較するとわかりやすくなります。
何をやるための記述なのか、というところを手作業で行う流れをイメージしながら試してみましょう。
Excel(エクセル)を使いこなすのって結構難しいです。
Excel(エクセル)は、出来ることが多くて覚えるのがかなり大変です。
そんな方のためにExcel(エクセル)の使い方や、関数のコツ、ピボットテーブルやグラフなどをまとめたページをライン登録で無料プレゼントしております。
Excel(エクセル)以外にも、Word(ワード)、パソコン基本、PowerPoint(パワーポイント)、Mac、ブラインドタッチなどの特典もございます。
ご興味ある方は下記よりご登録ください。
AutoFilterメソッドの使い方
それでは、実際にAutoFilterメソッドを使ってデータを抽出してみましょう。
今回は、上記の例を元にAutoFilterメソッドの使い方について解説します。
「Field」と「Criteria1」の考え方
まず、Fieldは、表の見出しで左から数えて何列目の項目についてデータを抽出するのかを数字で指定します。
例えば、「サイズ」で抽出をしたい場合は「3」と入力します。
例:「サイズ」で「15」のデータを抽出する場合
Sub サイズ検索()
Range("A3").Select
Selection.AutoFilter 3, 15
End Sub
このように記述します。
まず、セルを選択し、そこを基準にオートフィルタを適用、「3」列目の項目で「15」のデータを抽出するといった内容です。
エクセルの通常操作で、セル【A3】をクリックして、データタブの「フィルター」ボタンをクリックするという流れが、「Range("A3").Select~Selection.AutoFilter」に含まれています。
実行すると、このように、サイズが「15」のデータのみ抽出されます。
この「15」が「Criteria1」に当たります。
引数 Criteria1は、上記のようにエクセルの通常操作で、数値フィルターあるいはリストからチェック操作をして条件を指定する時と同じ考え方です。
「Operator」の考え方
xlAnd・xlOr = ○○かつ△△・○○または△△
AND条件とOR条件で条件を指定する場合は、「xlAnd」または「xlOr」を活用します。
1つ目の条件が「Criteria1」、2つ目の条件が「Criteria2」となります。
例:価格が「3000円台」の商品を抽出する場合
Sub 価格3000円台()
Range("A3").Select
Selection.AutoFilter 4, ">=3000", xlAnd, "<4000"
End Sub
このように記述します。
まず、今回は左から数えて4列目の項目を基準に、1つ目の条件が「3000以上」、2つ目の条件が「4000未満」にしています。
引数Operatorで「xlAnd」を使い、条件1と条件2の両方を満たすデータを抽出します。
Criteria1とCriteria2に比較演算子を使用しますが、必ずダブルクォーテーションで囲みましょう。
エクセルでこのように入力した時と同じ内容をVBAで記述しています。
実行すると、価格が3000円台のデータのみ抽出されます。
その他のOperatorの組み込み定数
「xlTop10Items」は、「トップテン」の「上位〇項目」の条件を指定するときに使います。
同様に、「xlBottom10Items」は「下位〇項目」の貢献を指定するときに使います。
「xlTop10Percent」は、「トップテン」の「上位〇パーセント」の条件を指定するときに使います。
同様に、「xlBottom10Percent」は「下位〇パーセント」の貢献を指定するときに使います。
例:売上金額「トップ3」を抽出する場合
Sub 売上金額上位()
Range("A3").Select
Selection.AutoFilter 6, 3, xlTop10Items
End Sub
このように記述します。
今回は左から数えて6列目の「売上金額」の項目を基準に、条件が「3」件、フィルターの種類が「トップ10」の「上位〇項目」となります。
「上位〇項目」の「〇」の中に、Criteria1で指定した「3」が条件として入ります。
実行するとこのようにデータが抽出されます。
「xlFilterCellColor」と「xlFilterFontColor」は、それぞれ、「色フィルター」の「セルの色でフィルター」または「フォントの色でフィルター」を実行したい時に活用します。
例:セルの塗りつぶしが黄色のセルを抽出する場合
Sub キャンペーン()
Range("A3").Select
Selection.AutoFilter 2, vbYellow, xlFilterCellColor
End Sub
このように記述します。
今回は左から数えて2列目の「商品名」の項目を基準に、条件が「vbYellow」、フィルターの種類が「セルの色」となります。
「セルの色」の指定が、Criteria1で指定した「vbYellow」となります。
実行するとこのように、セルの色が黄色のデータのみ抽出されます。
名前付き引数での記述も可能
Sub 売上金額上位()
Range("A3").Select
Selection.AutoFilter 6, 3, xlTop10Items
End Sub
上記は先ほど紹介した、売上金額のトップ3を抽出するプログラムです。
プログラムの記述は、引数を順番に入力することも可能ですが、引数がどの順番なのかが覚えられない、わからないという場合は、名前付き引数を使う方法もあります。
上記の記述を、名前付き引数で記述してみましょう。
Sub 売上金額上位()
Range("A3").Select
Selection.AutoFilter Field:=6, Criteria1:=3, Operator:=xlTop10Items
End Sub
このように、「引数名」の後ろに「コロン(:)」と「イコール(=)」を入力し、その後ろに数値や組み込み定数を入力します。
また、名前付き引数の便利な所は、記述の順番が引数通りでなくても良いという点です。
Sub 売上金額上位()
Range("A3").Select
Selection.AutoFilter Field:=6, Operator:=xlTop10Items, Criteria1:=3
End Sub
このように、引数の順番を変えて記述しても名前付き引数であれば問題ありません。
引数が多く覚えられない時は、名前付き引数の活用も良いでしょう。
InputBox関数と組み合わせ
AutoFilterメソッドを使う際に、条件の指定を直接入力することもできますが、そうなると条件ごとにプログラムを作成しなければいけません。
例えば、サイズの種類が「12」「15」「18」の3種類がありますが、それぞれを抽出するために、サイズ12を抽出するプログラム、サイズ15を抽出するプログラム・・・というように、3つのプログラムを作らなければいけません。
そうなると、作業効率が悪くなります。
このような場合に便利なのがInputBox関数との組み合わせです。
InputBox関数とは
ダイアログボックスにメッセージとテキストボックスを表示することができます。
テキストボックスに文字列を入力すると、入力された文字列を戻り値として返します。
キャンセルの時は、長さ0の空文字列である「“”」を返します。
MsgBox関数は、こちら側から一方的にメッセージを表示するだけですが、InputBox関数では、ユーザーに対してデータの入力を促すことができます。
その入力されたデータによってその後の処理を指定できるのがポイントです。
InputBox関数の構文
InputBox(prompt,title,default,xpos,ypos,helpfile,context)
InputBox関数の構文は上記のようになります。
引数は最大で7つです。
引数と内容
引数 | 内容 |
prompt | ダイアログボックスに表示するメッセージを設定 |
title | ダイアログボックスのタイトルを設定 |
default | テキストボックスに入力しておく既定値の文字列を設定 |
xpos | 画面左端からダイアログボックスの左端までの距離 |
ypos | 画面上端からダイアログボックスの上端までの距離 |
helpfile | 「help」ボタンをクリックしたときに表示するヘルプのファイル名を設定 |
context | 表示するヘルプの内容に対応したコンテキスト番号を設定し、設定した場合は、引数helpfileの設定が必要 |
必須の引数は1つ目の「prompt」のみで、2つ目以降の引数は省略することが可能です。
InputBox関数のポイント
InputBox関数では、テキストボックスに入力されたデータがそのまま「文字列」の戻り値として返ってきます。
つまり、入力されたデータが戻ってきたときに受け取るための箱、「変数」が必要となります。
- 「変数」にテキストボックスに入力された戻り値を代入する
- 処理に合わせて、「変数」を「セル」などに代入する
といった流れが必要になります。
ですので、InputBox関数の構文だけを記述してもプログラムが実行されず、エラーが出ます。
Sub 商品名入力()
InputBox("商品名を入力してください","商品名入力",,300,300)
End Sub
このようにエラーが表示されます。
InputBox関数には「変数」が必要
Sub 商品名入力()
Dim syouhin As String
syouhin = InputBox("商品名を入力してください", "商品名入力", , 300, 300)
Range("A1").Value = syouhin
End Sub
先ほどのプログラムをこのように修正します。
変数を宣言しますが、この時、データ型は「String」になります。
このプログラムで実行すると・・・
ダイアログボックスが表示され、テキストボックスに入力されたデータが、セル【A1】に入力されます。
InputBox関数と組み合わせ
では、実際にInputBox関数を使って、先ほどの3つのサイズを1つのプログラムで抽出できるようにしましょう。
今回の記述はこのようになります。
Sub サイズ検索()
Dim size As String
size = InputBox("検索したいサイズを入力してください", "サイズ検索", , 300, 300)
If size = "12" Or size = "15" Or size = "18" Then
Range("A3").Select
Selection.AutoFilter 3, size
Else
MsgBox "該当のサイズがありません。" & Chr(10) & "12・15・18のずれかを入力してください"
End If
End Sub
■記述の意味■
変数「size」を宣言します。
InputBox関数で入力された戻り値を、変数「size」に代入します。
戻り値が「12」「15」「18」のいずれかの場合
オートフィルターで3列目の項目で入力された戻り値を条件にしてデータを抽出します。
「12」「15」「18」以外のデータが入力された場合は、メッセージを表示します。
プログラムを実行すると、画面の左上にダイアログボックスが表示されます。
テキストボックス内に、検索したいサイズを入力し、「OK」をクリックまたはEnterキーを押します。
プログラムが実行され、入力した値に一致するデータが抽出されます。
〇〇を含むプログラムの記述
今回の例では、商品名にフルーツの名前が入っています。
例えば「苺」の付くデータを抽出する場合
Sub いちご検索()
Range("A3").Select
Selection.AutoFilter 2, "苺"
End Sub
このようにプログラムを作ってしまうと・・・
このようにデータが何も抽出されません。
これは、通常のエクセルのフィルター操作で「テキストフィルター」で「苺」というセルを検索していることと同じためです。
「苺」を含むという条件を指定する場合はワイルドカードを使用する必要があります。
ワイルドカードを使用した記述方法
Sub いちご検索()
Range("A3").Select
Selection.AutoFilter 2, "*" & "苺" & "*"
End Sub
検索する条件を「"*" & "苺" & "*"」と入力し、「苺」の前後に何かしらの文字列が入力されているデータを抽出することができます。
これで、どの位置に「苺」という文字が付いていてもデータを抽出することができます。
InputBox関数とワイルドカード
さらに、InputBox関数で入力された戻り値を含むデータを抽出する方法です。
フルーツの名前をInputBox関数のテキストボックスに入力し、その値を含むデータを抽出するプログラムです。
Sub フルーツ検索()
Dim fruit As String
fruit = InputBox("検索したいフルーツを入力してください", "使用果物", , 300, 300)
If fruit = "苺" Or fruit = "桃" Or fruit = "メロン" Or fruit = "シャインマスカット" Then
Range("A3").Select
Selection.AutoFilter 2, "*" & fruit & "*"
Else
MsgBox "該当のフルーツがありません。" & Chr(10) & "苺・桃・メロン・シャインマスカットいずれかを入力してください"
End If
End Sub
このように記述してみましょう。
■記述の意味■
変数「fruit」を宣言します。
InputBox関数で入力された戻り値を、変数「fruit」に代入します。
戻り値が「苺」「桃」「メロン」「シャインマスカット」のいずれかの場合
オートフィルターで2列目の項目で入力された戻り値を条件にして、その文字列を含むデータを抽出します。
「苺」「桃」「メロン」「シャインマスカット」以外のデータが入力された場合は、メッセージを表示します。
ワイルドカードで、戻り値の前後にどんな文字列が入っていても抽出されるようにしておくと、入力した文字列から始まっても、データの途中にあっても検索の対象となります。
実際の画面は以下のようになります。
プログラムを実行すると、画面の左上にダイアログボックスが表示されます。
テキストボックスに検索したい文字列を入力し、「OK」をクリックまたはEnterキーを押して確定します。
これで、入力された条件に一致したデータが抽出されます。
フィルター解除するプログラム
抽出したデータをオートフィルターを解除して、すべてのデータが見えるようにするプログラムです。
Sub 解除()
Range("A3").Select
Selection.AutoFilter
End Sub
AutoFilterメソッドでは、すべての引数を省略することができます。
すべての引数を省略した場合は、フィルターが適用されている場合、それを解除することができます。
エクセルで手作業で行う流れをイメージすると・・・
Range("A3").Select → セル【A3】をクリックする
Selection.AutoFilter → セルを選択した状態で、データタブの「フィルター」ボタンをクリックする
このような意味になります。
通常のエクセルの手順でも、フィルターが適用されている範囲のセルを選択して、「フィルター」ボタンをクリックすれば、フィルターが解除されますよね。
それと同じ流れになります。
VBAの記述をするときは、エクセルの操作をイメージしながらその手順をプログラムにしていくと記述もしやすくなります。
Excel(エクセル)が苦手であればパソコン教室で学んでみませんか?
Excel(エクセル)はかなり奥が深く、知識を得ただけは操作が身に付きにくいものです。
そんな時には、弊社のようなパソコン教室を利用するのも一つの手です。
「オンライン」にも対応している「苦手な方専門パソコン教室パレハ」にお任せください。
オンラインというと「動画を見るだけ」とか「オンラインなんてやったことがない」というご不安があるかと思います。
ですが「苦手な方専門のパソコン教室パレハ」の「オンラインレッスン」は、動画ではなく、直接講師に質問できる生レッスンです。
生レッスンでありながらリーズナブルに学べるのが人気の秘密です。
また、苦手な方に特化しているのでパソコンが特に苦手だと言う方には最適です。
パソコンが苦手でも、オンラインできる仕組みがあります。
詳細は下記をご覧ください。
パソコンが苦手な方向けエクセル マクロ入門講座の詳細はコチラ
パソコンが苦手な方向けエクセル マクロ・VBA講座の詳細はコチラ
Excel(エクセル)の操作が苦手な方のために、操作する上でのコツをまとめたページを用意しました。
「パソコン教室パレハのLINE友達登録」(無料)で「パソコンに役立つ豪華15大特典」をお送りしております。
Excel(エクセル)の操作はもちろん、パソコンが苦手な方に役立つ特典を15個ご用意しております。
良かったら下記からご登録ください。