• 締切済み

エクセル VBAで2つのデータを比較して、一致するものを検索したい

以下のような事をしたいと思っています。 VBAは今まで使った事が殆どなく困っております。 仕事で作らなければならず、宜しくお願い致します。 エクセルVBAで、既存と新規という2つのシートから 2つの条件(A列とB列の完全一致)で行を検索して 一致したものを探し出します。 一致したら「新規シート」の該当した行の売上列のデータを 「既存シート」の該当月の列へコピーしたいと思っております。 また、「新規シート」には「既存シート」にないデータが 存在するので、一致から漏れた行は「既存シート」へ 新たに追加のデータとしてコピーしたいと思っています。 イメージ↓ 既存シート) 商品名 |製造地|6月(製造月の売上)|7月(製造月の売上) a     |あ   |¥150      | b     |い   |¥200      | (空白)  |(空白)|          | 新規シート) 商品名 |製造地 |7月(製造月の売上)| a     |あ   |¥300      | b     |い   |¥100      | c     |う   |¥250      | 上記の2シートで、商品名と製造地の2つが一致していれば 「新規シート」の7月の列のデータを「既存シート」の 7月の列にコピーし、「既存シート」に存在しない 「新規シート」の商品名”c”の行のデータを「既存シート」へ 新たに商品名”c”の行を作成しコピーしたいと思っています。 出来上がり後の(既存シート) 商品名 |製造地 |6月(製造月の売上)|7月(製造月の売上) a      |あ   |¥150      |¥300 b      |い   |¥200      |¥100 c      |う   |¥0        |¥250

みんなの回答

  • argument
  • ベストアンサー率63% (21/33)
回答No.8

回答です。暇つぶしに作ってみました。 Sub newdataset() '事前データ取得 Sheets("既存シート").Select tablestart = 2 'テーブルの開始位置Y軸 '商品カウント For i = tablestart To 65536 If Range("a" & i).Value <> "" Then oldmax = i Else Exit For Next '新規データ取得 Sheets("新規シート").Select newdatas = Array("", "", "") mymonth = Split(Cells(tablestart - 1, 3).Value, "月")(0) For i = tablestart To 65536 newdatas(0) = newdatas(0) & Range("a" & i) & vbCrLf newdatas(1) = newdatas(1) & Range("b" & i) & vbCrLf newdatas(2) = newdatas(2) & Range("c" & i) & vbCrLf If Range("a" & i).Value <> "" Then newmax = i Else Exit For Next For i = 0 To UBound(newdatas): newdatas(i) = Split(newdatas(i), vbCrLf): Next '比較と書き込み処理 Sheets("既存シート").Select For i = 0 To UBound(newdatas(0)) - 1 For j = tablestart To 65536 If oldmax < j Then 'oldのmaxlineを超えた場合新しいデータ If newdatas(0)(i) = "" Then Exit For If Cells(j, 1).Value = "" Then Cells(j, 1).Value = newdatas(0)(i) Cells(j, 2).Value = newdatas(1)(i) Cells(j, 3 + (mymonth - 6)).Value = newdatas(2)(i) For k = 3 To 3 + (mymonth - 6) - 1 Cells(j, k).Value = 0 '新規の場合過去分がないため0埋め Next Exit For End If Else If (Range("a" & j).Value = newdatas(0)(i)) And (Range("b" & j).Value = newdatas(1)(i)) Then Cells(j, 3 + (mymonth - 6)).Value = newdatas(2)(i) 'AとBは同じなため更新するのはC列のみ Exit For End If End If Next Next End Sub 既存シート  |A|B|C ―┼―┼―┼― 01|商|製|6月 ―┼―┼―┼― 02| a|あ|150 ―┼―┼―┼― 03| b|い|200 新規シート  |A|B|C ―┼―┼―┼― 01|商|製|7月 ―┼―┼―┼― 02| a|あ|300 ―┼―┼―┼― 03| b|い|100 ―┼―┼―┼― 04| c|う|250 この状態でマクロを動かしてください 既存シート  |A|B|C|D ―┼―┼―┼―┼ 01|商|製|6月| ―┼―┼―┼―┼― 02| a|あ|150|300 ―┼―┼―┼―┼ 03| b|い|200|100 ―┼―┼―┼―┼ 04| c|う| 0|250 ―┼―┼―┼―┼ と成ります。 中途半端に六月から始まるためmymonth - 6で右に一つずつ移動させています。また月処理分移動するため8・9…月などにすればちゃんと右にずれます。新しいデータは前月分より前はデータはないため全て0で埋めます。 現在見えてくる仕様から作ったため12以降どうすんの?とか1月から始まらなくていいの?とか有りますがまぁ知りません。ちなみに12月以降は単に-6なので1月とか入れればまぁ確実にばぐると思います。 現状で言われた状態と現状でこうあってほしい状態にはなっているはずです。 処理違いや補足・修正が欲しい場合言ってください。書き直します。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.7

