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

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

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


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


以下の表で説明します。



Excel解説


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


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


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解説


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


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」の記事

行の挿入・削除
並べ替え
オートフィルタ
オートフィルタ2
ジャンプのセル選択
条件付き書式
シートの移動コピー
セルの結合
印刷
開く・保存・閉じる
最終回

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

エクセルの日付と時刻のまとめ|エクセル関数超技(3月6日)
Excelシートの複雑な計算式を解析するVBA|VBAサンプル集(2月18日)
VBAクラスの作り方:独自Rangeっぽいものを作ってみた|VBA技術解説(2月16日)
VBAクラスの作り方:列名のプロパティを自動作成する|VBA技術解説(2月14日)
VBAクラスの作り方:列名の入力支援と列移動対応|VBA技術解説(2月11日)
クラスを使って他ブックのイベントを補足する|VBA技術解説(2月6日)
Excelアドインの作成と登録について|VBA技術解説(2月3日)
参照設定、CreateObject、オブジェクト式の一覧|VBA技術解説(1月20日)
VBAでファイルを規定のアプリで開く方法|VBA技術解説(1月20日)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)|VBA技術解説(1月19日)

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

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



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

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


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






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

    本文下部へ