[[20200831161303]] 『マクロで複数列、複数条件のオートフィルタにする』(まりも) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで複数列、複数条件のオートフィルタにする方法』(まりも)

A列、B列に下の3つの条件でオートフィルタをしたいです

1)A列が「111」、B列が「ああ」
2)A列が「222」、B列が「いい」
3)A列が「333」、B列が「うう」

 With Sh

            .Range("A1").AutoFilter Field:=1, Criteria1:="111"  '1番
            .Range("A1").AutoFilter Field:=2, Criteria1:="ああ"

            .Range("A1").AutoFilter Field:=1, Criteria1:="222"  '2番
            .Range("A1").AutoFilter Field:=2, Criteria1:="いい"

            .Range("A1").AutoFilter Field:=1, Criteria1:="333"  '3番
            .Range("A1").AutoFilter Field:=2, Criteria1:="うう"

これだとA列が「333」、B列が「うう」しか抽出されなかったです

3つとも抽出したいときはどうしたらいいか教えてください

< 使用 Excel:Excel2019、使用 OS:Windows10 >


        .Range("A1").AutoFilter Field:=1, Criteria1:=Array("111", "222", "333"), Operator:=xlFilterValues
        .Range("A1").AutoFilter Field:=2, Criteria1:=Array("ああ", "いい", "うう"), Operator:=xlFilterValues
(???) 2020/08/31(月) 16:49

確認ですが、
A列が「111」、B列が「うう」
A列が「333」、B列が「いい」
みたいなデータも抽出対象にしてよいのですか?

また、↑がNGの場合、作業列を設けたりオートフィルタ以外の解決方法でも、問題ないですか?

(もこな2 ) 2020/08/31(月) 19:53


>A列が「111」、B列が「うう」
>A列が「333」、B列が「いい」
>みたいなデータも抽出対象にしてよいのですか?

だめなんです。
A列が「111」の時は必ずB列が「ああ」だけです

>また、↑がNGの場合、作業列を設けたりオートフィルタ以外の解決方法でも、問題ないですか?

With Shが元の形に戻れば問題ありません
でも抽出したものも形が決まってるので元に戻す必要があります

(まりも) 2020/09/01(火) 08:52


自分なりに作ってみました
上手くいきません

教えてください

 Sub フィルター2()

    Dim myFld As String
    Dim myCri1 As String, myCri2 As String, myCri3 As String
    Dim myCri4 As String, myCri5 As String, myCri6 As String
    Dim myRow As Long
    Dim Sh2 As Worksheet, Sh3 As Worksheet

        Set Sh2 = Worksheets("あ")
        Set Sh3 = Worksheets("テスト")

        myCri1 = Worksheets("い").Range("H7")
        myCri2 = Worksheets("い").Range("H8")
        myCri3 = Worksheets("い").Range("H9")
        myCri4 = Worksheets("い").Range("I7")
        myCri5 = Worksheets("い").Range("I8")
        myCri6 = Worksheets("い").Range("I9")

        With Sh2

            .Range("A1").AutoFilter Field:=1, Criteria1:=myCri1  '1番
            .Range("A1").AutoFilter Field:=2, Criteria1:=myCri4

            myRow = .Range("A" & Rows.Count).End(xlUp).Row
            Sh3.Range("A:K").ClearContents

            .Range("A1:K" & myRow).Copy Sh3.Range("A1")
            .Range("A1").AutoFilter

            .Range("A1").AutoFilter Field:=1, Criteria1:=myCri2  '2番
            .Range("A1").AutoFilter Field:=2, Criteria1:=myCri5

            myRow = .Range("A" & Rows.Count).End(xlUp).Row
            'Sh3.Range("A:K").ClearContents

            .Range("A1:K" & myRow).Copy Sh3.Range("A"& Rows.Count).End(xlUp).Row)
            .Range("A1").AutoFilter

            .Range("A1").AutoFilter Field:=1, Criteria1:=myCri3  '3番
            .Range("A1").AutoFilter Field:=2, Criteria1:=myCri6

            myRow = .Range("A" & Rows.Count).End(xlUp).Row
            'Sh3.Range("A:K").ClearContents

            Range("A1:K" & myRow).Copy Sh3.Range("A"& Rows.Count).End(xlUp).Row)
            .Range("A1").AutoFilter

        End With
        Worksheets("テスト").Activate
        Range("A1").Select

End Sub

(まりも) 2020/09/01(火) 09:05


