dポイントプレゼントキャンペーン実施中!

かなり初心者の質問ですいません。

マクロで、エクセルのVLOOKUP関数のような事がやりたいのですが、
条件を2つ設定することはできるのでしょうか。

データは、

ファイル1 商品データA.xls
ファイル2 商品データB.xls
ファイル3 グループ分け分類.xls

とあり、まずはマクロで「商品データA」の下に「商品データB」を貼り付けます(ここまでは問題ありません)

このデータには「商品コード」と「区分」があります。
これに応じて、ファイル3の「グループ分け分類.xls」から
データを引っ張ってきたいのです。

(ファイル1・2の加工物にも、ファイル3にも
 「商品コード」と「区分」があります)

この場合のコードのやり方がわかりません。

A 回答 (2件)

質問の表現の意味ががはっきりしない。


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

この回答への補足

失礼しました。

まず、すべてのデータはエクセルファイルです。
「商品データ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
のようになれば成功です。

これをマクロで書く方法がわからなくて質問しました。

補足日時:2009/09/18 21:13
    • good
    • 0

今更ですが…。



まず、素朴に書く場合。
'=====↓ ココカラ ↓===============================================
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
'=====↑ ココマデ ↑===============================================

以上ご参考まで。
    • good
    • 0
この回答へのお礼

返事が遅くなり、申し訳ございません。
初心者ながら、記述を上から順に理解して、
「なるほど」と感激しました。

まだ下の方の「UBound」はよくわからないのですが、
いろいろ試してみようと思います。

ありがとうございました。

お礼日時:2009/09/30 21:46

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