
前提
ワークブック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ランキング
-
VB.net
-
VBA 複数列コンボボックス 値の...
-
重複行削除のマクロ
-
エクセルで階層図を作る方法
-
WPSOffice_マクロの有効化について
-
【マクロ】元データと同じお客...
-
VBAで保存しないで閉じると空の...
-
エクセル関数>参照ファイル名...
-
Excel マクロの編集がグレーに...
-
Excelのマクロでボタンを押すと...
-
複数のマクロボタンをまとめて...
-
エクセルのvbaにて thisworkboo...
-
【Excel VBA】マクロでExcel自...
-
エクセル;相対パスを絶対パスへ...
-
エクセル ボタンに設定したマク...
-
エクセルの、記録を終了したマ...
-
エクセルで、「いいね」のよう...
-
エクセル マクロ名にブック名...
-
エクセルでマクロ(Excel 4.0)...
-
セルに入力するたびにマクロを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数値に見えるものはすべて数値...
-
マクロで最終行を取得してコピ...
-
VB.net
-
列から特定の文字列検索→該当以...
-
Excel VBAでオートフィルタで抽...
-
【VBA】条件に一致しない行を削...
-
エクセルのデータがない行には...
-
【マクロ】A列最終行までを、カ...
-
Excel97 指定した行だけマク...
-
エクセルのVBAで指定した行数の...
-
各個体に対する平均値の自動計...
-
Excel マクロ 検索結果を別シ...
-
EXCEL VBAでA列にある空白行よ...
-
オートフィルターの複数条件検...
-
エクセルで階層図を作る方法
-
エクセルで空白行を削除する ...
-
【VBA】条件に一致しない行を削...
-
VBAで入力の結果を他のセルに反...
-
マクロで教えてください。
-
Access2003レポート:最終ペー...
おすすめ情報
コードに誤りがありましたので修正します。
誤:顧客名()
正:顧客名(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