- ベストアンサー
マクロで検索条件2つのデータを探してくるには
かなり初心者の質問ですいません。 マクロで、エクセルのVLOOKUP関数のような事がやりたいのですが、 条件を2つ設定することはできるのでしょうか。 データは、 ファイル1 商品データA.xls ファイル2 商品データB.xls ファイル3 グループ分け分類.xls とあり、まずはマクロで「商品データA」の下に「商品データB」を貼り付けます(ここまでは問題ありません) このデータには「商品コード」と「区分」があります。 これに応じて、ファイル3の「グループ分け分類.xls」から データを引っ張ってきたいのです。 (ファイル1・2の加工物にも、ファイル3にも 「商品コード」と「区分」があります) この場合のコードのやり方がわかりません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
質問の表現の意味ががはっきりしない。 検索されるデータは商品データA.xlsのシート1と商品データB.xls のシート1とか、なのか(シートまではっきり書くこと。または複数シート全体か。エクセルはシートのデータを直接的には扱うのだ。) そしてシートのデータのフォーマットは同じなのか。 検索の場合は同じでなくてもよい場合があるが。 >これに応じて、ファイル3の「グループ分け分類.xls」から データを引っ張ってきたいのです。 これだとグループ分け分類.xlsが検索されるデータなのか? 「から」といえばそうも取れる。 むしろ、条件のようなものが「グループ分け分類.xls」にあるのでは無いのか? 簡単な実例でも挙げて表現しないと「、何を言っているか判りにくい。 ーー マクロの記録コードの修正で対処できなかったのか。
その他の回答 (1)
- _Kyle
- ベストアンサー率78% (109/139)
今更ですが…。 まず、素朴に書く場合。 '=====↓ ココカラ ↓=============================================== Sub Sample() Dim mstSht As Worksheet Dim tgtSht As Worksheet Dim i As Long Dim j As Long Set mstSht = Workbooks("グループ分け分類.xls").Worksheets("Sheet1") Set tgtSht = Workbooks("結合データ.xls").Worksheets("Sheet1") '結合データの2行目から最終行まで回す For i = 2 To tgtSht.Cells(Rows.Count, "A").End(xlUp).Row 'グループ分け分類の2行目から最終行まで回す For j = 2 To mstSht.Cells(Rows.Count, "A").End(xlUp).Row If tgtSht.Cells(i, "A").Value = mstSht.Cells(j, "A").Value And _ tgtSht.Cells(i, "B").Value = mstSht.Cells(j, "B").Value Then tgtSht.Cells(i, "E").Value = mstSht.Cells(j, "C").Value Exit For '見つかれば抜ける End If Next j Next i End Sub '=====↑ ココマデ ↑=============================================== ただし、上のように その都度セルから読み込んで、その都度セルに書き出す方式だと データ数やグループ数が多い場合には時間がかかります。 下のように、配列に一気に読み込んで一気に書き出せば 所要時間はかなり少なくなります。 '=====↓ ココカラ ↓=============================================== Sub Sample2() Dim mstAry As Variant Dim tgtAry As Variant Dim rtnAry As Variant Dim i As Long Dim j As Long 'グループ分け分類のデータを一気に読み込む With Workbooks("グループ分け分類.xls").Worksheets("Sheet1") mstAry = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "C").End(xlUp)) End With '結合データのデータを一気に読み込む With Workbooks("結合データ.xls").Worksheets("Sheet1") tgtAry = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "B").End(xlUp)) End With '書き出しデータ用の配列を用意する ReDim rtnAry(1 To UBound(tgtAry), 1 To 1) For i = 1 To UBound(tgtAry) For j = 1 To UBound(mstAry) If tgtAry(i, 1) = mstAry(j, 1) And tgtAry(i, 2) = mstAry(j, 2) Then rtnAry(i, 1) = mstAry(j, 3) Exit For End If Next j Next i 'E2セル以下に結果を一気に書き出す Workbooks("結合データ.xls").Worksheets("Sheet1") _ .Range("E2").Resize(UBound(tgtAry), 1).Value = rtnAry End Sub '=====↑ ココマデ ↑=============================================== 以上ご参考まで。
お礼
返事が遅くなり、申し訳ございません。 初心者ながら、記述を上から順に理解して、 「なるほど」と感激しました。 まだ下の方の「UBound」はよくわからないのですが、 いろいろ試してみようと思います。 ありがとうございました。
補足
失礼しました。 まず、すべてのデータはエクセルファイルです。 「商品データA.xls」と「商品データB.xls」はどちらもフィールド数が同じで、 結合したものを仮に「結合データ.xls」とします。 結合データ.xlsの内容は、 A列 B列 C列 D列 商品コード 区分 金額 購入日 A001 A 30,000 20090901 A005 B 20,000 20090901 B006 A 15,000 20090903 A001 C 30,000 20090903 とうようになっています。 これに対し、「グループ分け分類.xls」の内容は A列 B列 C列 商品コード 区分 グループ名 A001 A 分類A A001 B 分類B A001 C 分類A B006 A 分類A B006 B 分類C となっています。 「結合データ.xls」に「グループ分け分類.xls」のデータを 検索で流していきたいのです。 結果、「結合データ.xls」の完成予想では A列 B列 C列 D列 E列 商品コード 区分 金額 購入日 グループ名 A001 A 30,000 20090901 分類A A005 B 20,000 20090901 分類B B006 A 15,000 20090903 分類A A001 C 30,000 20090903 分類A のようになれば成功です。 これをマクロで書く方法がわからなくて質問しました。