質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

5351閲覧

EXCELのVBAでフィルタオプションを使いたい

morutemu

総合スコア45

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/05/17 05:33

編集2018/05/17 06:38

Excel 2007のVBAでフィルタオプションを使いたいのですが、
うまく検索ができずに困っております。
どこが間違っているのでしょうか?

シートには、1行目が項目名、2行目が絞り込み内容を入力するところが入っており、
シートはじにある検索ボタン(フォームコントロール)にて
検索VBAを呼び出して検索しているのですが、うまくいきません。

↓シート

項目A項目B項目C項目D項目E項目F項目G
(検索内容)(検索内容)(検索内容)(検索内容)(検索内容)(検索内容)(検索内容)

VBA

1Sub search_Click() 2 If ActiveSheet.FilterMode = True Then 3 ActiveSheet.ShowAllData 4 End If 5 ActiveSheet.Range("A1").CurrentRegion.AdvancedFilter _ 6 Action:=xlFilterInPlace, _ 7 CriteriaRange:=ActiveSheet.Range("A1:J2"), _ 8 Unique:=False 9End Sub

以下を参照
http://www.atmarkit.co.jp/ait/articles/1403/07/news079_5.html

ご質問の回答

1行目:項目名
2行目:フィルター用検索入力
3行目以降:データが並んでおります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

フィルターオプションを使うには、シートに検索条件の領域と検索対象の領域を用意する必要があります(下図を見てください)。

赤枠の部分(A1:G2)が検索条件の領域で、1行目に項目名、2行目に検索内容(値)を入れます。
緑枠の部分(A4:G8)が検索対象の領域で、1行目に項目名、2行目以降に内容(値)を入れます。

イメージ説明

そして、コードでは検索条件の領域の範囲と、検索対象の領域の始まる位置(左上のセル)を指定します。

Sub search_Click() If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData End If ActiveSheet.Range("A4").CurrentRegion.AdvancedFilter _ ''検索対象の領域の位置(左上のセル)を指定 Action:=xlFilterInPlace, _ CriteriaRange:=ActiveSheet.Range("A1:J2"), _ ''検索条件の領域を指定 Unique:=False End Sub

同じ項目名(例えば、「項目A」)が、検索条件の領域と検索対象の領域で別の列にあってもかまいません。
また、検索条件に全部の項目が揃っていなくてもかまいません(項目Cだけで検索するというのもOK)

投稿2018/05/17 07:42

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こうですかねぇ。
G10の10は適当です。
行数にあわせるよう修正してください。

VBA

1 ActiveSheet.Range("A3:G10").CurrentRegion.AdvancedFilter _ 2 Action:=xlFilterInPlace, _ 3 CriteriaRange:=ActiveSheet.Range("A1:G2"), _ 4 Unique:=False

投稿2018/05/17 06:44

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morutemu

2018/05/17 06:58

実はすでにこれと同じようにやってみてたのですが、うまくいかなくて、質問していたのですが、 たぶん、原因は途中に非表示なっていた空白(1行目の項目はあるが、3行目以降のデータはし)の C~F列のせいでした。 ちなみに途中に空白があると検索できませんか?
ttyp03

2018/05/17 07:01

空白があっても大丈夫のようです。 「うまくいかない」というのをもう少し具体的に書かれたほうがよいでしょう。 ○○というデータがあって、検索条件に□□をいれたけど、△△になる。 のような。
morutemu

2018/05/17 07:21

申し訳ないです。会社のデータなので、なかなか表示することができません。 A,B列の検索は大丈夫でしたが、項目名はあるが、データが一切ないC~F列が 入っているとG列以降の検索が意図しない会社名(検索には引っかからないであろう値)を拾ってきていました。
ttyp03

2018/05/17 07:29

途中の列にデータが一切ないもので試してみましたが問題ないですね。 何か他の原因ですかねぇ。 実際に使っているデータそのものでなくていいので、再現できるデータは用意できないでしょうか?
morutemu

2018/05/17 08:03

なぜ、そのようなデータが出るのかの解決はできませんでしたが、 Sub reset_Click() If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData End If End Sub Sub search_Click() If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData End If ActiveSheet.Range(Range("A1:F1"), Cells(Rows.Count, 1).End(xlUp)).AdvancedFilter _ Action:=xlFilterInPlace, _ CriteriaRange:=ActiveSheet.Range("A1:F2"), _ Unique:=False End Sub で、とりあえず、動きそうです。 あと、空白の列は必要なさそうなので削除しました。
guest

0

Range("A1")かな、
どの範囲をフィルタ対象にするのか、で、A1はないでしょ。

3行目から空行なしにデータが並ぶ、
ということであれば、

