シート内データを分割し別のシートへコピー・ペーストする方法

このQ&Aのポイント
  • シート内にまとめられているデータを分割してコピーし、別の複数のシートにペーストする方法を教えてください。
  • 例えば、学校の成績を、教科ごとに表示するシートから、生徒ごとに表示するシートへとデータをコピーする方法について教えてください。
  • マクロ(VBA)を利用してデータの自動化を行いたい場合もありますが、どなたか詳しい方にお力をお貸しください。
回答を見る
  • ベストアンサー

1シート内にまとめられているデータを分割してコピーし、それを別の複数の

1シート内にまとめられているデータを分割してコピーし、それを別の複数のシートにペーストする方法があれば、教えて下さい。 例えば、学校の成績を、教科ごとに表示するシートから、生徒ごとに表示するシートへとデータをコピーする、なんていう場合を想定して下さい。 <教科のシート> シート1:国語のテストの点数表(生徒1~3の点数の一覧) シート2:数学のテストの点数表(生徒1~3の点数の一覧) シート3:英語のテストの点数表(生徒1~3の点数の一覧) <生徒のシート> シート101:生徒1の英数国の点数 シート102:生徒2の英数国の点数 シート103:生徒3の英数国の点数 という場合、 シート1から、生徒1の国語の点数をコピーし、シート101へペースト。 シート1から、生徒2の国語の点数をコピーし、シート102へペースト。 シート1から、生徒3の国語の点数をコピーし、シート103へペースト。 シート2から、生徒1の数学のテンスをコピーし、シート101へペースト。 シート2から、生徒2の数学の点数をコピーし、シート102へペースト。 シート2から、生徒3の数学の点数をコピーし、シート103へペースト。 シート3から、生徒1の英語の点数をコピーし、シート101へペースト。 シート3から、生徒2の英語の点数をコピーし、シート102へペースト。 シート3から、生徒3の英語の点数をコピーし、シート103へペースト。 という具合に、コピー・ペーストを『自動化』して、行いたいのですが、 このようなことは可能でしょうか? (実際のデータは、教科数も生徒数も、もっと沢山あります。) 方法としては、マクロ(VBA)を利用したものでも結構です。 どなたかお詳しい方、お力をお貸し下さい。 必ずお返事致します。(ポイント付与も確実に行います。)

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

  • ベストアンサー
  • goo793ww
  • ベストアンサー率80% (8/10)
回答No.7

goo793wwです。 回答No.3~6を更に実用レベルまで改善した最新版を紹介します。 宜しければ次のURLから取得して下さい。 http://www7.plala.or.jp/ppnabe/Tools/Distribution_V10.0520.xls 以上

参考URL:
http://www7.plala.or.jp/ppnabe/
aw-dlay
質問者

お礼

ダウンロードまでできるようにして頂き、終始、至れり尽くせりな回答でした!

その他の回答 (6)

  • goo793ww
  • ベストアンサー率80% (8/10)
回答No.6

'▼(10)値を各シートへ転記 myCnt = 0 ReDim x(1 To 1, 3 To lastCol) For r = 1 To UBound(myVal) If myVal(r, myL) = myKey(i) Then myCnt = myCnt + 1 For c = 3 To lastCol x(1, c) = myVal(r, c) Worksheets(myKey(i)).Cells(c, kyoukaNo).Value = myVal(r, c) '…科目別:データ縦(行方向)展開 Next c End If Next r Erase x Next i Set myDic = Nothing '▼(11)エンド処理 Worksheets(BaSheet).Activate '…シート切替え ActiveWindow.ScrollColumn = 1 '…左端列へスクロール ActiveWindow.ScrollRow = 1 '…先頭行へスクロール Range("C1").Select Application.ScreenUpdating = True '…画面更新再開 rtn = MsgBox("●●●処理完了●●●", 64, "AP:教科シートを振分ける") End Sub '--------------------------------------------------------------------- '▲ソースコードは以上です。 '最後に「教科シート」と「生徒別シート」を画像添付しておきます。 '以上

aw-dlay
質問者

お礼