ANo.5です。 ピボットテーブルを実際に試されていなければ、一度試してみては如何でしょう。 求めたい結果と相違が殆どなければ、その方が楽なのかも知れません。 私は全くわからないので、結果がどうなるのかはわかりませんが。 VBAで後々のメンテで悩むより楽なのかも知れないですよ。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.6

A No.2です。 >VBAは今まで使った事が殆どなく困っております。 この状態で、既存の表にこだわる事が、takemeさんの業務にとって有意義な事か疑問ですが(なにしろピボットテーブルならコードを1行も書く必要がないのですから)、どうしても既存の表にこだわられるなら、次のワークフローを提案します。 ・新規シート)にある月のデータを入力する ・A No.2で提案した,データベースのレコード形式のシートにデータを転記する。 ・既存シート)に配置した、ピボットテーブルのデータの更新を行う。 (注)レコード形式のシートのデータの範囲には動的な名前(データを追加すると、名前の範囲が自動的に拡張される)をつけておき、ピボットテーブルもその「名前」をデータ範囲に指定しておく。 VBAで行うのは、フローの2番目だけで良いので、至極簡単になるでしょう。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.5

ANo.4です。 無理ではないと思いますが。 まず既存シートは、新規シートが作成されデータの打ち込み後に既存シートへデータを転送し、 新規シートはデータをクリアするようなイメージがあるのですが。 その際に月が増えてきた場合の全体のデータ数によっては、手間のかかる場合もあります。(回避策もあるでしょうけどね) 私的には7月のデータを収集する時には、既存シートに7月以降の項目行がなかった方が楽かと思いました。 単に既存シートの項目行から該当する列を探せば良いだけですが、 項目行がなければ6月までが使用されている列数とわかりましたので。 (項目行の一番右がデータのある最終列になりますから) 人それぞれでも作り方は違うでしょうから、一概には言えませんけど。 ただちょっとはやっかいな部分もありますので、後々のメンテをご自身でやる場合に、 ちょっと大変かなって感じがあるかもです。 Excel(エクセル) VBA入門:Dictionaryオブジェクトを利用する http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.html 重複データ絡みの時によく用いている方法です。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

ANo.1です。 ピボットテーブル案も出ているようですので一度試されてみては如何でしょうか。 私はピボットテーブルは全くわからないのでお力にはなれませんが。

takeme
質問者

お礼

やはり、私の出したような表にするのは無理なんでしょうか?

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#2です。おまけで小計欄の消し方を参考URLに添付します。これでほぼ、お望みの体裁になると思います。

参考URL:
http://www.relief.jp/itnote/archives/002618.php,http://office.microsoft.com/ja-jp/excel/HP100963171041.aspx
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

>VBAは今まで使った事が殆どなく困っております。 今回の課題は厳しいのではないでしょうか。コードを丸ごと教えてもらっても、応用できないように思います。 データの管理の仕方を変えて、ピボットテーブルを使うことをお勧めします。 下記の様な毎月のデータを蓄積する形式にして、 ...............A................B............C..............................D ..1.....商品名.... 製造地..........月....製造月の売上げ ..2.............a............ あ......6月.........................\150 ..3.............b............ い......6月........................\200 ..4.............a............ あ......7月........................\300 ..5.............b............ い......7月.........................\100 ..6.............c............ う......7月........................\250 ピボットテーブルの、行フィールドに商品名と、製造地を、列フィールドに月を、データアイテムに売上げをD&Dすると、お望みの表に近い形のものができます。

