• ベストアンサー

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

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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」はよくわからないのですが、 いろいろ試してみようと思います。 ありがとうございました。

関連するQ&A

  • エクセルのデータ検索について困っています

    仕事で、エクセルを使ってグループ・日付・商品名・金額の集計表から自動で別のグループ分けした表にデータを写したいのですが、どなたか教えてください。VLOOKUP関数を使ってみましたが、グループ分けした最初のデータしか写りませんでした。 集計表 グループ 日付  商品名 金額  A    1.1  あああ 100  A    1.10  いいい 100  B    1.10 いいい 100  B    1.15  ううう 100 別表            グループA 表        グループB 表  1.1 あああ 100      1.10 いいい 100 1.10 あああ 100      1.15 ううう 100 集計表は1枚で、グループ分けした表は、30ほどあり、集計表のグループ部分はランダムに記入されています。

  • MSアクセスのDBからエクセルのVBAで情報を抽出する

    いつもお世話になります。 以下のフォーマットでアクセスに十数万行のデータがあります。 JANコード,商品名,分類1,分類2,分類3,分類4 そして、エクセルのSheet1のA列に、数百から数千のJANコードが並んでいるのですが、マクロを起動させることによって、B列以降に、同じJANコードの商品名から分類4までをVLOOKUP関数のようにくっつけたいのですが、そのようなことは可能でしょうか。 尚、エクセルファイルとアクセスファイルは、同じフォルダに保存されているとします。

  • マクロ(Excel)で検索して値の返し方について

    マクロの初心者です。関数でいうvlookupなどを使って、 検索した値を反映させるマクロをお教え下さい。 ファイル名「担当ID.xls」のB列へ「顧客名簿.xls」から 検索したC列(地域)を返したいです。 お手数おかけしますが、全くの初心なので、マクロの 説明コメントも記載して頂けると助かります。 ■ファイル名:担当ID.xls 列A         B      C 顧客番号 地域  担当ID A-1111       ?  os123 A-2222       ?  nr456 A-3333       ?  wk789 ■ファイル名:顧客名簿.xls ■シート名:Sheet1 列A      B     C 顧客番号  名前   地域 A-1111   A   大阪 A-2222   B   奈良 A-3333   C   和歌山 以上です。よろしくお願いいたします。

  • ifとvlookupに代わるようなマクロ

    お願いします。 一行1件で900件程度のデータがあります。1件当たりの項目(列)は150ほどです。住所録.xlsというファイルです。 これとは別に、個別1.xls~個別30.xlsというファイルがあり、それぞれシートが30ずつあります。 このシート全てに同一の個票フォーマットを作りました。vlookupやifとvlookupの組み合わせ関数をそれぞれの該当セルに入れれば各データは取り出せるのですが、非常に重く実用に向きません。こういった作業を効率よく行えるマクロをお教え願えませんでしょうか? 宜しくお願いいたします。

  • 難しい挿入マクロを教えて下さい

    下の図では 小さくて 分かり難く すみません。 いろいろ調べてみましたが、とても難しく、限界です。ご指導をお願いしたくて、質問させていただきます。   あるフォルダに、『商品コード.xls 』(B列とC列だけのデータ)というブックと、 『データ【1】.xls 』 という名前のブックが【1】~【76】まで(様式は全部おなじ) 全部で 77個のブックがあります。   『商品コード.xls 』のコードを基準にして、『データ【1】.xls 』 ~ 『データ【76】.xls 』 の 全てのデータのD列を検索し、 E列を挿入して、商品を記入したいのです。   その場合、 『商品コード.xls 』のB列(商品コード)と、 『データ【1】.xls 』 ~ 『データ【76】.xls 』 のD列の英字が、全半角・大小文字が混在していますので、 これを、半角大文字に揃えてから検索・・・・そんな わがままなマクロは可能でしょうか?   そして、もうひとつ、 『データ【1】.xls 』 ~ 『データ【76】.xls 』 にE列を挿入・検索後、 ひとつひとつのブックをみていき、E列に商品名がついてないコード(『商品コード.xls 』にないもの)を 新たに作り、 基準となる『商品コード.xls 』に追加し(更新)、 更新された『商品コード.xls 』で再度 76個全てを検索し直します。   一度 E列を挿入・商品を記入した後、更新した『商品コード.xls 』で再び検索するというマクロは、 コードのどこかの箇所を変更すれば、対応できるでしょうか? それとも、もう一度 作りなおすことになるのでしょうか? わがまま過ぎる、勝手なお願いですが、  ご指導、よろしくお願いします!     ※『商品コード.xls 』の行は、約 1,000行    『データ【1】.xls 』 ~ 『データ【76】.xls 』 の行は それぞれちがいますが、    少ないデータで約200行、多いものは 5万行ほどもあります。

  • 【Excel】一致するデータの検索

    Excel2003を使用しています。 Sheet1のB列の値がSheet2のA列に入力されている値と一致したら、Sheet1のC列とD列の値をSheet2のC列とD列に表示させたく、VLOOKUP関数を使用したところ、Sheet1のB列とSheet2のA列のデータの並び方(順序)が同じではないためか、VLOOKUP関数ではできませんでした。 こういう場合、マクロで処理することは可能でしょうか?可能であれば、どのようにコードを記述すればいいでしょうか? Sheet1のデータは4行目から、Sheet2のデータは6行目から入力されています。 よろしくお願いします。

  • VBAにて検索して検索結果を表記

    はじめまして。 VBAにてファイルAとBがあり、ファイルAにファイルBのデータがあるかを検索して、 ある場合はファイルAの検索した値が入力されているセルの二つ隣のセルに 「あり」、ない場合は「なし」と表記したいのですが、どうしたら可能でしょうか。 FINDで検索して、IF関数NOTHINGとElseで場合分けまでできましたが、 表記できませんでした。 また、VLOOKUPで検索した場合は、IF関数の場合分けもできませんでした。 ご教授願います。

  • 別excelのデータを引き出す時に、そのexcel名称を可変にしたいと思っています。

    別excelのデータを引き出す時に、そのexcel名称を可変にしたいと思っています。 なるべくマクロを使わないで出来るでしょうか? 例: =VLOOKUP(A1,[B.xls]Sheet1!$A$1:$E$10,4,FALSE) という関数を指定したとします。 [B.xls]Sheet1 この部分をセルA1に入れて、内容を変更することで 引き出し元のファイル&シートを変えたいと思っています。 つまりA1のセルの値を[C.xls]Sheet2にすることで、C.xlsファイルのSheet2からデータを引っ張って来たいのです。 出来るでしょうか? ご存知の方いらっしゃいましたら、宜しくお願い致します。 環境は OS:WINDOWS98 EXCEL2000 です。

  • マクロ

    お世話になります。 仕事(加工業)でマクロを使用したいのですが、例えば 重さとサイズの異なる加工素材が100枚あるとします。 一回に加工できる量が25枚とします。 重さとサイズを計測して、それぞれを小さい順に並び変えて あらかじめ別のシートに4つのグループ表を作って、そこに並び変えた データを自動的に入力させます。 加工素材には、それぞれ通し番号を記載しているので、データを 基に製品を抜き取って行き、グループ分けして加工します。 ここまで作業を記憶させる方法でマクロ化出来たのですが、 加工素材の数量は日によってまちまちで、切りのよい数字になるのも稀です。 例えば345枚の場合、25枚のグループを13、20枚のグループを1つ 作るのですが、25枚の1グループとしているので端数が出ると並び変えが うまく出来なくなります。端数が出た場合も例えば、25枚のグループを○○個、 20枚のグループを○○個と事前に入力して、その通りにグループ分け出来る 様にマクロで自動的に最適化するようにしたいのですが、方法はありますか?

  • エクセルマクロでマクロをアクティブにしたくない

    エクセルのマクロをひとつの「マクロA」という名前で、データーファイルからセルに入っている内容などを呼び出しながらまくろAのシートにデーターを貼り付けながら作業をしています。 Workbooks.Open Filename:= _ "C:\Documents and Settings\owner\My Documents\マクロ.xls" Application.Run "マクロ.xls!マクロ" と記載すると、マクロXLSがアクティブになってしまいます。 その為記載に'ActiveWindow.WindowState = xlMinimized と入れたりするのですが、アクティブになるシートがマクロ以外にうまくいかないことがあるのです。 データーシートは、毎回データーが変わる関係で、DATA.xlsがAのときやBのときが発生します。

専門家に質問してみよう