画像まで付けて頂き、大変分かりやすかったです。

  • goo793ww
  • ベストアンサー率80% (8/10)
回答No.5

'▼(6)シート有無チェック(なければ最後部に追加) For i = 0 To myDic.Count - 1 For Each mySh In Worksheets myFlg = False '▼(7)振分先シートが有ればデータ領域を削除する If mySh.Name = myKey(i) Then myFlg = True Worksheets(myKey(i)).Activate '…シート切替え(部分削除:シートをActiveにする必要がある) xxRow = Worksheets(myKey(i)).Cells(Rows.Count, kyoukaNo).End(xlUp).Row Worksheets(myKey(i)).Range(Cells(3, kyoukaNo), Cells(xxRow, kyoukaNo)).ClearContents Exit For End If Next mySh '▼(8)振分先シートが無ければシートを追加する If myFlg = False Then ActiveWorkbook.Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = myKey(i) '追加シートの書式設定をする Cells.Select With Selection.Font .Name = "MS ゴシック" .Size = 11 End With Range("A1").Select End If '▼(9)項目を各シートへ表記 Worksheets(myKey(i)).Activate '…シート切替え Worksheets(myKey(i)).Rows("2:2").NumberFormatLocal = "@" '…書式(文字列) Worksheets(myKey(i)).Columns("A:A").NumberFormatLocal = "@" '…書式(文字列) Worksheets(myKey(i)).Range("A1").Value = "ID:" & myKey(i) '…生徒ID Worksheets(myKey(i)).Range("B1").Value = myVal(i + 1, 2) '…生徒名 Worksheets(BaSheet).Range("C2:G2").Copy Worksheets(myKey(i)).Range("A3").PasteSpecial Paste:=xlPasteValues, Transpose:=True '…試験日(行列を入替えて値張付け) Application.CutCopyMode = False '…Copy:クリップボード解放 Worksheets(myKey(i)).Cells(2, 1).Resize(1, kyoukaSu).Value = kyouka '…教科名表示 Worksheets(myKey(i)).Range(Cells(2, 2), Cells(2, kyoukaSu)).HorizontalAlignment = xlRight '…右端表示 Worksheets(myKey(i)).Range(Cells(2, 1), Cells(2, kyoukaSu)).Interior.ColorIndex = 24 '…背景色:淡い紫 Range("A1").Select '▼(10)値を各シートへ転記

aw-dlay
質問者

お礼

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

  • goo793ww
  • ベストアンサー率80% (8/10)
回答No.4

'▼(2)アクティブSheet名が教科名と同じかを評価する For i = 1 To kyoukaSu If kyouka(i) = BaSheet Then kyoukaNo = i rtn = MsgBox("【" & kyouka(i) & "】教科シートを、生徒別シートに振分ます。" & vbCrLf & _ " 宜しいでしょうか", 36, _ "AP:教科シートを振分ける") If rtn <> 6 Then Exit Sub End If Exit For End If Next If i > kyoukaSu Then rtn = MsgBox("シート名が教科名と不一致!!…処理を中断します。" & Chr(13) & Chr(10) & _ "マクロは「教科名」シートをActiveにして実行して下さい。" & Chr(13) & Chr(10) & _ "特記:仕様は「シート名=教科名」です" & Chr(13) & Chr(10) & _ "VBA「教科名」配列を実状に合わせ修正して下さい。", 16, _ "AP:教科シートを振分ける") Exit Sub End If Worksheets(BaSheet).Activate '…シート切替え '▼(3)元データを配列に格納 lastRow = Worksheets(BaSheet).Range("A" & Rows.Count).End(xlUp).Row '…行下端get lastCol = Worksheets(BaSheet).Cells(2, Columns.Count).End(xlToLeft).Column '…列右端get Worksheets(BaSheet).Rows("2:2").NumberFormatLocal = "@" '…書式(文字列) Worksheets(BaSheet).Columns("A:A").NumberFormatLocal = "@" '…書式(文字列) Worksheets(BaSheet).Range(Cells(2, 1), Cells(2, lastCol)).Interior.ColorIndex = 43 '…背景(鶯色) For i = 3 To lastRow Worksheets(BaSheet).Range("A" & i).Value = Format(Worksheets(BaSheet).Range("A" & i), "000") '…生徒ID Next i myVal = Worksheets(BaSheet).Range(Cells(3, 1), Cells(lastRow, lastCol)).Value '…元データを配列に格納する '▼(4)キーとする列を指定 myL = 1 '…生徒ID '▼(5)myDicへデータを格納 Set myDic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(myVal) If Not myVal(i, myL) = Empty Then If Not myDic.Exists(myVal(i, myL)) Then myDic.Add myVal(i, myL), 1 Else myDic(myVal(i, myL)) = myDic(myVal(i, myL)) + 1 End If End If Next myKey = myDic.Keys '▼(6)シート有無チェック(なければ最後部に追加)