Dim r As Long r = 3 Do Until IsEmpty(ActiveSheet.Cells(r, 1).Value) r = r + 1 Loop ' ただしDo - Loopを抜けたタイミングのrをそのまま使わず r - 1 を使う

として、r - 1がデータが実在する最終行になるので、
Range("G" & CStr(r - 1))などとすれば良さげ。
(テスト実行してませんけども。)

投稿2018/05/17 05:51

編集2018/05/17 07:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morutemu

2018/05/17 05:58

ちなみにどうしたらよいですか?
退会済みユーザー

退会済みユーザー

2018/05/17 06:12

その前に要求仕様を確認したいのだけど、1行目は項目名が表示され、2行目にフィルター用検索後入力を設けた上で、3行目以降にデータが並ぶ、ということでしょうか。 (それを質問文内に追記してほしいです。)
ExcelVBAer

2018/05/17 06:17

Range("A1").CurrentRegion で、 「CurrentRegion」がどうなってるか次第かもですね。
morutemu

2018/05/17 06:30

>その前に要求仕様を確認したいのだけど、1行目は項目名が表示され、2行目にフィルター用検索後入力を設けた上で、3行目以降にデータが並ぶ、ということでしょうか。 (それを質問文内に追記してほしいです。) その通りです!それであってます。 >Range("A1").CurrentRegion で、 「CurrentRegion」がどうなってるか次第かもですね。 ActiveSheet.Range("A1").CurrentRegion.select 項目からデータまで全て選択されました なので、合っていないでしょう。
dit.

2018/05/17 06:56

セルA1:J1に項目名、セルA2:J2のうち1箇所以上に条件、セルA3:J15くらいまで適当なデータを入れ提示のコードをそのまま使用して、抽出に成功しました。 それ以外のセルには何も入力していません。 実行はシート下部に配置したフォームコントロールのボタンにマクロを登録 「うまくいかない」についてもう少し詳しく情報を出していただけると、どなたかわかる方がいるかもしれません。 エラーが出るのか、フィルターは適応されるが望んだ結果が出ないのか 等
morutemu

2018/05/17 06:59

たぶん、原因は途中に非表示なっていた空白(1行目の項目はあるが、3行目以降のデータはし)の C~F列のせいでした。 列の途中にデータの空白があると検索できませんか?
dit.

2018/05/17 07:04

CurrentRegionは「空白の行列で囲まれたセル範囲」を出すので、C~Fに項目もデータも全くない場合は選択範囲がおかしくなりそうです。ttyp03さんの回答の通り、選択範囲を明確にすることで解消できるかもしれませんが、最終行がどこだかわからないような場合には工夫が必要だと思います。
morutemu

2018/05/17 07:26

なるほど。という事は、CurrentRegionで取得するのではく、最終行を取得して検索させた方がよさそうですね
ExcelVBAer

2018/05/17 07:32

CurrentRegion は手軽なのはいいんですが、 空白行or列や、データ内の空欄などでバグになっちゃうので、 気を付けて使った方がいいでしょうね
morutemu

2018/05/17 07:40

すみません、自分が解決できないので、CurrentRegionなしで、データの最終行まで取得する方法ありますか? ActiveSheet.Range(Range("A3:F3"), Cells(Rows.Count, 1).End(xlUp)).AdvancedFilter _ Action:=xlFilterInPlace, _ CriteriaRange:=ActiveSheet.Range("A1:F2"), _ Unique:=False 自分はこんな風にやってみたのですが、検索されずでした。
dit.

2018/05/17 07:52

検索条件の項目も含まなければいけないので、はじめに選ぶのはA1:F1かなと思います。(未検証) coco_bauerさんの回答を見るとわかりやすいと思いますが、項目&検索条件と項目&データで表を分けられればいいのですが。
ExcelVBAer

2018/05/17 07:57

morutemuさん、学習しない人ですねぇ。。。 根本的な問題は「ちゃちゃっと作ろう」という、 あせる気持ちなんですよ~ 1つずつ確認できるように作ってみませんか? その方が、間違いに気づきやすいので、 結果的に早く作れ、ストレスも少ないのです。
morutemu

2018/05/17 08:08

なるほど。すみません。就業時間に間に合わせたいという一心でした。 申し訳ない。一応これで。動きそうでした。 Sub search_Click() If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData End If ActiveSheet.Range(Range("A1:F1"), Cells(Rows.Count, 1).End(xlUp)).AdvancedFilter _ Action:=xlFilterInPlace, _ CriteriaRange:=ActiveSheet.Range("A1:F2"), _ Unique:=False End Sub
morutemu

2018/05/17 08:08

ありがとうございました。
morutemu

2018/05/17 08:10

焦る心が文字にそのまま出てしまいましたねorz ただ、教えてくださった皆様本当にありがとうございました! 感謝します!!
morutemu

2018/05/17 08:18

そして、色々申し訳ないでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問