EXCELで3つのシートのデータを統合する方法

このQ&Aのポイント
  • A社とB社が合併し、新たな基幹システムを作成中です。取引先のデータを新システムに移行させるために、エクセルで一覧を作成しています。
  • エクセルファイルには3つのシートがあります。シート1と2には取引先のデータがあり、シート3にはコードの対比表があります。
  • シート1と2のデータをシート3のコード対比表を基に統合する方法を教えてください。
回答を見る
  • ベストアンサー

EXCELで3つのシートのデータを統合したい

2つの会社(A社,B社)が合併し、それぞれ別の基幹システム(旧システム)を使っていた為、 新たに全く別の基幹システム(新システム)を作成中なのですが、 A社、B社共通の取引先もあれば、それぞれ独自の取引先もあり、 取引先のデータを新システムに移行させる為、エクセルで一覧を作成中です。 1つのエクセルファイルに以下のような3つシートがあります。 シート(1) A社得意先コード 取引先名 郵便番号 住所         取引条件 ・・・・ 000001      (株)○○○ 111-1111 ○○県○○市・・・ 20日締め ・・・ 000002      (株)▲▲▲ ・・・・ シート(2) B社得意先コード  取引先名 郵便番号 住所         取引条件 ・・・・ 000001-00     (株)○○○ 111-1111 ○○県○○市・・・ 20日締め ・・・ 000002-00     (株)□□□ ・・・・ シート(3) A社得意先コード B社得意先コード 新システム得意先コード 000001      000001-00    000001-000 000002                 000002-000            000002-00    000003-000 シート(1)(2)のデータをシート(3)のコード対比表を基にシート(3)にくっつけたいのです。 A社得意先コード B社得意先コード 新システム得意先コード (1)取引先名 (1)郵便番号 (1)住所 (1)取引条件 ・・・・ (2)取引先名 (2)郵便番号 (2)住所 (2)取引条件 ・・・・ 000001      000001-00    000001-000 (株)○○○ 111-1111 ○○県○○市・・・ 20日締め ・・・ (株)○○○ 111-1111 ○○県○○市・・・ 20日締め ・・・ (ここ見づらくてすいません) シート(3)に統合より新たにシートを作成した方がやりやすければそれでもかまいません。 シート(1)(2)にそれぞれ約6000行、80項目くらいあり、VLOOKUPでちまちまやるのは作業ミスを起こしそうであまりやりたくありません。 EXCEL2007を使用しております。 何かいい方法がありましたらご教示願います。

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

  • ベストアンサー
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

>シート(1)(2)にそれぞれ約6000行、80項目くらいあり、VLOOKUPでちまちまやるのは作業ミスを起こしそうであまりやりたくありません。 シート(3)のD列以降に該当データを表示したいなら、行数に関係なく以下のようなVLOOKUP関数で「確実に」表示できます(右方向および下方向にオートフィル)。 =IFERROR(VLOOKUP(A2,Sheet1!A:Z,COLUMN(B1),0),VLOOKUP(B2,Sheet2!A:Z,COLUMN(B1),0)) 少し気になるのは、2つのシートに重複するデータがある場合、住所や郵便番号は共通で問題ないのですが、たとえば「取引条件」が異なる場合は、どのように表示するのでしょうか? 私なら、以下のような関数で同じ列の上段にSheet1の条件、下段にSheet2の条件を表示します。 =IFERROR(VLOOKUP(A2,Sheet1!A:Z,COLUMN(B1),0),"")&CHAR(10)&IFERROR(VLOOKUP(B2,Sheet2!A:Z,COLUMN(B1),0),"")

majyesty3
質問者

お礼

早速のご回答ありがとうございました。 これいい方法ですね。IFERRORとCOLUMN関数を組み合わせるのは思いつかなかったです。 ただ、これだと、シート(1)かシート(2)のデータがある方をシート(3)の後ろにくっつけてしまいますよね。 分かりにくかったかと思いますが、シート(3)の取引先コードの後ろにシート(1)⇒シート(2)の順にデータを両方くっつけたかったのです。 なので、シート(1)の部分用に =IFERROR(VLOOKUP($A2,Sheet1!$A:Z,COLUMN(B1),0),"") とシート(2)の部分用に =IFERROR(VLOOKUP($B2,Sheet2!$A:Z,COLUMN(B1),0),"") と分けてやる事でうまくいきました。 あとは結果がちゃんと合っているか確認したら、今日中に完成できそうです。 取引条件等は統一済みなので、新システムへデータを取り込むために1行にしたかったのと、 今後のデータ運用に使えるように(1)(2)それぞれのデータを両方載せたかったので、 このようなめんどくさい事をしました。 ご協力ありがとうございました。

