クラスの生徒名ごとにシートを連続コピー
マクロ講座59回
![クラスの生徒名ごとに同じフォーマットのシートを連続コピー](gazo2013/2013_macro_59.png)
![クラスの生徒名ごとに同じフォーマットのシートを連続コピー](gazo2013/2013_macro_59.png)
Excel 2013 マクロ講座59回
生徒の成績記録簿を原本コピーで作る
支店ごとに同じフォーマットの売上表をたくさんコピーしたり、生徒名の成績管理表をたくさんコピーしたり、
日常業務では、原本をコピーして、違う名前をつけて管理するというような作業が多いですね。
今回は、生徒の成績記録簿をExcelで管理するという設定です。元になるブックには、原本シートと生徒名のリストシートがあります。
(サンプルファイルは、こちらから マクロ59回サンプルデータ)
シートを連続コピーしてリストでシート名をつける
リストシートには生徒名が記載されています。この生徒名ごとに原本をコピーしてシート名にしたいわけです。、
![リストの名前でシートを連続コピーマクロ1](gazo2013/macro/2013_macro_59_01.png)
![リストの名前でシートを連続コピーマクロ1](gazo2013/macro/2013_macro_59_01.png)
WorkSheetCopyメソッドを使う
WorkSheetコピーするという操作に使うのは、WorkSheetCopyメソッド。
![リストの名前でシートを連続コピーマクロ2](gazo2013/macro/worksheet_copy_method.png)
どこにコピーするかはブックの最後尾にしたいので、After:=Worksheets(Worksheets.Count)と指定します。
![リストの名前でシートを連続コピーマクロ2](gazo2013/macro/worksheet_copy_method.png)
どこにコピーするかはブックの最後尾にしたいので、After:=Worksheets(Worksheets.Count)と指定します。
Worksheets("原本").Copy After:=Worksheets(Worksheets.Count)
コピーしたシートには、リストシートに記載した生徒の名前をつけるので
リストシートにある個々の生徒名を名前という変数にします。
リストシートにある個々の生徒名を名前という変数にします。
Dim 名前 As Range
For Each……Nextステートメント 同じ処理を繰り返す
そしてFor Each……Nextステートメントをつかって、変数名前に対してシートをコピーして、
シート名には、名前の値を入れるようにします。
![リストの名前でシートを連続コピーマクロ3](gazo2013/macro/for_each_next.png)
![リストの名前でシートを連続コピーマクロ3](gazo2013/macro/for_each_next.png)
ここまでのコードは、
Sub リストから連続シート作成() Dim 名前 As Range For Each 名前 In Worksheets("リスト").Range("A2:A12") Worksheets("原本").Copy After:=Worksheets(Worksheets.Count) ActiveSheet.Name = 名前.Value Next 名前 End Sub
コードを実行すると、生徒名の成績管理シートがリストにある生徒の人数分作成されます。
![リストの名前でシートを連続コピーマクロ4](gazo2013/macro/2013_macro_59_02.png)
![リストの名前でシートを連続コピーマクロ4](gazo2013/macro/2013_macro_59_02.png)
リストの最後の岸田 明君まで作成されていますが、シートのA1セルは、生徒名となっています。
これでは、生徒名を入力しなければなりません。そこで、コードに1行追加します。
ActiveSheet.Range("A1") = 名前.Value
![リストの名前でシートを連続コピーマクロ5](gazo2013/macro/2013_macro_59_03.png)
ActiveSheet.Range("A1") = 名前.Value
Sub リストから連続シート作成1() Dim 名前 As Range For Each 名前 In Worksheets("リスト").Range("A2:A12") Worksheets("原本").Copy After:=Worksheets(Worksheets.Count) ActiveSheet.Name = 名前.Value ActiveSheet.Range("A1") = 名前.Value Next 名前 End SubこれでA1セルに生徒名が入ります。
![リストの名前でシートを連続コピーマクロ5](gazo2013/macro/2013_macro_59_03.png)
コードをもう少し、Withステートメントで簡潔にすると、
Sub リストから連続シート作成2() Dim 名前 As Range For Each 名前 In Worksheets("リスト").Range("A2:A12") Worksheets("原本").Copy After:=Worksheets(Worksheets.Count) With ActiveSheet .Name = 名前.Value .Range("A1") = 名前.Value End With Next 名前 End SubActiveSheetという同一オブジェクトの記述を簡潔にすることができます。