Excel VBAで絞り込みリストがない場合にエラーメッセージを表示する方法

このQ&Aのポイント
  • ExcelのVBAを使用して、絞り込みリストがない場合にエラーメッセージを表示する方法について教えてください。
  • VBAで絞り込みリストが表示されない場合に、ポップアップメッセージを表示して中止を促す方法について教えてください。
  • ExcelのVBAで、絞り込みリストが存在しない場合にエラーメッセージを表示し、再入力を求める方法について教えてください。
回答を見る
  • ベストアンサー

オートフィルタ 絞込み

ExcelのVBAです。 作っているのですが、 絞り込む物がリストに無くても、 絞込み、空のページが表示されます。 例えば、    A   B   C 1  あ   K   A 2  い   K   A 3  う   L   A 上記のようなデータがある場合に、 B列のフィルタには K 、 L の絞込みリストが表示されます。 しかし、VBAの場合は K、L以外の入力で絞り込むことができます。 例)あいうえおでB列絞り込んでみる Selection.AutoFilter Field:=Range("B1").Column, _ Criteria1:="あいうえお" 当然のことですが、 あいうえおと表記された所はないため、 何も表示されません。 せめてポップアップを出し、中止を促したいです。 MsgBox "絞り込み条件がありません " MsgBox "絞り込めないため終了します" などなど。 できれば、エラーメッセージをだし 再入力を求めるなどあれば良いのですが、 なにか良い方法はありますか?

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは。お邪魔します。 サンプルとして、 検索(.Find メソッドを実行)してみてヒットするかどうかで分岐するのでは如何でしょう。 メッセージボックスで見つからない旨知らせつつ[再試行|キャンセル]を問うようにします。 中止を選ぶシーケンスが2通り、再度インプットボックスを表示するシーケンスも2通り、です。 この手のループはやり過ぎるとユーザーから鬱陶しがられますから、 なるべくシンプルに(何をするにもダイアログ表示は2回までとか決めて)纏めたいですね。 抽出する列位置は、長整数変数nFieldで指定しています。 恐らく固定値での運用ではないでしょうから、可変にする工夫は考えてみて下さい。 抽出対象範囲は、こちらで例示した   With Range("A1:C4") のようにSelection等曖昧な参照は避けるべきで、明示的に指定する必要があります。 (抽出対象範囲を参照するRange オブジェクトであれば、どのような指定でもOKです。) ご質問の例では、項目タイトル行がなく、データが1行めから始まっていますが、 その状態ではオートフィルタは正確に機能しません。 (データの先頭行が常に表示されます。) こちらでは、1行めに項目タイトル行を挿入して適当なタイトルを付けてテストしています。 4行めまでを抽出対象範囲に指定しているのは、こういう経緯です。 今風にInputBox()関数の代りにInputBoxメソッドを使っています。 入力操作をアシストする意味でInputBoxメソッドの引数に初期値 Default:=Cells(nField, 2) (データ先頭行の値)を指定しています。或いは項目タイトルを指定して Default:=Cells(nField, 1) ガイドするのもあり、でしょうし、 お節介を避けたい場合は、 Default:="" 何も指定しない方が好いのかも知れません。 全体として、基本的なことしかしていませんので、オンデマンドで編集してみてください。 Sub Re8336521()   Dim r As Range   Dim sSearch As Variant   Dim nField As Long   nField = 2   If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False   With Range("A1:C4")     Do       sSearch = Application.InputBox(Prompt:="検索する内容を記述して下さい。", _                     Title:=Chr(64 + nField) & "列から抽出", _                     Default:=Cells(nField, 2), Type:=2)       If VarType(sSearch) = vbBoolean Then  '  InputBoxメソッド、キャンセルの場合         MsgBox "中止"         Exit Sub       ElseIf sSearch = "" Then  '  InputBoxメソッド、未入力の場合         MsgBox "再入力"       ElseIf .Columns(nField).Find(What:=sSearch, _                   LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then  '  検索の結果ヒットしない場合         If MsgBox(sSearch & " は、見つかりません。", vbRetryCancel) = vbCancel Then           MsgBox "中止"           Exit Sub         End If       Else  '  検索の結果ヒットした場合         Exit Do  '  ループを抜けて次の処理へ       End If     Loop     .AutoFilter Field:=nField, Criteria1:=sSearch   End With End Sub

satoron666
質問者

お礼

回答ありがとうございます。 検索するという方法がありましたか。 無ければ終わりにすれば良いのですしね。 参考にプログラムを組んでみます。 ありがとうございました!

その他の回答 (1)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! >しかし、VBAの場合は >K、L以外の入力で絞り込むことができます おそらく絞り込みデータがない場合はエラーになってしまうと思うのですが・・・ (On Error Resume Next のようにコードが入っているとデータが0でも絞り込むかもしれません) オートフィルタをかけるというコトは1行目が項目行になっているという前提で・・・ Sub Sample1() Dim k As Long, endRow As Long, str As String 入力: str = InputBox("検索文字を入力") endRow = Cells(Rows.Count, "A").End(xlUp).Row On Error Resume Next Range("A1").AutoFilter field:=2, Criteria1:=str If AutoFilter.FilterMode Then If Range(Cells(2, "B"), Cells(endRow, "B")).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then MsgBox "該当データなし、再入力してください" GoTo 入力 End If End If End Sub のような感じにすればもう一度インプットボックスが表示されます。 ただし、該当データがない場合は延々この操作が続いてしまいますので、 Sub Sample2() Dim k As Long, endRow As Long, str As String str = InputBox("検索文字を入力") endRow = Cells(Rows.Count, "A").End(xlUp).Row On Error Resume Next Range("A1").AutoFilter field:=2, Criteria1:=str If AutoFilter.FilterMode Then If Range(Cells(2, "B"), Cells(endRow, "B")).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then MsgBox "該当データなし、操作を中止します" ActiveSheet.AutoFilterMode = False Exit Sub End If End If End Sub のように、個人的には一旦抜けた方が良いと思うのですが・・・m(_ _)m

satoron666
質問者

お礼

回答ありがとうございます。 On Error Resume Next などのエラー回避コードは 入っていないと思います。 ですが、何もエラーが出ないのです。 参考にプログラムを組んでみます。 ありがとうございました!

関連するQ&A

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

    質問です。 オートフィルタで複数列を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 よろしくお願いいたします。

  • オートフィルタをかけるマクロ

    A12からA50に表示されている内容でB列にオートフィルタをかけ、印刷をする というマクロですが、 Selection.Autofilter field:=2, Criteria1:=Range("A12") Activesheet.Printout を39回コピーし、"A12"の部分を"A13"............"A50"に変えていきました。 本当はもっとスッキリできると思うのですが、そこがまだよくわかりませんので どなたか教えていただけないでしょうか。 A列は必ず50までデータがあるとは限りません。 エクセル2003使用の初心者です。 よろしくお願いします。

  • Excelのフィルターなんですが

    A列 B列 1 りんご 2 みかん 3 すいか 1 りんご 2 みかん 3 すいか 1 りんご 2 みかん 3 すいか 上記の表があり、フィルターで1を選ぶ場合に自動マクロで記録すると Selection.AutoFilter Field:=1, Criteria1:="1" となります。これをC3に入力した数字を参照したいので Selection.AutoFilter Field:=1, Criteria1:=cells(1,3) としてみたのですが、うまくいきませんでした 下記のように選択されるようにしたいのですが、どうすればよいのでしょうか? A列 B列 1 りんご 1 りんご 1 りんご

  • 日付をオートフィルタするVBAを教えて下さい。

    Sub 日付を検索() Dim hiduke As Date hiduke = Application.InputBox(prompt:="日付を入力", Title:="日付を検索", Type:=2) Range("D3").Select Selection.AutoFilter Selection.AutoFilter Field:=4, Criteria1:=hiduke End Sub この構文が間違っているようで、日付を 10/27 とか入れても 10/27が選択されません。 4列目(D列)が日付の列です。 何にも表示が出ません。 正しい構文を教えて下さい。

  • 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」となってしまいますよね。。。 セルを指定することって、できますでしょうか? 宜しくお願いします。

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

    マクロ オートフィルタで困っています。 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について

    こんばんは、オートフィルタについて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

  • 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:=終了日

  • オートフィルタの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

  • エクセルの絞込みによるリスト入力

    エクセルについて教えてください。 (1) A列を入力規制で『部』というリスト1からの入力になっています。 リスト1内には『1部、2部、3部』と入っているとします。 例えばA列に『1部』という名前をリストから選び、TabにてB列に移動した時 A列が『1部』であったならリスト2を表示、 A列が『2部』であったならリスト3を表示するという方法は可能でしょうか? リスト2には企画1課、企画2課・・ リスト3には営業1課、営業2課・・と入っているとします。 さらに、B列が『企画1課』と表示され C列にTab移動した時C列には人名リストから表示される、 といった絞込みのリスト入力をしたいと考えております。 (2) さらに、今回のようにA,B,C列をリスト内からの入力にしているのですが A列にリストから入力し、B列にTab移動した時に自動でリストが表示する方法は 可能でしょうか? 初心者であるためVBAは使用したことが無いので関数レベルで可能であれば 助かります。 よろしくお願いいたします。

専門家に質問してみよう