aw-dlay
質問者

お礼

申し訳ございません、レスポンスが遅くなりました。 貴重なお時間を、本質問のために割いて頂き、本当にありがとうございます。 まだまだ私は初心者であるため、理解するのにお時間を頂きますが、 解読できましたら、必ずやお返事致しますので、もうしばらくお待ち下さい。 画像まで添付して頂き、懇切丁寧な回答に感謝感激です。

  • goo793ww
  • ベストアンサー率80% (8/10)
回答No.3

掲題の件、興味がわき実践向きに試作してみました。 お役に立てば幸いです。 <説明> 1.教科シートのレイアウト 1行目は仕組みとして割付ていません…自由に利用して下さい。  A列 :生徒ID(数値入力可、但し文字列にマクロで強制します)  B列 :生徒名  C2~Z2 :試験日(例えば、1学期・2学期・3学期・05/01・06/01・・・) C3右側下側 :データ入力欄(成績データ) 2.教科シートのネーミング  自由(例えば、国語・数学・英語・・・が適当です)  特記:この名前は、VBAマクロの「配列:kyoukaSu」に記載されている必要があります。 従い、VBA配列の「教科名」は実状に合わせ加筆修正して下さい。 尚、この配列順で生徒別シートへ成績が転記されます。 3.生徒シート  無ければ生徒IDをシート名として自動生成します。  即ち生徒別シートは事前に用意する必要は有りません。 ※Excel2000,2003,2007,動作確認済みです。 ▼下記をコピー張付けして試行してみて下さい。  特記:回答内容は2000文字以内のようです…回答内容が分割されますが全て繋いで下さい。 '--------------------------------------------------------------------- Option Explicit Option Base 1 Sub データ振分() Dim myDic As Object Dim myKey As Variant Dim myVal As Variant Dim x As Variant Dim i As Long Dim xxRow As Long Dim r, c As Long Dim mySh As Worksheet Dim myFlg As Boolean Dim lastRow As Long Dim lastCol As Long Dim myL As Integer Dim myCnt As Long Dim BaSheet As String Dim kyouka As Variant Dim kyoukaSu As Long Dim kyoukaNo As Long Dim rtn As Integer '▼(1)教科名を配列に格納 kyouka = Array("試験日", "国語", "数学", "英語", "□□", "□□") '…★定数(教科を宣言する) kyoukaSu = UBound(kyouka) Application.ScreenUpdating = False '…画面更新停止 BaSheet = ActiveSheet.Name '…教科元シート名get '▼(2)アクティブSheet名が教科名と同じかを評価する

aw-dlay
質問者

お礼

その節はお世話になりました。 私のために、こんなにもよくして頂いて、誠に恐縮です。 次回、また質問することがありましたら、その際にも色々と教えてください。

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

