VBAによるオートフィルタの使用方法と注意点

このQ&Aのポイント
  • VBAを使用してオートフィルタを設定する方法について説明します。また、特定の条件でオートフィルタを抽出する方法と注意点についても解説します。
  • オートフィルタで、範囲内の特定の条件に一致するデータを抽出するためには、Criteria1とCriteria2のパラメータを使用します。特に「以上」「以下」の条件を指定する場合は、指定する値に注意が必要です。
  • オートフィルタの条件には、入力された値を直接使用することもできます。InputBoxを使ってユーザーの入力値を取得し、その値をオートフィルタの条件に反映させることができます。ただし、値を正しく指定するためにはパラメータの結合方法に注意が必要です。
回答を見る
  • ベストアンサー

「~以上、~以下」のオートフィルタのVBAについて

こんばんは、オートフィルタについて2つ質問させてください! 1つ目は、10列目に入っている値で、20170901以上かつ20170931以下の値をオートフィルタで抽出しようと以下のVBAを入力しましたが、該当するデータがあるにも関わらず抽出ができませんでした(T_T)何か間違っているのでしょうか…?! Range("A1:K" & Cells(1).CurrentRegion.Rows.Count).AutoFilter Field:=10, Criteria1:=">=20170901" _ , Operator:=xlAnd, Criteria2:="<=20170931" 2つ目は、同様のデータでInputBoxを利用し、入力した数字をそのままオートフィルタの条件に反映しようとする以下のVBAを入力してみました。しかし、やはり記述の方法が違うのか該当するデータがあるにも関わらず抽出は成功しませんでした・・・。 Dim 日付 As Date 日付 = InputBox("処理月を入力して下さい(例:201709)") Range("A1:K" & Cells(1).CurrentRegion.Rows.Count).AutoFilter Field:=10, Criteria1:=">= 日付 & 01" _ , Operator:=xlAnd, Criteria2:="<= 日付 & 31 " どなたかご助力いただけるととても助かります、どうぞよろしくお願いいたします!m(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

お節介ついでに追記させていただきます。 連投すいません。 J列の「日付」が全行において文字列で入っているなら、 逆手に取るのも手段の一つかもしれません。 > 日付 = InputBox("処理月を入力して下さい(例:201709)") として、年月(6桁)で入力させるのであれば、   日付 = InputBox("")   Range("A1").AutoFilter Field:=10, Criteria1:="=" & 日付 & "*" のように、インプットボックスの結果にワイルドカード文字の「*」を追加、 それをもってフィルタをかけてしまおう、という事ですね。 ワイルドカード文字「*」は「何でも何文字でも」の意味ですから、 インプットボックスの結果として代入された文字列で始まる・・ 例えば「201709」で始まる文字列をフィルタ条件として渡せるわけです。 フィルタの対象が文字列なのであれば、コレが多分有効です。 ただ、コレだと「数値」として入力されているモノは 当然のごとくフィルタから弾かれてしまいます。 どちらにしても、データの整理整頓は大切ですよ、というお話ですね。

osashi
質問者

お礼

ご教授いただいた通り、「*」を使用しましたら、指定のデータを含む場合でうまくいきました!また、日付をDateと定義していたのもよくなかったようで、文字列のStringにしたらうまくいきました!(≧▽≦)

その他の回答 (3)

回答No.3

オートフィルタ、ですね。 前半の質問について。 該当のJ列、文字列で入力されていませんか? 文字列だと「数字の比較」では抽出がややこしいので注意です。 とりあえず、文法は間違えていないように見えますので、 まず確認するのはそこかな?と思われます。 ところで・・オートフィルタを動かすときは、 表の行列に「空白」を挟んでいないなら、 全範囲を指定する必要は無かったりします。 つまり今回のだと   Range("A1").AutoFilter Field:=10, _               Criteria1:=">=20170901", _               Operator:=xlAnd, _               Criteria2:="<=20170931" で充分いけたりします。 空白列・空白行を含むなら、全範囲を指定する必要がありますけどね。 スッキリ書きたいときにどうぞ。 後半の質問は文法の問題。 > Criteria1:=">= 日付 & 01" コレだと「日付 & 1」という文字列と比較という命令だと受け取られます。 なのでちゃんと変数「日付」に代入されている値を引き出せるように   Criteria1:=">=" & 日付 & "01" と、ダブルクォーテーションから出してあげましょ。 理解しやすい(と思う)例として、ワークシートのセルに   ="日付 & 01"   ="日付"&"01" と入力したらセルに表示される値はそれぞれどうなるでしょう? まぁ、厳密には少し違ったりもしますが、感覚はそんな感じです。 ここは多分、これで解決できると思います。 が、前半同様、表の中の「日付」が文字列だったら こちらも正しく抽出しないと思われます。 踏まえ、まずは対象セルの表示形式をご確認くださいませ。 なお添付図は、質問文中でご提示のコードを動かす前後の比較、 上が使用前、下が使用後です。 文字列で入力されている3行目と7行目 (セルの左上に警告の緑▼がついていますね)が フィルタから弾かれているのを見取っていただければ幸い。

osashi
質問者

お礼

&の使用法についてご教授いただき、ありがとうございます!また、教えていただいた通り、該当の列は文字列で入力されていたようです!(>_<)左上に緑の▼が表示されているかどうかも文字列かどうかを見分ける方法の一つなのですね…!凄く勉強になりました!

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

下記は期間の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を使うのだと思います。いろいろ質問者で、試行してやってみてください。

osashi
質問者

お礼

日付のデータについて、参考のURLをご提供いただき、ありがとうございます!<m(__)m>バージョンによってオートフィルタの結果が異なるのですか…!目から鱗です!変数の宣言をDateからStringに直したらうまくいったので、文字列だったようです…!

  • SI299792
  • ベストアンサー率48% (715/1479)
回答No.1

私がやってみたら、抽出できました。 Field:=10 ならば、J列ですが、それで間違いないですが。 20170901だと、日付のようですが、本当に8桁の数字で入っていますか、日付の形式で入っていませんか。ご確認ください。 InputBoxの記述は間違い。""の中に変数は書けません。 Criteria1:=">=" & 日付 & "01" Criteria2:="<=" & 日付 & "31" にして下さい。

osashi
質問者

お礼

""の中に変数入力できないんですね…(T_T)今まで知らず、お恥ずかしい限りです…。ご回答いただいて本当にありがとうございます!とても勉強になりました!

関連するQ&A

  • マクロ オートフィルタで困っています。

    マクロ オートフィルタで困っています。 1列目と2列目からそれぞれ条件をフィルタで抽出し、抽出された行を削除するマクロを組んだのですが(下記)、Bの条件が表にない場合に2行目から下が全て削除されてしまいます。 元の表は毎週変わるため、抽出する条件があるかないかはその時次第です。 オートフィルタにこだわってはいませんが、その他の抽出方法もいまいち分からず……。 どのようにすればよいのか、教えていただけますでしょうか。 宜しくお願い致します。 <マクロ> Sub Macro() Selection.AutoFilter Field:=1, Criteria1:="A" Selection.AutoFilter Field:=2, Criteria1:="B", Operator:=xlAnd Dim gyou(1) As Long gyou(0) = 2 gyou(1) = Range("A1").CurrentRegion.Rows.Count Rows(gyou(0) & ":" & gyou(1)).Select Selection.Delete Shift:=xlUp End Sub

  • オートフィルタのVBAについて

    初めまして、オートフィルタに係るVBAについて質問させてください! A列にりんごやぶどうなど果物の名前が入っているデータがあり、K列までデータが 入っています。(B列以降は果物の個数や値段のデータなので、果物の名前はA列のみです。)うち、「りんご」、「みかん」、「もも」、「いちご」のデータのみを抽出したいため、以下のようなVBAを記述しました。 しかし、実行したところエラーコード1004「RangeクラスのAutofillメソッドが失敗しました。」というメッセージが出てきたため、処理ができませんでした。 何か範囲の指定方法が間違っているのでしょうか…? ご教示いただけるととても嬉しいです。 よろしくお願いいたします。 Rows("1:1").AutoFilter ActiveSheet.Range("A1:K" & Cells(1).CurrentRegion.Rows.Count).AutoFilter Field:=1, Criteria1:= _ Array("りんご", "みかん", "もも", "いちご"), Operator:=xlFilterValue

  • EXCEL2000のVBAでオートフィルタの条件について

    いつもお世話になります。 VBAでオートフィルタの条件を、4/1~4/30まで指定する時に、 AutoFilter Field:=1, Criteria1:=">=2003/4/1", _ Operator:=xlAnd, Criteria2:="<=2003/4/30" というような式になると思うのですが、この日付の条件「>=2003/4/1」と「<=2003/4/30」をあらかじめシートのA1とB1セルに入力しておき、 AutoFilter Field:=1, Criteria1:="A1", _ Operator:=xlAnd, Criteria2:="B1" としたいのですが、このままでは、当然検索条件自体が「A1」「B1」となってしまいますよね。。。 セルを指定することって、できますでしょうか? 宜しくお願いします。

  • オートフィルターの使い方

    マクロでオートフィルタを使おうと思っているのです。 作成したリストの中で、日付でフィルタしようと思い 下記を作成してみましたがうまくいきません。 Worksheets("シート名").Range("A2").AutoFilter Field:=30, Criteria1:="<=2004/9/30", Operator:=xlAnd = 1, Criterial2:=">=2004/9/1" 条件と致しましては任意の期間(例:2004/9/1~2004/9/30)を抽出条件としたいのですが・・・ 又、セルには空白も存在します。 宜しくお願いいたします。

  • VBAでオートフィルタを使った抽出がうまくいきませんのでどなたか教えて

    VBAでオートフィルタを使った抽出がうまくいきませんのでどなたか教えてください。 A列、C列に日付が入っていて、A列は空白以外のセルを表示し、かつC列は、開始日、終了日で抽出したいのですが、うまくいきません。 With Worksheets("sheet").Activate 開始日 = ">=" & TextBox1.Text 終了日 = "<=" & TextBox2.Text .Range("A1:N200").AutoFilter Field:=1, Criteria1:="<>" .Range("A1:N200").AutoFilter Field:=3, _ Criteria1:=開始日, Operator:=xlAnd, _ Criteria2:=終了日

  • オートフィルタ マクロについて

    質問です。 オートフィルタで複数列を1つの条件で抽出したいのですが、教えてください。 たとえばA列が納品書No.・B列が受注No.・C列が商品No.なのですがすべて数字の為、出来ればInBox一回でA-C列を検索してほしいです。 指定納品書NO 受注NO 元品番 21812 3252608 77 21880 3307989 32B 22053 3389769 95414A 22050 3389770 67312H 22052 3389771 67312H 22050 3389773 67118H 以下の様なマクロを作ってみましたが、 A-C列全てに一致しないと抽出しないようです。 どなたかご教授いただけないでしょうか? マクロ '条件1 の設定 Dim 検索NO As Variant '抽出キーの入力指示 検索NO = InputBox("検索NOを入力てください。") 'キャンセルした場合の処理 If 検索NO = Empty Then Exit Sub End If 'オートフィルタがかかっていなかったらかける 'かかっていたら念の為一度解除し再設定 If ActiveSheet.AutoFilterMode = False Then Range("A2:O2").Select Selection.AutoFilter Else Selection.AutoFilter Range("A2:O2").Select Selection.AutoFilter End If Selection.AutoFilter Field:=1, _ Criteria1:=">=" & 検索NO, Operator:=xlAnd, Criteria2:=" " & 検索NO Selection.AutoFilter Field:=2, _ Criteria1:=">=" & 検索NO2, Operator:=xlAnd, Criteria2:=" " & 検索NO2 Selection.AutoFilter Field:=3, _ Criteria1:=">=" & 検索NO3, Operator:=xlAnd, Criteria2:=" " & 検索NO3 AutoFilterMode = False Application.ScreenUpdating = True End Sub よろしくお願いいたします。

  • EXCEL2003のオートフィルターで、今日又は昨日をマクロで抽出した

    EXCEL2003のオートフィルターで、今日又は昨日をマクロで抽出したいのです。 2007の、日付フィルターに相当するものになります。 (1)http://q.hatena.ne.jp/1131101536 を参考にして、 Selection.AutoFilter Field:=1, Criteria1:="=" & Date, Operator:=xlAnd としましたが(A列に日付データが入っています)、実行すると「2010/05/28」で検索され抽出されません。 手打ちで「2010/05/28」を「2010/5/28」に変更すると抽出されました。 (2)使用していないH1セルへ「=today()」と入れ、  Criteria1: Range("H1") としましたが、シリアル値で検索されるためかやはり出ませんでした。元のデータはもちろんシリアル値なので、表示はyyyy/mm/ddに設定しています。 (3)次に  Criteria1:="=" & Range("H1") としましたが、(1)と同じ結果になってしまいました。 うまくフィルタリングするにはどうすればよいか教えてください。

  • エクセルVBAでオートフィルタの結果をコピーして別シートに貼り付け

    よろしくお願いします。今下のようにコードを書いています。 見よう見まねですが・・・。 追加情報の範囲をデータシートのデータのある最終行の下に 入れるものなのですが、 追加情報シートでオートフィルタをかけてから、その結果を 貼り付けたいのですが、コードをどのようにつなげたらいいか 教えていただけないでしょうか。 追加情報シートのBD列で、0より大きい値を抽出して、それを 元の(下のコード)のようにサイズを変更して、貼り付けたいと思います よろしくお願いします。 With Worksheets("追加情報").Range("AA1").CurrentRegion .Offset(1, 2).Resize(.Rows.Count - 1, .Columns.Count - 2).Copy End With Worksheets("データ").Range("C65536").End(xlUp).Offset(1). _ PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False Sub オートフィルタ() Range("BD1").Select Selection.AutoFilter Selection.AutoFilter Field:=30, Criteria1:=">0", Operator:=xlAnd End Sub

  • Excelマクロでオートフィルターからコピペ

    ファイルのB列の値から0以外の値をオートフィルターで抽出し、値を、別のファイルのD列の一番下に貼りつけるマクロを作っていますがうまくいきません。 今作ったのは Sub macro1() If ActiveSheet.AutoFilterMode = False Then Range("A:G").Select Selection.AutoFilter Else Selection.AutoFilter Range("A:G").Select Selection.AutoFilter End If Selection.AutoFilter Field:=2, Criteria1:="<>0", Operator:=xlAnd Range("A1").Select Range("B2", Range("B2").End(xlDown)).Select Selection.Copy Windows("貼りつけるファイル名").Activate Cells(Rows.Count, 4).End(xlUp).Offset(1).Select ActiveSheet.Paste End Sub です。 フィルターで0以外の値を抽出しコピーまではできていますが、貼りつけるところでエラーがでます。 Microsoft Visual Basic 400 というエラーです。 何が悪いのか分かりません・・・。 分かる方いましたらご教授ください。よろしくお願いします。

  • マクロ 日付 オートフィルター

    いつも回答して頂きとても感謝しています。 日付の範囲をオートフィルターで抽出しようとしましたが、抽出されませんでした。 マクロのステップでオートフィルター実行の所まで動かし、フィルターの状態を確認した所、日付が入力されている列で実行されていました。フィルターの中身を確認した所、日付が2013/8/16(月)等で表示されていました。(aaa)の箇所のみ削除して実行した所、抽出が上手くいきました。 試しに、セル書式のユーザー設定でyyyy/m/d (aaa)と入力し、見た目の表示を合わせましたが無駄に終わりました。何が原因で、何処の記述を変えればいけるのでしょうか?宜しくお願い致します。 変数の最初,最後,終了1,開始2は全て Date です。 最初 = Format(開始2, "yyyy/m/1") If 終了1 < Format(DateAdd("m", 1, 開始2), "yyyy/m/d") Then 最後 = 終了1 Else 最後 = DateAdd("d", -1, DateAdd("m", 1, 最初)) End If With ws1 MaxR = .Cells(Rows.Count, 2).End(xlUp).Row MaxC = .Cells(2, Columns.Count).End(xlToLeft).Column 日付c = .Rows(2).Find(what:="発生日時", LookIn:=xlValues, _ lookat:=xlWhole, searchorder:=xlByColumns, _ searchdirection:=xlNext).Column .Range(.Cells(2, 日付c), .Cells(MaxR, MaxC)).Sort _ Key1:=.Cells(2, 日付c), order1:=xlAscending, Header:=xlYes If .AutoFilterMode = True Then .AutoFilterMode = False End If .Cells(2, 日付c).AutoFilter field:=1, Criteria1:=">=" & 最初, Operator:=xlAnd, _ Criteria2:="<=" & 最後

専門家に質問してみよう