• ベストアンサー

複数シートのデータをまとめたい

複数のシートを下の例のように一つにまとめたいのですが、どうすればよいでしょうか? 注)見づらい例で申し訳ありません。 --------------------------------(例)---------------------------- [sheet1]と[sheet2]のデータを[sheet3]に出力させたい。 ※例では[sheet1][sheet2]共,5行目までしかデータがありませんが、  これより少ない時も多い時もあります。 [sheet1] (A1):担当者A (A2):項目A (B2):項目B (C2):項目C (D2):項目D (A3):テキスト1 (B3):15 (C3):2 (D3):テキスト4 (A4):テキスト2 (B4):3 (C4):1 (D4):テキスト5 (A5):テキスト3 (B5):4 (C5):2 (D5):テキスト6 [sheet2] (A1):担当者B (A2):項目A (B2):項目B (C2):項目C (D2):項目D (A3):テキスト7 (B3):5 (C3):3 (D3):テキスト10 (A4):テキスト8 (B4):7 (C4):2 (D4):テキスト11 (A5):テキスト9 (B5):9 (C5):4 (D5):テキスト12 [sheet3] (A2):項目A(B2):項目B(C2):項目C(D2):項目D(E2):担当者 (A3):テキスト1(B3):15(C3):2(D3):テキスト4(E3):担当者A (A4):テキスト2(B4):3(C4):1(D4):テキスト5(E4):担当者A (A5):テキスト3(B5):4(C5):2(D5):テキスト6(E5):担当者A (A6):テキスト7(B6):5(C6):3(D6):テキスト10(E6):担当者B (A7):テキスト8(B7):7(C7):2(D7):テキスト11(E7):担当者B (A8):テキスト9(B8):9(C8):4(D8):テキスト12(E8):担当者B ----------------------------------------------------------------

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

  • ベストアンサー
  • kuma3f
  • ベストアンサー率63% (28/44)
回答No.2

Sheet3を選択したらSheet1とSheet2のデータをSheet3に出力させるのはどうでしょうか。 参考までに次のコードをSheet3のコードに貼り付けてみてください。 元を壊してはいけないので、コピーしたもので試してみてください。 また、Excel2003での手順になりますのでExcel2007では動作確認はできていないので了承ください。 Alt+F11 キーを押します。 Microsoft Visual Basic が開きます。 Ctr+R キーをお押します。 左側に プロジェクト-VBAProject が開きます。(あればOK) プロジェクト-VBAProjectの中のSheet3(Sheet3)を右クリックし、コードの表示をクリックします。 Sheet3のコードを入力する白い画面になりましたら、下記のコードをコピーして貼り付けしてください。 Private Sub Worksheet_Activate() Dim s1cnt, s2cnt, s3cnt, s1max, s2max As Long If Sheets("sheet3").Range("A2") = "" Then Application.ScreenUpdating = False Sheets("sheet1").Activate s1max = Application.WorksheetFunction.CountA(Worksheets("sheet1").Range("a1:a65536")) Sheets("sheet2").Activate s2max = Application.WorksheetFunction.CountA(Worksheets("sheet2").Range("a1:a65536")) Sheets("sheet1").Select s3cnt = 2 s1cnt = 2 Do Sheets("sheet3").Cells(s3cnt, 1) = Sheets("sheet1").Cells(s1cnt, 1) Sheets("sheet3").Cells(s3cnt, 2) = Sheets("sheet1").Cells(s1cnt, 2) Sheets("sheet3").Cells(s3cnt, 3) = Sheets("sheet1").Cells(s1cnt, 3) Sheets("sheet3").Cells(s3cnt, 4) = Sheets("sheet1").Cells(s1cnt, 4) Sheets("sheet3").Cells(s3cnt, 5) = Sheets("sheet1").Cells(1, 1) s3cnt = s3cnt + 1 s1cnt = s1cnt + 1 Loop Until s1cnt > s1max Sheets("sheet2").Select s2cnt = 3 Do Sheets("sheet3").Cells(s3cnt, 1) = Sheets("sheet2").Cells(s2cnt, 1) Sheets("sheet3").Cells(s3cnt, 2) = Sheets("sheet2").Cells(s2cnt, 2) Sheets("sheet3").Cells(s3cnt, 3) = Sheets("sheet2").Cells(s2cnt, 3) Sheets("sheet3").Cells(s3cnt, 4) = Sheets("sheet2").Cells(s2cnt, 4) Sheets("sheet3").Cells(s3cnt, 5) = Sheets("sheet2").Cells(1, 1) s3cnt = s3cnt + 1 s2cnt = s2cnt + 1 Loop Until s2cnt > s2max Sheets("sheet3").Range("E2") = "担当者" Sheets("sheet3").Select Application.ScreenUpdating = True End If End Sub Private Sub Worksheet_Deactivate() Sheets("sheet3").Cells.ClearContents End Sub '****コピー貼り付けはここまで **** Microsoft Visual Basicの画面を×で閉じます。 Excelシートに戻ったらSheet3を開くと出力されると思います。

