
今月の実績データを作るために、先月の実績シートをテンプレにしたい…。
マクロで先月のシートをコピーすることはできないの?

なるほど…。
では今回は、「VBAでエクセルのシートをコピーするマクロ」を
VBAマクロ歴3年の私が、できるだけわかりやすく解説いたします。
- 複数のシートをコピーする方法
- コピーしたシートの名前を変更
なども紹介いたしますので、ぜひ最後まで読んでいってください。
エクセルシートをコピーする方法(VBAマクロ)
「Copy」を使います。
まずは実行見本をどうぞ。
実行見本
ひとまず全コードと実行結果をご覧ください。
解説は後ほど行います。
全コード
Sub シートのコピー()
Sheets("Sheet1").Copy After:=Sheets("Sheet1")
End Sub
実行結果

解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
プロシージャの作成
Sub シートのコピー()
End Sub
プロシージャなど、マクロの基礎は下記記事でわかりやすく解説しております。
コードだけではなく、開発タブの表示からマクロの保存まで知りたい方はご参考ください。
シートのコピー
Sheets("Sheet1").Copy After:=Sheets("Sheet1")
上記コードにて、シートのコピーを行っております。
【 Sheets(“コピーしたいシートの名前“).Copy コピーしたシートをどの位置に挿入するか 】
「Sheets」の後ろに()を書きます。
()内に「コピーしたいシートの名前」を書いて「.Copy」を書きます。
シート名は「”(ダブルクォーテーション)」で囲ってください。
「.Copy」の後ろに半角スペースを入れたら、「コピーしたシートをどの位置に挿入するか」を指定します。
今回はコピー元のシート(Sheet1)の後ろに挿入するよう指定しました。
- Before:指定のシートの前に挿入
- After:指定のシートの後ろに挿入
これで、「Sheet1 (2)」という名前シート(Sheet1のコピー)が「Sheet1」の後ろに挿入されます。


マクロが完成したら、実行して動作を確認してみましょう。

エクセル内に作成した自作のボタンを押してマクロを実行させることも可能です。
ボタンの作り方は、下記記事でわかりやすく解説しております。
【エラー例】
存在しないシートを指定した場合はエラーが発生します。
特定しにくいエラーのため、注意しましょう。


シート名を変更したい場合は
前項でお伝えしたとおり、シートをコピーすると「Sheet1 (2)」というようなシート名になってしまいます。
このような名前では都合が悪かったり、わかりにくいと感じた時は、シート名を変更しましょう。
下記が「シートコピー」+「シート名変更」のコードです。
Sub シートのコピー()
Dim ws As Worksheet
Sheets("Sheet1").Copy After:=Sheets("Sheet1")
Set ws = ActiveSheet
ws.Name = "コピー後のシート"
End Sub
前項のコードと比べて、「2行目」「4行目」「5行目」が追加されています。
2行目は変数の宣言です。
シート名を取得するために「ws」という変数を宣言しています。
変数や宣言については下記記事をご参考ください。
4行目でアクティブシート(現在選択されているシート)を取得し、
5行目で「取得したアクティブシートの名前を変更」しています。
これでシートをコピーすると同時に、コピー後のシート名を変更できます。
今回は「コピー後のシート」という名前に変更しています。

シート名を変更する方法は、下記記事で詳しく解説しております。
シート番号やセルの値をシート名にする方法も紹介しておりますので、ご参考ください。
同じ名前のシートがあったらどうなる?
前項のように「Sheet1」をコピーして、「コピー後のシート」という名前にした場合、
同じ名前のシートが既に存在していたらどうなるのでしょうか?
結論から言えば、エラーが発生します。

エラーを発生させたくない場合は、シート名を変更せずにコピーだけするか、重複しないようなシート名(日付を入れるなど)を指定してください。
ここまで、1つのシートをコピーする方法を紹介いたしました。
場合によっては複数のシートを一気にコピーしたい場合もあるかと思います。
それは、次項で紹介いたします。
複数のシートをコピーする方法
下記コードを実行することで、複数のシートをコピーすることができます。
Sub 複数シートのコピー()
Sheets(Array("Sheet1", "Sheet2")).Copy After:=Sheets(Sheets.Count)
End Sub
今回は「Sheet1」と「Sheet2」をコピーしています。

Array()の()内に、コピーしたいシートを書いてください。
各シート名は「”(ダブルクォーテーション)」で囲い、「,(カンマ)」で区切りましょう。
これで複数のシートをコピーできます。
エラーが発生してうまく動作しない場合は、次項を参考に対処を試みてください。
うまく動作しないときの対処法
エラーが発生する
コンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
また今回の場合は、指定したシートが存在しなかったり、変更したシート名が既に存在する場合もエラーが発生します。
コードやシードを確認してみてください。
「ブックが保護されています」と表示された場合は、「校閲」メニューから「ブックの保護」をクリックして保護を解除してください。


警告表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBAでエクセルシートをコピーするマクロを紹介・解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!