Excelマクロの記録で覚えるVBA
第19回.オートフィルタ2

Excelマクロの自動記録を使って、エクセルVBAの初心者向け入門解説
最終更新日:2013-02-18

第19回.オートフィルタ2


前回の続きで、フィルタをやります。


以下の表で説明します。


Excel VBA 解説


では、マクロの記録です。


まずは、日付の絞り込みです。


1.マクロの記録

2.A1を選択

3.フィルタ

4.2011/6/5のみ選択

5.記録終了


作成れたマクロは・・・


(コメント行は省略します)



Sub Macro1()
  Range("A1").Select
  Selection.AutoFilter
  ActiveSheet.Range("$A$1:$B$11").AutoFilter Field:=1, Operator:= _
    xlFilterValues, Criteria2:=Array(2, "6/5/2011")
End Sub


上は、2010 or 2007 でのマクロの記録です。


2003では、


Sub Macro1()
  Range("A1").Select
  Selection.AutoFilter
  Selection.AutoFilter Field:=1, Criteria1:="2011/6/5"
End Sub



大分違いますね。



まずは、2007、2010の説明です。


Operator:= xlFilterValues

は2007以降で追加された機能です。

複数選択する場合の指定です。


Criteria2:=Array(2, "6/5/2011")
これが問題ですね。

Arrayは配列です。

配列はまだ説明していませんが・・・配列の説明は、かなり大変なので簡単に。

例えば、複数日付を選択する場合は、

Criteria2:=Array(2, "6/5/2011", 2, "6/6/2011")

となります。

日付の指定が、日/月/年、になっていますが、これはPCの環境に依存するかもしれません。

普通に、年/月/日、の指定で良いです。

2, "6/5/2011"

は、指定の日付の日になります、えっ・・・

いや、こういうことです。

0は、年

1は、月

2は、日

でフィルタされるのです。


2003のマクロは、前回と同じなので、問題ないですね。



次に、金額の絞り込みです。


1.マクロの記録

2.A1を選択

3.フィルタ

4.15,000のみ選択

5.記録終了


作成れたマクロは・・・


(コメント行は省略します)



Sub Macro1()
  Range("A1").Select
  Selection.AutoFilter
  ActiveSheet.Range("$A$1:$B$11").AutoFilter Field:=2, Criteria1:="150,000"
End Sub


これは、前回とかわりませんね。



では、表示書式を以下のように変更します。


Excel VBA 解説


そして、先に作成した、マクロを実行して下さい。


2003の人は、日付も金額も、うまくできなかったはずです。


2007、2010の人は、日付はOK、金額はダメだったはずです。

(いや、人によっては、日付もダメだった人もいると思います。)


困りますよね、表示形式を変更したら、作成したマクロが正しく動かないのでは。


でも、これは手作業でやっても同じですよね、


表示形式によって、正しくフィルタが動作しません。



バージョンにより違うので、なかなか説明が大変なので、とにかく、解決策を提示します。


使用している関数等は、最後に説明します。



オートフィルタは表示書式に左右されるのは、広く知られていますので、


最も簡単な解決策は、Criteriaに指定する値を、セルの表示書式に合わせる。


これが最も多く利用されていると思われます。


以下のようなプログラムになります。


Sub Macro1()
  ActiveSheet.Range("$A$1:$B$11").AutoFilter Field:=1, _
    Criteria1:=Format(CDate("2011/6/5"), Range("A2").NumberFormatLocal)
End Sub


これでも良いのですが、行によって、表示書式が違っていたりすると、間違った抽出をしてしまうことになります。


重要なデータだったら困りますよね。


もちろん、途中で表示書式が違うようなエクセルは作成するべきではありませんが、


たまたま、そうなっていた事で、重大なデータ漏れを発生させるわけにはいきません。


このやり方をする場合は、フィルタの前に、表示書式を整えておく必要があります



表示書式を変更せずに、そのままでも正しく抽出するには、


以下のような方法もあります。


まずは、日付の場合です。


Sub Macro1()
  ActiveSheet.Range("$A$1:$B$11").AutoFilter Field:=1, _
    Criteria1:=">=" & CLng(CDate("2011/6/5")), _
    Operator:=xlAnd, _
    Criteria2:="<=" & CLng(CDate("2011/6/5"))
End Sub


続いて、数値の場合


Sub Macro2()
  ActiveSheet.Range("$A$1:$B$11").AutoFilter Field:=2, _
    Criteria1:=">=" & 150000, _
    Operator:=xlAnd, _
    Criteria2:="<=" & 150000
End Sub


ちょっと面倒ですが、これなら、全てのバージョンで正しく動作します。


恐らく、ネットで検索しても、なかなか良い解決策が提示されていないのではないかと思います。


特に、日付はやっかいです。


ただし、この指定では、飛び飛びの日付や数値を指定ができません。


数値はともかく、日付ではそのような指定をする場合もあるでしょう。


そのような場合は、前出の書式を合わせる方法を使用して下さい。



Operator:=xlAnd

Criteria1とCriteria2の条件をANDしています。

ORは、xlOr


Cdate

日付を表す文字列を、日付データに変換します。


Clng

数値を表す文字列等をロング型のデータに変換します。

エクセルでは、日付は数値です。

1900/1/1を1として、1日を1で表しています。


Format

ワークシート関数のTEXTのようなものです。

指定された形式に変換します。


NumberFormatLocal

これは、依然に説明したと思いますが、セルの表示形式です。

ここでは、2行目の表示書式に変換しています。



ちょっと、急に難しくなってしまった感じがしますね。


ここでの内容を全て理解するには、かなり多くのVBA知識が必要です。


しかし、それらを理解しなければ、オートフィルタが使えないのでは不便ですので、


あえて、今回説明しました。


理解できない部分は、そのまま受け入れて、使えばよいと思います。


オートフィルタはエクセルの重要な機能ですので、積極的に使ってください。


ただし、今回説明したように、日付・数値の場合は注意が必要です。



このように、エクセルではバージョンによる動作の違いが、ちらほらあります。


自分専用のマクロなら気にする必要はありませんが、


誰かと共有する場合は、各バージョンでの動作を確認して下さい。





同じテーマ「Excelマクロの記録で覚えるVBA」の記事

第16回.行の挿入・削除
第17回.並べ替え
第18回.オートフィルタ
第19回.オートフィルタ2
第20回.ジャンプのセル選択
第21回.条件付き書式
第22回.シートの移動コピー
第23回.セルの結合
第24回.印刷
第25回.開く・保存・閉じる
第26回.最終回


新着記事NEW ・・・新着記事一覧を見る

Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)
IfステートメントとIIF関数とMax関数の速度比較|VBA技術解説(6月23日)
Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • オートフィルタ2

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