その他の回答 (4)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

こんばんは! VBAでの一例です。 Sheet1・Sheet2のデータをSheet3にまとめるようにしてみました。 各Sheetとも1行目はタイトル行でデータは2行目以降にあるとします。 (1行目の項目は入力済みとします) 会社名と住所のみで検索しています。 Alt+F11キー → 画面左下の「This Workbook」をダブルクリック → VBE画面が出ますので ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i, j, k As Long Dim ws1, ws2, ws3 As Worksheet Set ws1 = Worksheets(1) Set ws2 = Worksheets(2) Set ws3 = Worksheets(3) Application.ScreenUpdating = False k = ws3.UsedRange.Rows.Count If k > 1 Then ws3.Rows(2 & ":" & k).ClearContents End If ws3.Columns("A:C").Insert For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row With ws3.Cells(Rows.Count, 2).End(xlUp).Offset(1, -1) .Value = ws1.Cells(i, 1) .Offset(, 1) = ws1.Cells(i, 2) & "_" & ws1.Cells(i, 4) With .Offset(, 3) .Value = ws1.Cells(i, 1) .NumberFormatLocal = "000000" End With .Offset(, 6) = ws1.Cells(i, 2) .Offset(, 7) = ws1.Cells(i, 3) .Offset(, 8) = ws1.Cells(i, 4) .Offset(, 9) = ws1.Cells(i, 5) End With Next i For j = 2 To ws2.Cells(Rows.Count, 1).End(xlUp).Row With ws3.Cells(Rows.Count, 1).End(xlUp).Offset(1) .Value = Val(Left(ws2.Cells(j, 1), 6)) .Offset(, 2) = ws2.Cells(j, 2) & "_" & ws2.Cells(j, 4) .Offset(, 4) = ws2.Cells(j, 1) .Offset(, 10) = ws2.Cells(j, 2) .Offset(, 11) = ws2.Cells(j, 3) .Offset(, 12) = ws2.Cells(j, 4) .Offset(, 13) = ws2.Cells(j, 5) End With Next j k = ws3.UsedRange.Rows.Count Range(ws3.Cells(2, 1), ws3.Cells(k, 14)).Sort key1:=ws3.Cells(1, 1), order1:=xlAscending For j = k To 2 Step -1 If WorksheetFunction.CountIf(ws3.Columns(2), ws3.Cells(j, 3)) Then i = WorksheetFunction.Match(ws3.Cells(j, 3), ws3.Columns(2), False) With ws3.Cells(i, 5) .Value = ws3.Cells(j, 5) .Offset(, 6) = ws3.Cells(j, 11) .Offset(, 7) = ws3.Cells(j, 12) .Offset(, 8) = ws3.Cells(j, 13) .Offset(, 9) = ws3.Cells(j, 14) End With ws3.Rows(j).Delete (xlUp) End If Next j For i = 2 To ws3.Cells(Rows.Count, 1).End(xlUp).Row ws3.Cells(i, 6) = WorksheetFunction.Text(i - 1, "000000") & "-000" Next i ws3.Columns("A:C").Delete (xlToLeft) ws3.Columns.AutoFit Application.ScreenUpdating = True End Sub 'この行まで Sheet1・Sheet2のデータ変更があるたびにマクロを実行してください。 ※ 一旦マクロを実行すると元に戻せませんので別Bookにコピーしてマクロを試してみてください。 ※ ご希望通りにならなかったらごめんなさいね。m(_ _)m

majyesty3
質問者

お礼

ご回答ありがとうございました。 実行結果は求めるものに近いので、とりあえず足りない項目分の式を追加して完成させたいと思います。 欲を言えば、コードで検索してもらえると一番よかったのですが・・・ マクロを使えるとほんと便利ですよね。 今年はマクロの勉強頑張りたいと思います。 ありがとうございました!

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