<教科シート> C1には”学期”を数値で入れる。 セルの書式設定でユーザー定義:0"学期" としている。 ⇒画像では3と入れてる。 IDを入れる行追加。 ID自体は数値で入れる。 セルの書式設定でユーザー定義:000 ⇒画像では1 2 3 と入れている。 <各生徒のシート> シート名はID:001 002 003 など。 A列の教科名は事前に入れておく。 学期名はマクロ実行時に勝手に入る。 Sub try() Dim ws1 As Worksheet Dim ws2 As Worksheet Dim r As Range Dim i As Integer Dim ID As String Set ws1 = Worksheets("教科シート") With ws1 i = .Range("C1").Value '学期 For Each r In .Range("C2", .Range("C2").End(xlToRight)) '生徒(C2~2行目の一番右のセルまで) ID = Format(r.Offset(1).Value, "000") '生徒のID Set ws2 = Worksheets(ID) '各シートに学期の書込み ws2.Range("A1").Offset(, i).Value = StrConv(i, vbWide) & "学期" '各シートに点数の書込み ws2.Range("A1").Offset(1, i).Resize(3, 1).Value = _ r.Offset(2).Resize(3, 1).Value Next End With Set ws1 = Nothing Set ws2 = Nothing End Sub 一例まで。

aw-dlay
質問者

お礼

回答、ありがとうございます。 教えて頂いたコードの解読と実践に、多少お時間を頂きますが、 必ず結果をレスポンス致しますので、しばらくお待ち下さい。 おそらく、教えて頂いたコードで問題なく、私のしたいことはできるものと思います。 もし、つまづくようなことがありましたら、適宜、補足など致しますので、 その際には、またアドバイスして頂けると大変有り難いです。 それでは、今しばらくお待ち下さい。 回答に画像まで添付して頂き、誠にありがとうございます。

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

可能かと言われると可能な感じもしますけど。 教科のシートのどこで生徒を判断(生徒の名前がシート名?)し、 どこに点数があり、 それを生徒のシートのどこに書き込むのか、 シート構成等が不明です。 例えば、 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_furiwake.html 『データをシートに振り分ける』の場合、 振り分け前のデータ(種類)が振り分けるシート名になります。 また振り分けるデータの位置と、書き込むセルの位置もわかります。 このようなシートの情報を提示されないと、 具体的な回答も難しいと思います。

aw-dlay
質問者

お礼

ご指摘、ごもっともだなと思いました。 表の行列の構成などの説明が不足していましたね。 ということで、補足させて頂きます。 <教科シート(1学期)> の構成は、     生徒1 生徒2 生徒3 国語  80  90  85 数学  68  56  90 英語  78  60  87 このような感じで。 一方、<生徒シート>は、 *生徒1 のシート     1学期  2学期  3学期 国語  80   87   85 数学  68   92   90 英語  78   80   78 は、このような感じで。 <教科シート>にデータを手打ち入力した後、 マクロかなにかで、処理をすると、 <生徒シート>に必要な形式で必要なデータが、 <教科シート>から、コピー&ペーストされるような、 そんな仕組みを考えています。 (例) 3学期の試験結果を、<教科シート>に手打ちした後、 そのデータ(国語、数学、英語の点数の列)がいっせいに、 各生徒のシートに、右端(2学期の点数の列の右隣)に追加されるような、 そんな仕組みです。 つまり、 <教科シート> には、手打ちでデータを入力し、 <生徒シート> には、自動でデータが入力される、 という仕組みなので、 人が手を加えるシートは<教科シート>のみ、となります。 (<生徒シート>は、閲覧のみ。) 他に何か不備がありましたら、またご指摘下さい。

aw-dlay
質問者

補足

さらに、補足です。 >教科のシートのどこで生徒を判断(生徒の名前がシート名?) 生徒の生徒識別番号(No.001~068)みたいなもので、生徒を判別するつもりです。 シート名については、目的のプログラムを組む際に必要と思われる名前で結構です。 どういう仕組みでプログラムが組まれることになるのか、私には現段階では分からないため、 シート名をどうしたら良いかも同時に分からない、ということです。 ご理解頂けると、嬉しいです。

