電子書籍の厳選無料作品が豊富!

前提
ワークブック1:オートフィルタでの作業用と抽出結果のまとめ用シートがある
ワークブック2:A列に顧客名(数十人)、B列以降に顧客情報(数十列)
ワークブック3:A列に顧客名(数十人)、B列以降に顧客情報(数十列)
※ワークブック2と3には共通する顧客名が含まれるが、顧客情報の種類がそれぞれ異なる。

やりたいこと
①ワークブック2、ワークブック3にそれぞれ異なる条件(顧客情報の)でオートフィルタをかける。②ワークブック2で抽出された顧客名でワークブック3にフィルタをかけワークブック2と3の両方に存在する顧客情報を抽出。
③ワークブック3の抽出された顧客情報をワークブック1の指定したシートにコピペする。

問題点
オートフィルタで複数条件で抽出を行う際、下記のようにfilter(0),filter(1)と数十人分コードを書いておけばマクロは動くのですが、コードを書くこと自体大変ですし、顧客数が数百ともなると不可能です。
Dim filter(2) As String
filter(0) = XXX '共通する顧客名1を取得
filter(1) = XXX '共通する顧客名2を取得
filter(2) = XXX '共通する顧客名3を取得
.
.
.
Range("A1").AutoFilter Field:=1, Criteria1:=filter(), Operator:=xlFilterValues

Q1:そこでワークブックにオートフィルタをかけて抽出された顧客名でCollectionを作り下記のようなコードを書いたのですが因数は省略できませんとのエラーが出てうまくいきませんでした。そもそもCollectionを使ってこのようなことはできないのでしょうか?
Dim 顧客名 As New Collection
〜Collectionの作成など、中略〜
   Range("A1").AutoFilter Field:=1, Criteria1:=顧客名(), Operator:=xlFilterValues


次に下記のようなコードを書き、顧客名を一人ずつ抽出し、顧客情報を一人分ずつワークブック1へコピペすれば泥臭いですがやりたいことはできました。
Dim 顧客名 As New Collection
〜Collectionの作成など、中略〜
For i = 1 To 顧客数

With Workbooks(3).Worksheets(1)
.Range("A1").AutoFilter Field:=1, Criteria1:=顧客名(), Operator:=xlFilterValues

.Range("A1").CurrentRegion.Offset(1, 0).Copy Destination:=Workbooks(1).Worksheets(i * 顧客情報数 + 1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
End With

Next i

Q2:しかし処理時間がかなりかかり、もう少し短時間で処理する方法はないでしょうか?
Collectionを使う以外でも何か良い方法があればご教授頂けないでしょうか?

質問者からの補足コメント

  • コードに誤りがありましたので修正します。
    誤:顧客名()
    正:顧客名(i)

    Dim 顧客名 As New Collection
    〜Collectionの作成など、中略〜
    For i = 1 To 顧客数

    With Workbooks(3).Worksheets(1)
    .Range("A1").AutoFilter Field:=1, Criteria1:=顧客名(i), Operator:=xlFilterValues

    .Range("A1").CurrentRegion.Offset(1, 0).Copy Destination:=Workbooks(1).Worksheets(i * 顧客情報数 + 1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
    End With

    Next i

      補足日時:2017/08/12 06:47

A 回答 (1件)

フィルタをかけるところだけ、作ってみました。


こんな感じです。

Sub sample()
Dim r As Range
Dim filter As Variant
For Each r In Workbooks(2).Worksheets(1).UsedRange.Columns("A").SpecialCells(xlCellTypeVisible)
If filter <> "" Then filter = filter & ","
filter = filter & r.Value
Next r
filter = Split(filter, ",")
Range("A1").AutoFilter Field:=1, Criteria1:=filter, Operator:=xlFilterValues
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
まさしく自分がやりたかったことができました。
ベストアンサーです。

お礼日時:2017/08/14 18:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!