noname#102081
質問者

お礼

コピーしてみたらうまく機能しました。 本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

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

これは課題解決の方向 (1)VBA (2)関数 (3)操作 がはっきり質問者は書いてないので、答えの方向に困るが (3)はコピペなんで、やる気は無いでしょう。 (1)Sheet3の最終行を捉える簡単なコードがあるのでそれを使えば、 (A)Sheet1をSheet3にコピぺ (B)Sheet3の最終行を捉える (C)その次の行を始点にSheet2をコピペ (D)Sheet3の最終行を捉える。その次の行を始点にSheet3をコピペ 以下最終Sheetまでこれの繰り返し。 ーー もうひとつはSheet3での書き出す行番号を保持する変数Kを儲け (A)Sheet1のデータ第1行から最終行まで、Sheet1の上から1行ずつSheet3に各列の値を代入。kには次の行に備えて+1する。 (B)Sheet1が最終行まで行けば、Sheet2のデータ第1行から最終行まで、1行ずつSheet3にSheet2の各列の値を代入。kには次の行に備えて+1する。 この2つの方法がある。 (2)は私がやってみると、非常にむつかしいと思う。 他に良い回答が出ればよいが。 A列だけの例に簡略化している。 Sheet1 項目 a b c d Sheet2 項目 x y z u v Sheet3 項目 k l m ーーー Sheet4 統合表 判りやすいように作業列をそのまま残して見る E列  F列   G列    H列       I列 0 4 4 1 Sheet1!$A$2 0 5 9 1 Sheet1!$A$2 0 3 12 1 Sheet1!$A$2 0 ー   ー 1 Sheet1!$A$2 0 ー   ー    2    Sheet2!$A$2 4 ー   ー 2 Sheet2!$A$2 4 ー   ー 2 Sheet2!$A$2 4 ー   ー 2 Sheet2!$A$2 4 ー   ー 2 Sheet2!$A$2 4 ー   ー 3 Sheet3!$A$2 9 ー   ー 3 Sheet3!$A$2 9 ー   ー 3 Sheet3!$A$2 9 ー   ー 4 Sheet4!$A$2 12 ーは列を揃えるための詰め物(実は空白) E2の式 =COUNTA(Sheet1!A:A)-1 F2の式 =F1+E2 G2の式 =MATCH(ROW()-2,$F$1:$F$4,1) H2の式 ="Sheet" & G2 & "!$A$2" I2の式 =INDEX($F$1:$F$100,G2,1) これらを適当行数下方向に式を複写 結果 上記の通り。 以上で下準備が完了。 ーー A2に =OFFSET(INDIRECT(H2),ROW()-2-I2,0) 下方向に式を複写 結果 A2:A13 a b c d x y z u v k l m この式 =OFFSET(INDIRECT(H2),ROW()-2-I2,0) をE-I列の式で1つ1つ置き換えると、非常に長い式になるが、1つの式になる。 ・1列で考えたが、普通は多列データでそのときの修正箇所 ・Sheet4に多めに事前に式を入れておくとき、変なデータが出ないようにする対策。 ・シート名がSheet1などで無い場合の修正 など他にも難題が控えていて、上記では手をつけていない。 とりあえずここで措く。

noname#102081
質問者

補足

すごく丁寧に書いて下さってありがとうございます。 すごく大変そうですね。。 やりたい事は、sheet1,sheet2に入力をしたらsheet3に自動的に統合されたものが出力されるようにしたいです。

すると、全ての回答が全文表示されます。

関連するQ&A

専門家に質問してみよう