- ベストアンサー
VBAによるオートフィルタの使用方法と注意点
- VBAを使用してオートフィルタを設定する方法について説明します。また、特定の条件でオートフィルタを抽出する方法と注意点についても解説します。
- オートフィルタで、範囲内の特定の条件に一致するデータを抽出するためには、Criteria1とCriteria2のパラメータを使用します。特に「以上」「以下」の条件を指定する場合は、指定する値に注意が必要です。
- オートフィルタの条件には、入力された値を直接使用することもできます。InputBoxを使ってユーザーの入力値を取得し、その値をオートフィルタの条件に反映させることができます。ただし、値を正しく指定するためにはパラメータの結合方法に注意が必要です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
お節介ついでに追記させていただきます。 連投すいません。 J列の「日付」が全行において文字列で入っているなら、 逆手に取るのも手段の一つかもしれません。 > 日付 = InputBox("処理月を入力して下さい(例:201709)") として、年月(6桁)で入力させるのであれば、 日付 = InputBox("") Range("A1").AutoFilter Field:=10, Criteria1:="=" & 日付 & "*" のように、インプットボックスの結果にワイルドカード文字の「*」を追加、 それをもってフィルタをかけてしまおう、という事ですね。 ワイルドカード文字「*」は「何でも何文字でも」の意味ですから、 インプットボックスの結果として代入された文字列で始まる・・ 例えば「201709」で始まる文字列をフィルタ条件として渡せるわけです。 フィルタの対象が文字列なのであれば、コレが多分有効です。 ただ、コレだと「数値」として入力されているモノは 当然のごとくフィルタから弾かれてしまいます。 どちらにしても、データの整理整頓は大切ですよ、というお話ですね。
その他の回答 (3)
- tsubu-yuki
- ベストアンサー率46% (179/386)
オートフィルタ、ですね。 前半の質問について。 該当のJ列、文字列で入力されていませんか? 文字列だと「数字の比較」では抽出がややこしいので注意です。 とりあえず、文法は間違えていないように見えますので、 まず確認するのはそこかな?と思われます。 ところで・・オートフィルタを動かすときは、 表の行列に「空白」を挟んでいないなら、 全範囲を指定する必要は無かったりします。 つまり今回のだと Range("A1").AutoFilter Field:=10, _ Criteria1:=">=20170901", _ Operator:=xlAnd, _ Criteria2:="<=20170931" で充分いけたりします。 空白列・空白行を含むなら、全範囲を指定する必要がありますけどね。 スッキリ書きたいときにどうぞ。 後半の質問は文法の問題。 > Criteria1:=">= 日付 & 01" コレだと「日付 & 1」という文字列と比較という命令だと受け取られます。 なのでちゃんと変数「日付」に代入されている値を引き出せるように Criteria1:=">=" & 日付 & "01" と、ダブルクォーテーションから出してあげましょ。 理解しやすい(と思う)例として、ワークシートのセルに ="日付 & 01" ="日付"&"01" と入力したらセルに表示される値はそれぞれどうなるでしょう? まぁ、厳密には少し違ったりもしますが、感覚はそんな感じです。 ここは多分、これで解決できると思います。 が、前半同様、表の中の「日付」が文字列だったら こちらも正しく抽出しないと思われます。 踏まえ、まずは対象セルの表示形式をご確認くださいませ。 なお添付図は、質問文中でご提示のコードを動かす前後の比較、 上が使用前、下が使用後です。 文字列で入力されている3行目と7行目 (セルの左上に警告の緑▼がついていますね)が フィルタから弾かれているのを見取っていただければ幸い。
お礼
&の使用法についてご教授いただき、ありがとうございます!また、教えていただいた通り、該当の列は文字列で入力されていたようです!(>_<)左上に緑の▼が表示されているかどうかも文字列かどうかを見分ける方法の一つなのですね…!凄く勉強になりました!
- imogasi
- ベストアンサー率27% (4737/17069)
下記は期間のBetweenのズバリの回答ではないが、参考にしてください。 エクセルのセルの日付は、「日付シリアル値」という整数です。 意味は知らなければ、WEBで調べること。プログラム言語での「リテラル」という用語に意味も。 ーー <エクセル関数>(本質問とは関係ないですが)の場合の条件などのリテラルの日付 問題はある書式で、セルに見えている日付が、日付シリアル値でいくらなのかを判る方法ですがこれは面倒。 A2、A3セルに 2017/9/11 2017/9/15 B2、B3セルに関数 =IF(A2=DATEVALUE("2017/9/11"),"Y","N") =IF(A3=DATEVALUE("2017/9/15"),"Y","N") のように日付を” ” で囲む。 結果 Y Y 関数の場合にはこういう方法でよい。 ーー <VBA≫のフィルタの場合 フィルタでの日付指定は (1)条件はセルに値を入れ、そのRangeを指定するのがエクセルの本筋 (2)日付リテラル値をコードの中で使う方法なら http://officetanaka.net/excel/vba/tips/tips151.htm をじっくり読んでみてください。本当にややこしい点のようです。 質問にはエクセルのバージョンが書いてないが、バージョンなどで複雑なようです。(質問に、使っているエクセルのバージョンも念のため書いておくべきです。) 他に、質問の解決には、条件を期間のFrom ToにするためにCriteria2も使い、OperatorはxlAndを使うのだと思います。いろいろ質問者で、試行してやってみてください。
お礼
日付のデータについて、参考のURLをご提供いただき、ありがとうございます!<m(__)m>バージョンによってオートフィルタの結果が異なるのですか…!目から鱗です!変数の宣言をDateからStringに直したらうまくいったので、文字列だったようです…!
- SI299792
- ベストアンサー率47% (772/1616)
私がやってみたら、抽出できました。 Field:=10 ならば、J列ですが、それで間違いないですが。 20170901だと、日付のようですが、本当に8桁の数字で入っていますか、日付の形式で入っていませんか。ご確認ください。 InputBoxの記述は間違い。""の中に変数は書けません。 Criteria1:=">=" & 日付 & "01" Criteria2:="<=" & 日付 & "31" にして下さい。
お礼
""の中に変数入力できないんですね…(T_T)今まで知らず、お恥ずかしい限りです…。ご回答いただいて本当にありがとうございます!とても勉強になりました!
お礼
ご教授いただいた通り、「*」を使用しましたら、指定のデータを含む場合でうまくいきました!また、日付をDateと定義していたのもよくなかったようで、文字列のStringにしたらうまくいきました!(≧▽≦)