提示されたコードをみると、最終的に「テスト」シートに抽出結果が並べばいいんですかね。
であれば、”ひとつずつ”抽出して貼付するのを3回繰り返せばよくないですか?

また、提示されたコードはご自身で考えたものですか?
構文エラーになる部分があるのと、コメントアウトしてますがClearContentsしているのが気になります。

(もこな2) 2020/09/01(火) 09:39


フィルタオプション(詳細設定)のほうがこの場合は簡単だと思います。
もちろん、手作業でということではなく、
マクロ記録を使用すれば、ほぼそのまま使用できるマクロになります。
(γ) 2020/09/01(火) 09:43

調べて自分で作りました
オートフィルタの部分は元はひとつの抽出を3つにしてみました
なのでClearContentsは最初だけにしてます

>提示されたコードをみると、最終的に「テスト」シートに抽出結果が並べばいいんですかね。
>であれば、”ひとつずつ”抽出して貼付するのを3回繰り返せばよくないですか?

Worksheets("あ")には見出しがあるので見出しは最初だけで大丈夫です
Sub フィルター2() を3つ作って順番に貼付するということですか?

>フィルタオプション(詳細設定)のほうがこの場合は簡単だと思います。
>もちろん、手作業でということではなく、
>マクロ記録を使用すれば、ほぼそのまま使用できるマクロになります。

どうやって3つの条件を設定するのでしょうか?
3つ作ってということでしょうか?

(まりも) 2020/09/01(火) 10:13


 項目1   項目2
 111     ああ
 222     いい
 333     うう
 というようなセル範囲を
 検索条件範囲に指定します。
 もちろん一回の試行ですべて抽出します。
 その場で絞り込むことも、該当データのみ他に複写することも可能です。

 フィルタオプションの使用例を手元の書籍、なければネットで検索されると
 たくさんありますよ。
(γ) 2020/09/01(火) 10:20

>Sub フィルター2() を3つ作って順番に貼付するということですか?
いろんな方法があるとおもいますが、例えばループ処理にするならこんな感じじゃないですか?

    Sub てすと()
        Dim i As Long
        Dim dstRNG As Range
        Dim フラグ As Long

        Stop 'ブレークポイントの代わり

        Set dstRNG = Worksheets("テスト").Range("A1")
        With Worksheets("あ")
            .AutoFilterMode = False

            For i = 7 To 9
                '▼抽出
                .Range("A1").AutoFilter Field:=1, Criteria1:=Worksheets("い").Cells(i, "H").Value
                .Range("A1").AutoFilter Field:=2, Criteria1:=Worksheets("い").Cells(i, "I").Value

                '▼コピペ
                .AutoFilter.Range.Offset(フラグ).Copy dstRNG

                '▼次処理の準備
                フラグ = 1
                Set dstRNG = Worksheets("テスト").Cells(Rows.Count, "A").End(xlUp).Offset(1)
            Next i
        End With

        Application.Goto Worksheets("テスト").Range("A1")
    End Sub

(もこな2) 2020/09/01(火) 10:28


フィルタオプションはエラーが出てできませんでした

エラー
抽出データを作業中のシート以外へコピーすることは出来ません

(まりも) 2020/09/01(火) 10:43


フィルタオプションの件。
それにはコツがあります。
抽出先のシートをアクティブにした状態で
作業を開始して下さい。
# この話は何十回と回答してきました。
# できることは間違いありません。
(γ) 2020/09/01(火) 11:26

フィルタオプションですが抽出先とは抽出範囲ですよね?
アクティブでエラー出てきました
ちなみに下のシートそれぞれアクティブで試したけど
全部同じエラーです
リスト範囲
検索条件の範囲
抽出範囲

検索したら2つのシート間しかありませんでしたが3つのシート
だとできないとかですかね?

(まりも) 2020/09/01(火) 12:00


シートが3つでも問題なくできます。
改めて確認しました。
何か手順が違うのでしょう。

最悪の場合、一つのシートでマクロ記録して
できあがったマクロに手を入れればよいでしょう。
シートの修飾をする(Rangeの頭にWorksheets("Sheet2").などを
つける)ということです。

(γ) 2020/09/01(火) 12:47


rさん
手順違ってました
最後にアクティブだけじゃだめなようです
詳細設定は抽出先で設定して最後にアクティブで成功しました
マクロの記録でやってみます

もこな2さん
ループ処理で綺麗に抽出できました
まだ構文解読中です
Offset(フラグ)なんて使い方ができるのですね
参考に勉強します

(まりも) 2020/09/01(火) 12:58


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.