• ベストアンサー

マクロで検索条件2つのデータを探してくるには

かなり初心者の質問ですいません。 マクロで、エクセルのVLOOKUP関数のような事がやりたいのですが、 条件を2つ設定することはできるのでしょうか。 データは、 ファイル1 商品データA.xls ファイル2 商品データB.xls ファイル3 グループ分け分類.xls とあり、まずはマクロで「商品データA」の下に「商品データB」を貼り付けます(ここまでは問題ありません) このデータには「商品コード」と「区分」があります。 これに応じて、ファイル3の「グループ分け分類.xls」から データを引っ張ってきたいのです。 (ファイル1・2の加工物にも、ファイル3にも  「商品コード」と「区分」があります) この場合のコードのやり方がわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

質問の表現の意味ががはっきりしない。 検索されるデータは商品データA.xlsのシート1と商品データB.xls のシート1とか、なのか(シートまではっきり書くこと。または複数シート全体か。エクセルはシートのデータを直接的には扱うのだ。) そしてシートのデータのフォーマットは同じなのか。 検索の場合は同じでなくてもよい場合があるが。 >これに応じて、ファイル3の「グループ分け分類.xls」から データを引っ張ってきたいのです。 これだとグループ分け分類.xlsが検索されるデータなのか? 「から」といえばそうも取れる。 むしろ、条件のようなものが「グループ分け分類.xls」にあるのでは無いのか? 簡単な実例でも挙げて表現しないと「、何を言っているか判りにくい。 ーー マクロの記録コードの修正で対処できなかったのか。

uchin55
質問者

補足

失礼しました。 まず、すべてのデータはエクセルファイルです。 「商品データ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 のようになれば成功です。 これをマクロで書く方法がわからなくて質問しました。

その他の回答 (1)

  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.2

今更ですが…。 まず、素朴に書く場合。 '=====↓ ココカラ ↓=============================================== 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 '=====↑ ココマデ ↑=============================================== 以上ご参考まで。

uchin55
質問者

お礼

返事が遅くなり、申し訳ございません。 初心者ながら、記述を上から順に理解して、 「なるほど」と感激しました。 まだ下の方の「UBound」はよくわからないのですが、 いろいろ試してみようと思います。 ありがとうございました。