マクロ記録でVBA
オートフィルタ2

Excelマクロの自動記録を使って、エクセルVBAの初心者向け入門解説
公開日:2013年5月以前 最終更新日: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知識が必要です。


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


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


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


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


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



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


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


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





同じテーマ「マクロの記録でVBA」の記事

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


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

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




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


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


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