前回はExcel VBAエキスパートスタンダード半ばまでの勉強について振り返りました。
前回までの記事はこちら
今回は6章のAutoFilterについてレポートしていきます。
なお今回は一部動画を使って説明しようと思います。Youtubeのようなものではないですがイメージをつかんでくだされば幸いです。
なお理解が間違っているところもあるかもしれませんがわからない人と同じ視点に立てるのは今しかないので細かいところはご容赦ください。
間違えに気づいたら修正していきます(笑)。
なおこの体験記は短時間で効率よく勉強することを目的として書いていますので勉強の際に参考にしてもらえれば幸いです。
<今回の目的>
AutoFilterを理解する
- 6章を精読する
- AutoFilterをわかりやすく説明する
今の立ち位置
以前の記事で説明しましたが私の今の立ち位置は以下です。
概要 | 内容 | 勉強時間 | 完了の有無 (Basic) | 完了の有無 (Standard) |
1 公式テキストの購入 | 安く購入できる方法を探す | 1時間 | 1時間済 | 済 |
2 公式テキストの把握 | テスト形式、単元を知る | 1時間 | 15分済 | 7分済 |
3 公式テキスト問題集実施1 | スタンダード2回、ベーシックで1回実施 | 4時間 | 50分済 | 30分 |
4 公式テキスト勉強(×部分) | 間違えた単元の勉強を実施。暗記はボイスメモで | 3時間 | 1時間 | 3時間30分(読書) 1時間20分(ボイスメモ) |
5 公式テキスト勉強(〇部分) | 会っていた単元の勉強を実施。暗記はボイスメモで | 3時間 | 1時間 | |
6 公式テキスト問題集実施2 | スタンダード 3回実施 | 4時間 | ||
7 3~6の繰り返し | 3セット実施 | 20時間 | ||
計 | 36時間 | 4時間5分 | 47分 |
今回は第6章のAutoFilterについて説明します。
結論
いきなりですが結論です。
AutoFilterのコードは実際の手動操作をやれば理解できる。
次から詳しく説明します。
コードの説明
AutoFilterメソッドのコードは以下のようになります。
Rangeオブジェクト.AutoFilter 列数,抽出条件
このコードは以下の手動操作の自動化を表しています。
1 表の適当な範囲を選択する(ここではA2セル)
2 データタブのフィルターボタンで対象範囲をフィルターをかける
3 列数を指定する(ここではC列)
4 抽出条件を指定する(ここではたけみつ)
詳しくは以下の動画を確認ください。
これがそれぞれ以下になります。
1 表の適当な範囲を選択する(ここではA2セル)⇒これがRangeオブジェクト
2 フィルターボタンで対象範囲をフィルターをかける⇒これがAutofilterメソッド
3 列数を指定する⇒これが列数の指定
4 フィルター条件を指定する⇒これが抽出条件
行っている操作を順次コードにしているだけですね。
もし?であれば一度やってみるといいです。
こういったエクセルの機能を使ったマクロは意外と覚えやすいので手動でやってみるのがおすすめです。
なお1ではシート中の適当な範囲を選べばよいです。エクセルが表を判断して適当なところでフィルターをかけてくれます。
ただし以下のように表の範囲外で行うとエラーになるので注意が必要です。
フィルターの解除の仕方
フィルターの解除の仕方は2通りあります。
1 Rangeオブジェクト.AutoFilter
再度AutoFilterをかける方法です。フィルターボタンを2回押す操作と同じです。
2 Sheetオブジェクト.AutoFilterMode=False
フィルターの表示はセルに対して行う必要がありますが解除はシートに対しても実行できます。
抽出条件
抽出条件は“文字列”で指定します。
単一の条件の記載の仕方をまとめると以下になります。
方法 | 文字列 | 数値 | 日付 |
1 | “aaaa” 完全一致 | “1,000” 完全一致*1 | “2021/7/1” 完全一致*1 |
2 | “*aaa*” 部分一致 | “>1000” 1000よりも大きい*2 | “>2021/7/1” 2021/7/1以降*2 |
3 | “=” 空白 | “<1000” 1000よりも小さい*2 | “<2021/7/1” 2021/7/1以前*2 |
4 | “<>” 空白でない |
なお*があるように以下は注意点です。
*1 完全一致の場合は表示形式もあっていないといけません。例えば1,000と表示されているセルに対して、1000と入れてもNGとなります。
*2 ~より大きいなど比較演算子を使う場合は左辺に数値は入れなくてよいです。ここは少し違和感がありますね。なお比較演算子を使う場合は表示形式は気にしなくてよいです。
複数条件の場合の記載は以下になります。
Rangeオブジェクト.AutoFilter 列数,抽出条件1, オペレーター, 抽出条件2
オペレーターは抽出条件1と2の比較を示していて基本xlAndかxlOrしか使いません。
同様に複数条件の記載の仕方をまとめると以下になります。
方法 | 文字列 | 数値 | 日付 |
1 | “*東京*”, xlAnd, “*神奈川*” 東京と神奈川両方を含む | “>2000”, xlAnd, “<5000” 2000より大きく5000より小さい | “>=2021/6/1”, xlAnd, “<=2021/7/1 2021年6月1日以上2021年7月1日以内 |
2 | “*東京*”, xlOr, “*神奈川*” 東京か神奈川を含む | “<=2000”, xlOr, “>=5000” 2000以下か5000以上 | “<=2021/6/1”, xlOr, “>=2021/7/1 2021年6月1日以内か2021年7月1日以降 |
3つ以上の場合の記載は以下になります。
Rangeオブジェクト.AutoFilter 列数,Array(抽出条件1,抽出条件2, 抽出条件3),xlFilterValues
抽出条件にArray関数を使うのが特徴です。また手動操作で行うチェックボックスへの入力と同じ操作になるのでOperatorにはxlFilterValuesを用います。
オートフィルターした情報をコピーするコード
フィルターされた後の表を取得してコピーするにはCurrentRegionプロパティとCopyメソッドを使います。
Rangeオブジェクト.CurrentRegion.Copy
なおこの方法だとタイトル行も取得されるのでタイトル行を取得したくない場合はRangeオブジェクトのOffsetプロパティを使います。
次のコードはフィルターがかかった後の表に対して1行下げてコピーするコードです。
Range("A1").CurrentRegion.Offset(1,0).Copy
オートフィルターした情報をカウントするコード
フィルターされた情報をカウントするにはSubTotal関数を使います。
WorksheetFunction.SubTotal(3,セル範囲)
SubTotal関数は色々な計算ができる関数です。最初の引数に3を指定するとデータ範囲の個数を求めることができます。
以下はフィルターされた行数を求めるコードです。
N=WorksheetFunction.SubTotal(3,Range(”A:A”))
実際はタイトル行が含まれる為データ行だけならばN-1となります。
オートフィルターした情報に数値を入力するコード
フィルターされた範囲について値を変更するにはセル範囲を選択してすべての数値を変更すればよいです。なお非表示セルには影響しません。
セル範囲の選択にはRange(左上セル, 右下セル)を用います。
次のコードはA列のセル範囲に対して100を代入します。
Range(Cells(2,1),Cells(Rows.Count,1).End(xlUp)="100"
ここでのまとめ
AutoFilterのコードは実際の手動操作をやれば理解できます。
エクセルの機能を用いたコードは手動操作を行うと理解しやすいので今後もこの方法で説明していければと思います。
コメント