
前提
ワークブック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を使う以外でも何か良い方法があればご教授頂けないでしょうか?
No.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数値に見えるものはすべて数値...
-
エクセルで階層図を作る方法
-
エクセルのデータがない行には...
-
【EXCEL VBA】行の表示・非表示...
-
【至急】Excel 同一人物の情報...
-
【VBA】条件に一致しない行を削...
-
Excel97 指定した行だけマク...
-
空白を複数行一気に挿入するには?
-
VBAで保存しないで閉じると空の...
-
WPSOffice_マクロの有効化について
-
Excel マクロの編集がグレーに...
-
エクセルでマクロ(Excel 4.0)...
-
エクセル マクロ名にブック名...
-
Excelのマクロでボタンを押すと...
-
エクセルの、記録を終了したマ...
-
複数のマクロボタンをまとめて...
-
エクセル ボタンに設定したマク...
-
エクセルで、「いいね」のよう...
-
マクロの保存先、開いてるすべ...
-
【マクロ】元データと同じお客...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数値に見えるものはすべて数値...
-
エクセルのデータがない行には...
-
エクセルのVBAで指定した行数の...
-
VB.net
-
エクセルVBA任意の文字で検索し...
-
【至急】Excel 同一人物の情報...
-
【VBA】条件に一致しない行を削...
-
Excel VBAでオートフィルタで抽...
-
【VBA】条件に一致しない行を削...
-
マクロで最終行を取得してコピ...
-
エクセルで空白行を削除する ...
-
vbaエクセルマクロについて she...
-
Excel VBA オートフィルタの結...
-
空白を複数行一気に挿入するには?
-
【マクロ】A列最終行までを、カ...
-
エクセル住所録でフラッグの個...
-
マクロにて指定の文字間の文字...
-
エクセルで階層図を作る方法
-
VBAでsumif関数
-
エクセル VBAに関しての質問
おすすめ情報
コードに誤りがありましたので修正します。
誤:顧客名()
正:顧客名(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