関連するQ&A

  • エクセルで複数のシートからデータを抽出する方法

     複数のシートから特定の人のデーターのみを1つのシートに集め,A君~Z君まで順番にシートを作成する方法を教えてください。  例えば…, シート1に番号,生徒名,中間テスト国語,数学,… シート2に番号,生徒名,期末テスト国語,数学,… と一覧になったものがあり,これを個人カードに直したいと思います。 シート3に,A君の国語中間・期末,数学中間・期末,… シート4に,B君の国語中間・期末,数学中間・期末… シート5に,C君の国語中間・期末,数学中間・期末… というものを作りたいのです。 しかし,シートをコピーしてもA君のデータのままで,参照先が自動的に更新されてB君のデータにならないので,困っています。 どうすれば,シート4にB君のデータ,シート5にC君のデータ,…を反映させることができるのかぜひ教えてください。よろしくお願いいたします。

  • エクセルの1シートの内容を複数のシートに分割したい。

    前任者から引き継いだエクセルのファイルを見やすくしたいと思っています。 1ページにつき1つの表が作られているのですが、一枚のシートのページ数が膨大で、とても見にくいのです。ページ毎に(一つの表毎に)違うシートにしたいのですが、地道にコピー&ペーストをしなければならないでしょうか。 一発でバチッとページ毎にシートにできる方法はありますか? windowsXP, Excel 2002を使用しています。

  • エクセルVBA複数ファイルのデータを1つのシートに

    (1)サーバー上にある圧縮ファイルをダウンロード (URLはエクセルの一覧表をクリック)※図A (2)ダウンロードした圧縮ファイル(ZIP形式)を解凍する (3)エクセルファイルを開いて範囲を指定してコピー (コピーする範囲はB2:C101の100行2列のデータ)※図B (4)コピーしたデータを別ファイルのエクセルシートにペースト (シートは1枚、下に下に続けてペースト) 表にあるURL一覧の最後まで(1)~(4)を繰り返す (パソコン環境) Windows10 Google Chrome Excel2010

  • Excelでデータを取り出したいとき

    初めて質問させてもらいます。     A君   B君 国語  85   社会      87  数学  90  95 理科      83 英語  97 このような感じで、点数80点を超えた場合のみ点数を入力していくとした場合に、別のシートにA君・B君が取った点数を、教科などを気にせずに80点以上の点数を表にまとめるという形で抽出することは可能でしょうか? また、これと同じような表が複数個ある時に、それらすべてをまとめて表にする、ということもできるのでしょうか?? VLOOKUPなどでやってみたのですがどうしても空欄ができてしまい、表がどうしても見にくくなってしまいます。どなたがご助力お願いします。

  • エクセルで複数シート間での重複データを避けるための方法

    エクセルで複数シート間での重複データを避けるための方法 こんにちは いつもお世話になっています。 エクセル2003を使用しています。  Sheet1は表引き先です。A1に検索値(名前)を入れると、他のシート(教科別)からコード(数字)を引いてきます。具体的には、セルA2以下に教科名、セルB2以下にコードを引いてきます。 例えば 教科 コード 国語 1 算数 2 英語 3 こんな感じです。 Sheet2は国語、Sheet3は算数、Sheet4は英語で、それぞれA列に名前、B列にコードを入力します。 例えば、 新井 1 井上 2 上野 3 こんな感じです。 ここで質問です。Sheet1でのコードの表引きで各教科のコードが重複しないようにしたいのです。Sheet1での確認ではなく、実際に各教科ごとのシート(Sheet2-4)のコード欄に他の教科のコードが重複した時に、重複を知らせるようなプログラムを作りたいのです。どの教科から入力するかは不定ですが、必ず入力されます。 (ここでの「重複」とは、あくまでもSheet1の「名前」で表引きしたときの各教科のコードの重複のことです。つまり、例えばSheet2で「新井」と「井上」のコードが重複しても構いません。) わかりにくい表現でしたらお詫びします。情報の不足がありましたら教えてください。よろしくお願いします。

  • 【Excel】複数あるシート上の住所録を重複なく別のシートへまとめる方法を調べています

    はじめまして、こんにちは。 仕事でエクセルを使って困ってしまいました。 現在、社内の各部署が抱えている顧客住所録を、エクセルでシートごとにまとめているのですが(住所の入力フォーマットは共通です)、 これらをさらに別のシートへ重複なくまとめた「一覧表」を作成したいと思っています。 普段はコピー&ペーストでしのげるのですが、各部署の住所録は各人が随時アップデートされるため、その都度コピペをしていると手間となってしまいます。 そこで部署の住所録シートに入力があれば、自動的に「一覧表」シートへの入力も済まされている状態にしたいと考えているのですが、現在まで試行錯誤している次第です。。 そこで下記の要件を満たすにはどのようにすればよいかご指南をお願いいたします。  ・各シートにある住所録を、さらに新しい別のシート「一覧表」へまとめたい  ・「一覧表」へまとめられた住所録では、重複を省きたい。  ・各シートへ新規に入力した住所は、自動的に「一覧表」へも入力されるようにしたい。

  • EXCELの検索結果を別シートに貼り付けたい

    学校で事務を行っています。 成績の管理をエクセルで行っているのですが、特定の生徒について成績データを 取り出したく、質問をお願いします。m(_ _)m 作成した成績データSheetのうち、番号を指定した生徒について、成績取込Sheetに 教科コードが一致する教科の点数・生徒番号・生徒氏名をVBAを使用して貼り付け たいのですが、どのようすればよいでしょうか? よろしくお願いいたします。

  • マクロを使って、抽出したデータを別のファイルにコピーしたい

    VBA初心者です。 自動記録で、フィルターオプション設定を使い抽出したデータを、別ファイルにまとめようとしています。 自動記録ですので、実行はできるのですが、このままだとデータの更新があった時、 範囲の指定をやり直すことになりますので、少しシンプルで応用の効くコードにしたいと思っています。 集約するシート:テスト用 sheet1(集約) sheet2(条件) 元のデータ:金額一覧表(01~03) 金額一覧表(04~06) 金額一覧表(07~10) sheet1=ファイル名 <各データは2万~3万件> Sub 抽出_1() Windows("金額一覧表(01~03).xls").Activate Range("A1:R16824").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ Workbooks("テスト用.xls").Sheets("条件").Range("A1:F27"), Unique:=False End Sub ------------------------------------------------ Sub データを転記_1() Windows("金額一覧表(01~03).xls").Activate Selection.SpecialCells(xlCellTypeVisible).Select Selection.Copy Windows("テスト用.xls").Activate Sheets("集約").Select Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub ---------------------------------------------------  又、金額一覧表(01~03)のデータを貼り付けた後、 金額一覧表(04~06)も同じようにデータ抽出コピーしようとしたのですが、 Sub データを転記_() の6行目に下記のようなコードを入れたところ、 7行目がデバックしてしまいました。 (実行時エラ-:1004   コピー領域と貼り付け領域の形がちがうため情報を貼り付けることができません) とエラーが出てしまいました。 6行目  Set sakiRng = Range("A65536").End(xlUp).Offset(1) 7行目  ActiveSheet.Paste  ←ここがデバック 何か指定し忘れているものがあるのでしょうか? お知恵拝借できれば幸いです。

  • エクセルで別シートにデータ抽出したい

    一覧表として作成したシートのデータのうち、ある条件のものだけ別シートにデータ抽出するにはどうしたら良いですか? 例えば、 NO. 担当 金額 1  佐藤 200 2  佐藤 100 3  鈴木 200 4  佐藤 400 とある「一覧表」シートのデータから 担当:佐藤のデータだけ抜き出した表を別シート(「個人別」シート)に作成したいのです。 できれば、「一覧表」に新データを追加する度に、「個人別」シートにもデータが自動反映するようなものが望ましいのですが。 そんなことは可能でしょうか? アクセスを使えば簡単にできるかとは思いますが、アクセスがないので、エクセルで代用できればと。 宜しくお願いいたします。

  • エクセルの複数ワークシートに、元シートのセルを参照させる方法

    用語の使い方が間違っているかもしれませんが・・・。こんなことを考えています。 「元シート」に成績一覧表をつくりました。そして、続く複数シートに、個票を人数分(40人分)作成してあります。     算数 国語 ひろし 50 60 はなこ 70 80 しんじ 40 20 ひろしの個票シート(算数の点数を表示したい枠)に=元シート!B2と入力し、次に、はなこのシートを開いて=元シート!B3と入力しました。この作業を40回も繰り返すのではなく、コピーのような機能で簡単に全員分の個票シートに一覧表を反映できる方法はないものでしょうか?教えてください。

専門家に質問してみよう