参考URL:
http://sweety.jp/honobono/faq/pibo/index.htm
takeme
質問者

補足

申し訳ありません。 このような状態ではなく、 質問に出したような表にしたいのです。 ありがとうございました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

・既存シートで仮に”8月”以降は項目行に既に代入されているのでしょうか? ・"¥0"は必要なのでしょうか?

takeme
質問者

補足

すみません、 既存シートには8月以降の項目行は作成済みです。 ¥0は無くても大丈夫です。 宜しくお願いします。

関連するQ&A

  • ExcelのVBAについて

    ExcelのVBAについて VBA全くの初心者です。 以下のような処理を行いたいのですが、どなたかご教授をお願いします。 以下のように支店(1)~(3)のシートがあります。 1.入力シートに調べたい商品No・商品名・備考を入力する(複数行あり) 2.マクロを実行すると、商品Noを検索対象として支店(1)~(3)シートをチェックし、   一致しない行を不一致データシートに出力する もう一つ別のマクロで、 1.入力シートに調べたい商品No・商品名・備考を入力する(複数行あり) 2.マクロを実行すると、商品Noを検索対象として支店(1)~(3)シートをチェックし、、   一致する行を一致データシートに出力し、D列に対象データがあるシート名を表示する   ※可能でしたら、E列に対象データがある行番号も表示する -------------------------------- シート名:支店(1) A      B     C 商品No   商品名   備考 011    商品A   備考A 009    商品B   備考B 015    商品C   備考C -------------------------------- シート名:支店(2) A      B     C 商品No   商品名   備考 008    商品A   備考A 023    商品B   備考B 004    商品C   備考C -------------------------------- シート名:支店(3) A      B     C 商品No   商品名   備考 007    商品A   備考A 033    商品B   備考B 018    商品C   備考C -------------------------------- シート名:入力シート A      B     C 商品No   商品名   備考 ※ここに複数行入力する -------------------------------- シート名:不一致データシート A      B     C 商品No   商品名   備考 ※ここに出力される -------------------------------- シート名:一致データシート A      B     C 商品No   商品名   備考 ※ここに出力される

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

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

  • Excelで2つの条件が一致したデータの抽出

    Excelで2つの条件が一致したデータの抽出 こんにちわ。 タイトルの通り、Excelで2つの条件が一致したデータの抽出作業を行っています。 Sheet1にデータがあり、以下のような構成なっています。 A列    B列    C列 日付   社員名   売上金 6月1日 鈴木     3万円 6月1日 今井     2万円 6月2日 川口     10万円 6月3日 鈴木     4万円 6月3日 野口     1万円 6月4日 鈴木     3万円 6月7日 佐藤     6万円 6月7日 今井     2万円 6月7日 黒木     7万円 6月9日 野口     3万円 A列の日付は不連続かつ同一日付のものもあります。 Sheet2に以下のフォーマットを作成してあります。 1行目:B1セルから連続する日付(6/1~6/30まで) A列:A2から社員名(社員名は各セルに固定) 6月1日 6月2日 6月3日 6月4日 6月5日 ・・・ 鈴木 佐藤 今井 川口 野口 黒木 Sheet2のセルに、Sheet1の表の日付と社員名が一致した売上金のデータを反映させたいのです。 そこで例えばSheet2のB2セルには以下の関数を入れました。 B2=IF(ISNA(MATCH($A$2:$A$9&$B$1:$N$1,INDEX(Sheet1!$C$2:$C$24&Sheet1!$A$2:$A$24,))),"",INDEX(Sheet1!$D$2:$D$24,MATCH($A$2:$A$9&$B$1:$N$1,INDEX(Sheet1!$C$2:$C$24&Sheet1!$A$2:$A$24,),0))) この関数を入れると、該当するところには売上金のデータが反映されるものの、それ以外のセルには全て#N/Aが表示されてしまいます。 この#N/Aを表示させないようにするには、関数をどのようにすればいいのでしょうか? エクセル初心者なので、分かりやすくご教授願えたら…と思います。 よろしくお願いいたします。 使用OS:XP  使用ソフト:Office2000 Pro.

  • エクセルで既存の売上データに部門名を付け加えたい

    csvで書き出した売上データがあります。 エクセルで読み込みシート名を「売上リスト」としました。 列項目は、A列:商品番号、B列:商品名、C列:商品点数、D列:商品単価、E列:合計銀額です。 この売上リストに、F列:商品部門を後から付け加えたいと考えています。 別のシートに商品番号と商品部門が同じ行にある参照用データ「商品リスト」を用意しました。 商品リストも売上データ同様csvで書き出したもので、商品部門列が名称ではなく部門ID(数字)になっています。 そこで、A列:部門ID、B列:部門名の「部門リスト」を用意しました。 シート1:売上リスト(約400行) シート2:商品リスト(約600行) シート3:部門リスト(10行) 売上リストの各行に関連する部門名を付け加えるために、いくつか手順を踏まなくてはと推測できますが、どうしていいのかわかりません。 1.売上リストの商品番号を参照し商品リストの商品番号と一致する行の部門IDを呼び出す。 2.呼び出した部門IDを関連する名称に変更する。 のような感じになるのでしょうか。 初歩的な質問かもしれませんが、具体的にどうしたらいいのかさっぱりわかりません。 よろしくお願いします。

  • Excel 条件に一致する日付の求め方について

    こんにちは!初めて質問します。 Excel関数の使い方がわからずに困っています。 売上と在庫管理をそれぞれ別シートに入力しています。 売上が出た場合、在庫管理シートに売上日が表示されるようにしたいのです。 シートは、このような形で、それぞれデータを入力しています。 売上表シート A列  B列    C列      D列 日付  顧客名  商品コード  売上金額 在庫管理シート A列   B列     C列    D列    E列 入荷日 商品コード  商品名  売上日  売上金額 商品コードが一致する売上表シートの日付を、在庫管理シートの売上日に表示させたいのですが、 上手くいきません。 売上金額はSUMIF関数で処理することができました。 Excelに関する知識も乏しく、非常に困っています。 なにぶん初めての質問のために質問内容も的を得ず、わかりづらいかもしれませんが、 どなたかお分かりになる方、是非ご教示くださいませ。

  • Excel VBA

    Excel VBAについて シート1にはデータが入ってます。 G列に日付、L列に商品名、N列に件数。 シート2には集計結果を入力したいです。 セルB2に、日付が10月1日から15日までで、商品名がAの件数の合計。 セルB3は、日付が10月16日から末日まで、セルB4は、日付が11月1日から15日までと半月毎に集計を半年後の末日まで繰返し、B2の数行下には、商品名Bの集計行を作り、その数行下には商品名Cの集計行を作りたいです。 これまでは関数SUMIFSで集計していましたが、複数店舗分のシートの更新・メンテナンスが大変なので、VBAでの集計を考えいろいろ調べてるのですが、方法が思い付かないので、ご教授ください。

  • 二つのファイルデータを比較し一致したものを並べる。

    こんにちは。VB初心者です。二つ別のファイル(A とB)のデータを比較して、その中で一致したものを並べたいのですが、とっかかりがつかめません。 例えばですが、商店名から下のデータ(一つのエクセルファイルAのシート1)に一致するものを、 EXCEL FILE A Sheet1 担当者  価格    地域  在庫 商品名 商店名 Bさん           埼玉     卵    佐藤屋 Cさん    250円    神奈川 有り 牛乳    高橋屋 もう一つのエクセルのファイル (下のデータ、エクセルファイルBシート1)の中から探して、商店名から比較したデータの結果をもう一つのシートに書き込みたいのですが、どうしたら情報を行ごとにマッチングできるのかわかりません(行ごとに情報が違うので)。。簡単にVLOOKUPでデータを拾うのではなく、マクロで比較したいのですが、よろしくお願いします。 EXCEL FILE B Sheet1 商店名 商品名 価格    地域  担当者 在庫 山田屋 みかん 100円 東京  Aさん 有り 佐藤屋 卵    200円  埼玉  Bさん 有り 高橋屋 牛乳    250円 神奈川 Cさん 有り あと、情報をマッチングの後、情報が抜けているところ(佐藤屋の価格、在庫)を色(赤)に塗ることができますか?こちらのほうもよろしくお願いします。

  • エクセル2つのブック列の比較 VBAや関数について

    Aと言うブックとBと言うブックがあるとして、 Aのブックは共有ファイルではなく、Zサーバー上にあるエクセルファイルです。 Aのブックに色々な人が行の挿入、商品名の書き換え等をしていて、いつ挿入されたのかが分からないため、VBAや関数を使って調べたいのですが、 Aのブックは10シートあり、サイズ別で行も並べられているため、新しい情報を特定するのが困難です。 BのブックはAと同じシート名を作り、必要箇所だけコピーしているデータです。(オリジナルブック) やりたいことは、Aのブックから探してBのブックに追加されていない情報、一致していない情報があれば、色を付けてわかりやすくするか、Bのブックの新しいシートに結果を出すようなことがしたいのですが、可能でしょうか? AのブックはA列-IC列まであるのですが、必要な部分は全シートB列(商品コード)とE列(商品名)のみです。 Bのブックには同じシート名にして、A列に商品コード、B列に商品名としております。 AのブックのB列、E列を参照して、BのブックのA列、B列になければ、結果を表示したいです。 もし出来る方法があれば、教えてほしいです。 今はシートごとに左右比較して、見ていってるのですが、10シートの中に、行数は2000行くらいあるため、それで半日おわってしまいます。 もし分かるかた、マクロを組める方がいれば教えて頂きたいです。宜しくお願い致します。

  • エクセル、VBA、抽出複数検索について

    エクセル、VBA、VLOOKUP、MATCH関数等について出来る方法があれば教えてください。 インチごとに分けてあるシートがあり、(在庫表です) これを参照して、別ブックへVLOOKUP等を使って、サンプルデータのシート4のように表示させたいのですが、 何か方法を使って出来ることは可能でしょうか? 問題点が複数あります 1、VLOOKUPの範囲について、B列が結合されていて、C列は複数行あるため、商品名が入ってきません。 C列については、何千件とデータがあるため、結合することは不可能です。 一致している条件としては商品コードが必ずあり、商品名には「/」が入っております。 =CONCATENATEとVLOOKUPは一緒に使うことは可能ですか? もしくはINDEX関数やIF、SUMPRODUCT等を使うのでしょうか? シート4のような形に出来る方法があれば、教えてほしいです。 VBAは詳しくはないのですが、VBAで出来るのであれば、教えてほしいです。 在庫表はとても作り方が悪いのですが、これを作り直すと言うことは、不可能です。 グループ会社で使っているため、なんとかこの在庫表を使いたいです。 VBAでA列をA5からA100にコードのみ入れた場合、B列に商品名が入るようにVBAで作ることは可能でしょうか? もしくは、検索条件を2つ使って、一つは商品コード完全一致+あいまい検索で【/】で商品名を入れることは可能でしょうか? 関数は調べたのですが、関数では難しいのかなと思います。 宜しくお願い致します。

  • Excelデータ比較

    エクセルにおいて、sheet2のA列、B列、C列をsheet1のA列、B列、C列と比較して、一致した場合sheet2のD列に書かれている納入先企業名を下記のように自動入力したいのですが、どうやってsheet2のD列に関数を組めばよいのか分からないので教えてください! 【sheet1】 A列 B列 C列 D列 1行 001 AAAA 部品1 A社 2行 002 BBBB 部品2 B社 3行 003 CCCC 部品3 C社 4行 004 DDDD 部品4 D社 5行 005 EEEE 部品5 E社 6行 006 FFFF 部品6 F社 7行 007 GGGG 部品7 G社 【sheet2】 A列 B列 C列 D列←この列に取引先企業が入るようにする 1行 001 AAAA 部品1 A社←sheet1にあるのでA社と入る 2行 008 HHHH 部品8 #N/A←sheet1にないので#N/Aとなる 3行 004 DDDD 部品4 D社 4行 009 IIII 部品9 #N/A 5行 005 EEEE 部品5 E社 6行 002 BBBB 部品2 B社 7行 010 HHHH 部品10 #N/A

専門家に質問してみよう