VLOOKUPを並べるので特にミス無く出来ると思いますが,敢えて生データを駆動する方法でやってみるなら。 シート3全体をA列(Aコード)の昇順で並べ替える シート1全体をA列(Aコード)の昇順で並べ替える 念のためシート3の D2: =(A2<>Sheet1!A2)*1 以下コピー SUM(D:D)が「ゼロではない」ときは,シート1または3の一覧のどちらかに漏れがあるので,チェックする 完全に整合したら,シート1から丸ごとデータをコピーしてシート3にドンと貼り付ける 改めて シート3全体をB列(Bコード)の昇順で並べ替える シート2全体をA列(Bコード)の昇順で並べ替える 念のためシート3の D2: =(B2<>Sheet2!A2)*1 以下コピー SUM(D:D)が「ゼロではない」ときは,シート2または3の一覧のどちらかに漏れがあるので,チェックする 完全に整合したら,シート2から丸ごとデータをコピーしてシート3にドンと貼り付ける 必要に応じてシート3全体をC列(新コード)昇順で並べ替えて完成。

majyesty3
質問者

お礼

ご回答ありがとうございます。 最初はこれも考えましたが、ちゃんと並び替えされていなかったりして うまくコードと取引先情報の整合がとれないんじゃないか心配だったので、やめました。 間違いが許されないデータなだけに確実な方法を探してみたくて・・・ ありがとうございました。

  • AkiraHari
  • ベストアンサー率19% (255/1313)
回答No.3

取引先データの統合は結構面倒です。 Excelの機能でとかAccessでならばという以前の問題が大変なのです。 同じ相手なら取引先名は同じと思うでしょうが、実際はそう単純にいきません。 例えば「JR東日本」という会社名をどのように入力されているかです。 正式名称は「東日本旅客鉄道株式会社」です。 そこで次なケースが考えられます。 東日本旅客鉄道株式会社 東日本旅客鉄道(株) 東日本旅客鉄道(株) JR東日本 JR東日本 さらに会社名に付加情報を記入している場合もあります。 住所にしても「1丁目1番地1号」とか「1-1-1」とかさまざまです。 そこで、2つのリストをまとめて、電話番号や住所でソートし、目で確認するしかないでしょう。 電話番号でソートする際には区切り文字を統一してから行います。 勿論、データは統一ルールで入力されているというなら、単純です。ソート後に前の行と同じであればしるしを付けるようにしておけば簡単に解ります。

majyesty3
質問者

お礼

早速のご回答ありがとうございます。 おっしゃる通り、前段階のデータを統一するのはかなり大変でした。 これはすでに終わらせているので、新システムへ取り込む為と 後々の運用を考えてのデータ作りをしている段階です。 >勿論、データは統一ルールで入力されているというなら、単純です。ソート後に前の行と同じであればしるしを付けるようにしておけば簡単に解ります。 これがどういう意味なのかがちょっと気になりますが・・・

noname#217196
noname#217196
回答No.2

MS Accessを使って当該ワークシートにリンクテーブルを張り、クエリでまとめてからクエリ結果をExcelファイル形式で出力するのが一番楽だと思います。 シート1とシート3を旧取引先コードで結合し、新取引コードと企業情報をクエリ結果1とします。 同様にシート2とシート3からクエリ結果2を得ます。 差分クエリを使いクエリ結果1からクエリ結果2を新取引先コードで差分したクエリ結果3を得ます。(クエリ結果1のうちクエリ結果2と違う新取引先コードのレコードだけ抽出されたのがクエリ結果3) クエリ結果2とクエリ結果3を結合したクエリ結果4をExcelファイル形式で保存します。 MS Accessはクエリウィザードがあるので、SQLの知識なしでもこの程度ならウィザードに従えばそれぞれのクエリを作成できます。

majyesty3
質問者

お礼

早速のご回答ありがとうございます。 そうですよね。Access使った方が簡単ですよね。 ただ、Accessが自分のパソコンに入っておらず、他の人のを借りないといけないので、 Excelで出来る方法を探していました。 パソコンが空いたら試してみます。 ありがとうございました。

