[[20220609091634]] 『データを抽出するマクロ』(Cngcng) ページの最後に飛ぶ

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

 

『データを抽出するマクロ』(Cngcng)

VBA初めてのため、
説明不足な点があるかもしれませんが、ご助力頂きたいです。宜しくお願いします。

シートにあるデータ中から、除外データに該当するものとしないものを、それぞれ別のシートに出力することを目的とします。

シート1:除外データ(A列)
C2セル 数式:=COUNTIF(A:A,入力データ!F2)
シート2:入力データ(A〜Z列(出力したい列はADEFGIKMWZの10列))
シート3:出力A
シート4:出力B

以下が自分で考えている途中のマクロになり、
とりあえず除外するものを出力するまでの文になります。

 Option Explicit

 Sub AdvancedFilter00()

    Dim ws1 As Worksheet
    Set ws1 = Worksheets("除外データ")

    Dim ws2 As Worksheet
    Set ws2 = Worksheets ("入力データ")

    Dim ws3 As Worksheet
    Set ws3 = Worksheets("出力A")

    Dim ws4 As Worksheet
    Set ws4 = Worksheets("出力B")

    Dim rngl As Range
    Set rng1 = ws1.Range("C2")

    Dim rng2 As Range
    Set rng2 = ws2.Range("A:A,D:G,I:I,K:K,M:M,W:W.Z:Z")

    ws3.Cells.Clear
    ws4.Cells.Clear

    rng2.AdvancedFilter _
    Action := xIFilterCopy, _
    CriteriaRange := rng1, _
    CopyToRange := ws3.Range("A1"), _
    Unique = False

 End Sub

このマクロで実行すると、

 rng2.AdvancedFilter _

の行から構文エラーとなってしまいます。
どこを直したらよいのでしょうか。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


え? 「Unique」のうしろに「:」?

(白茶) 2022/06/09(木) 09:40


>シート2:入力データ(A〜Z列(出力したい列はADEFGIKMWZの10列))

フィルター範囲は、入力データ全範囲
CopyToRangeに、抽出したい列の見出しをコピーしておきます

(マナ) 2022/06/09(木) 09:43


白茶様 「:」を追加したら構文エラーが消えました。ありがとうございます。

マナ様 初心者質問で申し訳ないのですが、CopyToRangeに見出しをコピーとはどういうことなのでしょうか?
(Cngcng) 2022/06/09(木) 10:13


ちゃんと抽出できたのであれば、
わたしのコメントは忘れてください。

(マナ) 2022/06/09(木) 12:17


マナ様の意見を参考に出力ファイルの1行目を見出しにしました。

抽出まで一応することができました。
白茶様、マナ様ありがとうございます。

下記に作成したマクロを記載させていただきます。
ありがとうございました。

シート1:除外データ(A列)

 C1セル 条件A,C2セル 数式:=COUNTIF(A:A,入力データ!F2)=0
 D1セル 条件B,D2セル 数式:=COUNTIF(A:A,入力データ!F2)=0
シート2:入力データ(A〜Z列(出力したい列はADEFGIKMWZの10列))
シート3:出力A(1行目を出力するデータ見出し)
シート4:出力B(1行目を出力するデータ見出し)

 Option Explicit

 Sub AdvancedFilter00()

    Dim ws1 As Worksheet
    Set ws1 = Worksheets("除外データ")
    Dim ws2 As Worksheet
    Set ws2 = Worksheets ("入力データ")
    Dim ws3 As Worksheet
    Set ws3 = Worksheets("出力A")
    Dim ws4 As Worksheet
    Set ws4 = Worksheets("出力B")
    Dim rngl As Range
    Set rng1 = ws1.Range("C1:C2")
    Dim rng2 As Range
    Set rng2 = ws1.Range("D1:D2")

    ws3.Rows("2:" & Rows.Count).Clear
    ws4.Rows("2:" & Rows.Count).Clear

    ws2.Range("A1").CurrentRegion.AdvancedFilter _
    Action:=xIFilterCopy, _
    CriteriaRange:=rng1, _
    CopyToRange:=ws3.Range("A1:J1"), _
    Unique:=False

    ws2.Range("A1").CurrentRegion.AdvancedFilter _
    Action:=xIFilterCopy, _
    CriteriaRange:=rng2, _
    CopyToRange:=ws4.Range("A1:J1"), _
    Unique:=False

 End Sub

(Cngcng) 2022/06/09(木) 20:24


たぶん、この2行は不要だと思います。
あっても問題ありませんが。
 >    ws3.Rows("2:" & Rows.Count).Clear
 >    ws4.Rows("2:" & Rows.Count).Clear

(マナ) 2022/06/09(木) 20:47


マナさんが指摘している部分もですが、そんなにたくさん変数を用意しなくても↓のようにも書けます。
    Sub test01()
        With Worksheets("入力データ").Range("A1").CurrentRegion
            .AdvancedFilter , Action:=xIFilterCopy, CriteriaRange:=Worksheets("除外データ").Range("C1:C2"), CopyToRange:=Worksheets("出力A").Range("A1:J1"), Unique:=False
            .AdvancedFilter , Action:=xIFilterCopy, CriteriaRange:=Worksheets("除外データ").Range("D1:D2"), CopyToRange:=Worksheets("出力B").Range("A1:J1"), Unique:=False
        End With
 End Sub

上記は極端だとしても、本当に変数に格納する必要があるのか検討されてみてはどうでしょうか?

 (変数を多用することによりかえって見づらくなってるような気がします)

(もこな2) 2022/06/10(金) 03:23


マナ様
出力シートにデータがある場合にマクロを実行すると上書きされるという認識でよろしいでしょうか?
 >たぶん、この2行は不要だと思います。

もこな2様
初マクロでしたので、とりあえず学んだことを試してみました。
今後は格納の有無も考えて作成していきます。
アドバイスありがとうございます。
(Cngcng) 2022/06/10(金) 10:13


>出力シートにデータがある場合にマクロを実行すると上書きされるという認識でよろしいでしょうか?
手作業で「フィルタオプション」を使ってみれば理解できると思うのでお試しあれ。

>初マクロでしたので、とりあえず学んだことを試してみました。
>今後は格納の有無も考えて作成していきます。
言ってることと矛盾してしまうかもですが、ご自身が理解できる(理解しやすい)方法が一番です。
是非、いろいろ検討してみてください。

(もこな2) 2022/06/10(金) 12:21


もこな2様
>手作業で「フィルタオプション」を使ってみれば理解できると思うのでお試しあれ。
実際に使ってみて理解できました。

>言ってることと矛盾してしまうかもですが、ご自身が理解できる(理解しやすい)方法が一番です。
>是非、いろいろ検討してみてください。
色々と挑戦して自分のやり方を見つけていきたいと思います。

アドバイスをしていただいた皆様ありがとうございました。
(Cngcng) 2022/06/10(金) 20:36


コメント返信:

[ 一覧(最新更新順) ]


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