関連するQ&A

  • エクセル関数教えてください。

    sheet1のセルAは得意先CD、セルBは得意先名。 Sheet2のセルAは空白、セルBは得意先名。 sheet2のセルAの空白にsheet1の得意先CDを入れたい。 sheet2のセルAに入る関数を教えてください。 shrrt1 A  B 得意先CD 得意先名 11 アイ 12 アマ 13 (株)ベスト 14 (株)ベスト営業所 sheet2 A      B 得意先CD 得意先名 アイ アマ (株)ベスト      (株)ベスト営業所

  • エクセルで複数シートから、検索して抽出

    はじめまして、右も左も分からない初心者です。 説明出来ないんですが、よろしくお願いします。 【ご質問内容】 エクセルは、XPを使用しています。 エクセルのVBAで、指定したキーワードを 含むデータを抽出したいと思っています。 【例】 Sheet1 A B C D E 1 番号 氏名  郵便番号  住所  メールアドレス 2 1   ○   △    大阪府   ○○ 3 2   △   ○    茨城県   ○○ Sheet2  A  B    C     D      E 1 氏名 番号 郵便番号  住所  メールアドレス 2 ○  1   △    福岡県   ○○ 3 △  3   ○    茨城県   ○○ と各シートに、列がそれぞれバラバラになっています。 茨城県を検索すると、新しいシートに、 Sheet3  A  B    C     D      E 1 氏名 番号 郵便番号  住所  メールアドレス 2 2   △   ○    茨城県   ○○ 3  A  B    C     D      E 4 氏名 番号 郵便番号  住所  メールアドレス 5 △  3   ○    茨城県   ○○ という風に、抽出したいと思っています。 どうしたらいいでしょうか?? よろしくお願いします。

  • Excel2007で、別のシートのデータを引っ張ってきて値を返す

    添付画像の 赤い枠のシート「見積書」のA3のセルに、 青い枠のシート「取引先コード」の番号を入れると、 その隣の「取引先名」の値が 赤い枠のシート「見積書」のA3のセルに返る、 ということをしたい場合、どういう数式や関数を 使えば良いのでしょうか? 素人質問で大変恐縮ですが 宜しくお願い致します。

  • エクセル2007 VBA シート1に入力されている項目をシート2の中で

    エクセル2007 VBA シート1に入力されている項目をシート2の中で検索し、新規シートにコピーする方法についてです。 例) シート1 A        B  C 取引先名 品目C 数量 A      1-1 25 B      あ12  5 C      T-8 10 :       :    : シート2 A       B    C      D    E 得意先C 取引先名 製品名  品目C  数量 001    (株)B    ケーブル あ12  10 002    (株)A    箱     1-1  20 002    (株)A    箱     1-1   7 002    (株)A    箱     1-1   5 :       :     :      :     : 上記の状態で、シート1の項目をシート2から検索します。 ・取引先名は一部分でも一致するあいまい検索で、品目Cは完全一致で検索したいです。 ・シート2には検索項目のデータが複数あるのですが、結果が一致する行を選択し新規シートにコピーペーストしたいです。 出来れば下記の処理も実行したいです。 *シート1の数量を、シート2の1行目から順に検索したデータから計算して、シート1の数量に満たした分だけをコピーペーストしたいです。  シート1の数量に満たさない場合も取り敢えずシート2にある分のデータをコピーペーストして、処理が終わったら不足している項目データに印をつける。  取引先Aの場合→数量が20個と7個の行をコピーペーストする感じです。 グーグルで調べたのですが、調べ方が悪いのか最初から躓いてしまいました。 今回はコードを記入していなくてすみません。 サンプルコードありで教えていただけるととても助かります。よろしくお願いします。

  • エクセルで、条件にあう複数の行を別のシートに抽出する

    《どなたか、お教え下さい》   エクセルで、条件にあう複数の行を別のシートに抽出してまとめる。 「sheet1」の下記の基本データを「sheet2」に「得意先」ごと「日付」の早い順にまとめたいのでが。関数を使ってできないものか、どなたかお教え下さい。「マクロ」や「Access」は使用したことがないので、関数を使ってやりたいと思いますが、できるものでしょうか。よろしくお願いします。 sheet1 番号 得意先 日付 商品名 商品詳細 金額 備考 1   A 2   B 2   B 4   D 5   E 6   F 2   B 3   C 5   E   A    B  番号  得意先   1   A      2   B   得意先名は、番号を入力することで表示されるように   3   C   関数「VLOOKUP」を使って表示させるようにしていま   4   D   す。    5   E   6   F  

  • ACCESSでの得意先情報・納品書の作成

    教えて下さい ACCESSで得意先情報と納品書を作成しています 得意先情報は 得意先コード 得意先名 郵便番号 住所 TEL FAX 担当者 の7項目です ただ、担当者は1つの会社に7人程います 得意先は80社ぐらいです このデータを元に納品書を作成します この時に得意先コードを選ぶもしくは入力すると 得意先名が自動で入り、尚且つその会社の担当者の7人を コンボで選べるようにするにはどうしたらいいですか? 超初心者です よろしくお願いします

  • エクセルで得意先入力

    皆様、お世話になります。請求書の作成で困っております。 お知恵をお貸し下さいませ。請求書の作成を依頼されましたが、 得意先名だけでなく郵便番号、住所、Tel番号なども入力して欲しい と言われました。得意先は60件ほどあり困っております。 得意先名だけならVLOOKUP関数などで対応できると 思うのですが・・・。 良い方法があればお教え願いたく、よろしくお願いします。

  • エクセル 2つのシートの抽出

    シート1 コード|地域|住所 0001|青森A|青森県青森市○丁目○-○ 0002|青森D|青森県青森市×丁目×-× 0003|岩手B|岩手県岩手市○丁目○-○ 0004|岩手D|岩手県岩手市×丁目×-×         シート2   コード|(住所を抽出したい) 0003| 0001|  シート1は一覧表で、シート2は今回の対象だとします。 シート2のコードとシート1のコードが一致したら、 シート2のB列にシート1の住所を抽出したいのですが、どのような方法があるのでしょうか?教えて下さい。

  • エクセルで住所録を分類する方法は

    いつもお世話になっています。(エクセルは2002です)   A     B       C   D   E 1 郵便番号  住所      氏名  地区  備考 2 100   A県B市C町  C氏  E   G 3 100   A県B市D町  C氏  E   G 4 200   B県      D氏  F   H 上記のような表(シート1)があります。 シート2にA県、シート3にA県以外を郵便番号・住所・氏名・地区・備考を分けて、シート2の表をシート4にB市、シート5にB市以外に郵便番号・住所・氏名・地区・備考を分けて、シート4の表をシート6にC町、シート7にC町以外に郵便番号・住所・氏名・地区・備考を分ける方法を教えてください。 うまく説明できませんがよろしくお願いします

  • 「エクセル」で「アクセス」のようにデータを呼び出したい(2)

    「Excel2000」を使用しています。 NO.608938で質問を させて頂いたのですが、 それを踏まえた新たな疑問が 出てきたので、前回の質問文を引用させて 頂きます。 >たとえば住所録で、 >「sheet1」の >1行目にリストのタイトルが入っていて、 >A2、A3…に通し番号、 >B2、B3…に名前、 >C2、C3…に住所、 >D2、D3…に電話番号 >が入っているとします。 >その時、「sheet2」の >(たとえば)A2に >「sheet1のA2」に入っている通し番号を入力すれば、 >その行に入力されている名前や住所や電話番号が、 >任意のセル(たとえばD10、C8、C9)に表示される… >といったことは可能でしょうか? …との質問に、VLOOKUPを使う方法を 教えて頂いたのですが、さらにもう一歩進んで… たとえば同一人物(名前、住所等同じ)に 同じ通し番号をつけた場合に、 その人が受け持っている 複数の得意先の名前(E2、E3…)や 住所(F2、F3…) を、Sheet2にまとめて表示させることは 出来るのでしょうか? 分かりにくい説明ですみませんが… たとえば、番号「1」番の「田中太郎」さんが A2、A3、に入力されていて、 E2に「○○商事」、E3に「○○物産」(Fに住所) となっていた場合、Sheet2に「1」と入力して 「田中太郎」さんを呼び出すと同時に、 得意先の一覧と住所も表示させることは 出来るでしょうか? 「同時に」でなくても構わないので、 何か良い方法がありましたらお教え下さい。

専門家に質問してみよう