VBAでシートコピー|別ブックも含めた基本の書き方

ようこそ♪ささぽんのExcel教室へ。
今回は VBAで実現する「シートコピーの基本的な書き方と活用ポイント」をお届けします!
マクロで「シートを別の場所に複製したい」「別ブックにコピーしたい」といった場面、よくありますよね。
そんなときに使えるのが、VBAを使ったシートコピーの方法です。
この記事では、同じブック内と別のブックへのコピーという2つのパターンについて解説していきます!

この記事は以下のような方におすすめです!
・シートコピーを行うマクロを作りたい方
・VBAで「シートコピー」の基本を覚えたい方
・同ブック・別ブック間でのコピー方法を具体的に知りたい方
このブログは「基礎からExcelマクロを学びたいと考えている方」や、
「独学での習得に壁を感じた方」に向けて、やさしく、わかりやすく、丁寧に解説しています。
読み終わるころにはきっと、
「Excelマクロって意外と簡単かも!」「もっとやってみたい!」と思えるはず。
一緒に楽しく学びながら、Excelマクロ使いを目指しましょう!
目次
1. シートコピーの基本構文
VBAでシートをコピーするには、専用の構文を正しく理解することが大切です。
この章では、「Sheets().Copy」の基本的な使い方と、コピー後にシートがどうなるのかという動作の仕組み、さらにコピー先を指定する方法まで、順を追って解説していきます。
◼︎シートコピーの基本構文は「Sheets().Copy」
VBAでシートをコピーするには、どんな書き方をすればよいのでしょうか。
まずは最もシンプルなパターンから見てみましょう。
たとえば「Sheet1」という名前のシートをコピーしたい場合は、次のように記述します。
Sheets(“Sheet1”).Copy
この1行だけで、シートコピーが実行されます。
ここでの「Sheets(“Sheet1”)」はコピー元のシートを指定しており、「.Copy」はそのシートを複製する命令です。
ただし、この書き方ではコピー先が明示されていないため、実行結果としては「Sheet1」が新しいブックにコピーされるという動作になります。
コピーの書き方によって、シートがどこに追加されるかが変わるので注意が必要です。
◼︎コピーしたシートはどこに入る?動作の仕組み
コピー先を指定しない場合、新しいブック(New Workbook)が自動的に作成され、その中にコピーされたシートが入ります。
これはVBAが「コピー先が不明な場合は新しいブックに入れる」という仕様に従って動作しているためです。
一方、もし同じブック内にシートをコピーしたい場合や、別のブックの特定位置にコピーしたい場合は、コピー先の位置を明示的に指定する必要があります。
たとえば、次のような書き方です。
Sheets(“Sheet1”).Copy After:=Sheets(“Sheet2”)
このコードは、「Sheet1」を「Sheet2」の後ろにコピーします。
つまり、同じブック内の特定の場所に新しいシートが追加されるという動作になります。
このように、{B}「After:=」や「Before:=」といったパラメータを使うことで、コピーしたシートの配置場所を自在にコントロールすることができます。
◼︎コピー先や順番を指定したいときの書き方
コピー先やシートの順番をコントロールしたい場合は、「Copy」メソッドに引数を追加することで対応できます。
VBAでは、「Before:=」または「After:=」という指定を使って、コピーしたシートをどこに追加するかを明示的に指定できます。
たとえば、以下のように書くと「Sheet1」を「Sheet3」の前にコピーできます。
Sheets(“Sheet1”).Copy Before:=Sheets(“Sheet3”)
逆に、「Sheet3」の後ろにコピーしたい場合は「After:=」を使います。
Sheets(“Sheet1”).Copy After:=Sheets(“Sheet3”)
このときに指定する「Sheet3」などのシートは、現在のブック内に存在するシートである必要があります。
ブックの構成を意識して、コピー先の位置をしっかり指定することが大切です。
このように「Before:=」や「After:=」を使えば、同じブック内でコピーしたシートの挿入場所を自在に調整することができます。
別のブックにコピーしたい場合は、少し異なる構文と準備が必要になるため、3章で解説します。
2. 同じブック内でシートをコピーする方法
まずは同じブック内でシートを複製する基本操作を押さえましょう。
VBAを使えば、「今あるシートの後ろにもう1枚作りたい」といった作業も1行で実現できます。
この章では、シートを任意の位置にコピーする方法と、コピー後のシート名変更など、実務でよく使うテクニックを解説していきます。
◼︎シートを直後にコピーする
もっとも基本的なコピー操作として、今アクティブなシートをその直後に複製する方法があります。
以下のようなコードで実行できます。
ActiveSheet.Copy After:=ActiveSheet
このコードは、現在選択されているシート(ActiveSheet)を、その後ろにコピーします。
また、特定のシートを明示的にコピーしたい場合は、シート名を指定することもできます。
Sheets(“Sheet1”).Copy After:=Sheets(“Sheet1”)
このようにすれば、「Sheet1」のすぐ後ろに同じ内容のシートが複製されます。
この方法は、テンプレートシートを複数作成したいときなどに便利です。
VBAでシートを複製する際は、「どのシートの後にコピーするか」を明確に指定するのがポイントです。
◼︎任意の位置にコピーする:BeforeとAfterの使い方
VBAでは、コピーしたシートを好きな位置に挿入することができます。
そのためには「Before:=」または「After:=」という引数を活用します。
たとえば、特定のシート「Sheet3」の前に「Sheet1」をコピーしたい場合は、以下のように記述します。
Sheets(“Sheet1”).Copy Before:=Sheets(“Sheet3”)
逆に、後ろに挿入したい場合は「After:=」を使います。
Sheets(“Sheet1”).Copy After:=Sheets(“Sheet3”)
ここで注意したいのは、「Before」または「After」に指定するシートが、コピー先のブック内に存在していなければならないという点です。
また、指定できるのは同じブックにある既存のシートである必要があります。
「どの位置に追加するか」を細かく制御できることで、テンプレートや入力シートの順番を整える処理などに応用が効くようになります。
◼︎コピーしたシートの名前を変更する
シートをコピーすると、自動的に「Sheet1 (2)」のような名前が付けられます。
しかし、実務ではシート名を自分で指定したい場面が多くあります。
そんなときは、コピー直後に「Name」プロパティを使って名前を変更しましょう。
たとえば「Sheet1」をコピーして、その新しいシートを「営業報告」にしたい場合は、次のように記述します。
Sheets(“Sheet1”).Copy After:=Sheets(“Sheet1”)
ActiveSheet.Name = “営業報告”
このコードでは、まず「Sheet1」を複製し、その直後に自動的にアクティブになったシートに対して名前を設定しています。
新しくコピーされたシートは、自動的に選択状態になるため、ActiveSheetを使って直接名前を変更できるという仕組みです。
ただし、すでに同じ名前のシートがあるとエラーになるため、重複を避ける工夫も必要です。
たとえば、日付や連番を組み合わせて一意な名前をつける方法がよく使われます。
3.別のブックにシートをコピーする方法
◼︎新しいブックにコピーする基本パターン
VBAでシートをコピーするとき、コピー先を指定しないと、自動的に新しいブック(New Workbook)が作成され、そこにシートが複製されます。
この動作は非常にシンプルで、たとえば以下のようなコードで実現できます。
Sheets(“Sheet1”).Copy
このコードを実行すると、「Sheet1」が新規のExcelブックにコピーされ、そのブックがアクティブになります。
このあと、必要に応じてファイルを保存したり、名前を付けたりする流れになります。
また、新しいブックにコピーされた直後の状態では、そのブックは「Workbooks(1)」のように順番でアクセスするのがやや不安定です。
確実に操作するには、コピー直後のブックを変数で受け取る工夫が有効です。
Sheets(“Sheet1”).Copy
Set wbNew = ActiveWorkbook
wbNew.SaveAs “C:\Users\me\Documents\コピー先.xlsx”
このように書けば、コピーされた新しいブックを“wbNew”と定義できるので、確実に取得して操作できます。
ファイル保存や追加処理を行う場合は、この書き方が非常に役立ちます。
◼︎既存の別ブックにシートをコピーする
コピー先としてすでに開いている別のブックにシートを移したい場合は、Workbooksオブジェクトを使って対象のブックを指定します。
以下は、「Sheet1」を「Book2.xlsx」という別ブックの先頭にコピーする例です。
Sheets(“Sheet1”).Copy Before:=Workbooks(“Book2.xlsx”).Sheets(1)
このコードでは、「Sheet1」を「Book2.xlsx」の1番目のシートの前に挿入しています。
{B}BeforeやAfterの対象を別ブックのシートで指定すれば、コピー先を明確に指定することができます。
また、あらかじめブックを変数で受け取っておくと、より安全かつ柔軟に操作できます。
Dim wbTarget As Workbook
Set wbTarget = Workbooks(“Book2.xlsx”)
Sheets(“Sheet1”).Copy After:=wbTarget.Sheets(wbTarget.Sheets.Count)
このように書けば、ターゲットブックの最後尾にコピーすることもできます。
ブック間でシートをやり取りする際は、エラー防止のためにブックが開かれているかどうか、名前が正しいかを事前に確認しておきましょう。
◼︎コピー先のブックが開かれていない場合
コピー先のブックがまだ開かれていない場合、VBAでは事前にそのブックを開いてからシートコピーを実行する必要があります。
存在しないブックを指定するとエラーが発生するため、「Workbooks.Open」でファイルを開く処理を加えましょう。
以下は、保存済みのExcelファイルを開いてからシートをコピーする例です。
Dim wbTarget As Workbook
Set wbTarget = Workbooks.Open(“C:\Users\me\Documents\コピー先.xlsx”)
Sheets(“Sheet1”).Copy After:=wbTarget.Sheets(wbTarget.Sheets.Count)
このコードでは、まずファイルパスでブックを開き、それを変数に代入しています。
その後、対象ブックの最後尾に「Sheet1」をコピーしています。
Workbooks.Openはファイルが存在しないとエラーになるため、事前にファイルの存在チェックを加えるとより安全です。
たとえば以下のようにDir関数を使ってチェックする方法があります。
Dim filePath As String
filePath = “C:\Users\me\Documents\コピー先.xlsx”
If Dir(filePath) <> “” Then
Set wbTarget = Workbooks.Open(filePath)
Sheets(“Sheet1”).Copy After:=wbTarget.Sheets(wbTarget.Sheets.Count)
Else
MsgBox “コピー先ファイルが見つかりませんでした。”
End If
このようにすれば、実行時のエラーを回避しながら柔軟に対応するマクロを作ることができます。
Dir関数について詳しく知りたい方は、以下の記事もあわせてご覧ください!
4.シートコピーマクロの実用例
◼︎月次報告用テンプレートを複製する
毎月の定型レポートをExcelで作成している方にとって、テンプレートシートを複製して使い回す処理は非常に便利です。
VBAでその作業を自動化すれば、誤操作や手間を省いて安定したレポート作成が可能になります。
たとえば「月次報告」というシートをもとに、毎月の新しいシートを作成するには以下のようなコードを使います。
Dim newSheet As Worksheet
Sheets(“月次報告”).Copy After:=Sheets(Sheets.Count)
Set newSheet = ActiveSheet
newSheet.Name = “2024年07月”
このコードでは、「月次報告」というテンプレートをブック内の最後尾にコピーし、そのシート名を「2024年07月」に変更しています。
月ごとに名前を変えるには、日付関数や文字列処理を組み合わせると便利です。
Dim ym As String
ym = Format(Date, “yyyy年mm月”)
Sheets(“月次報告”).Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = ym
このようにすれば、その日付に応じた月次シートが自動で追加され、作業の抜け漏れや転記ミスを防ぐことができます。
◼︎作業前にシートを自動バックアップする
重要なシートに手を加える前に、その時点の状態をバックアップとして残しておくのは、リスク回避のために非常に大切です。
VBAではコピーと名前変更を組み合わせることで、手軽にバックアップを取ることができます。
以下のコードは、「入力シート」という名前のシートを複製し、現在時刻を付けた名前で保存する例です。
Dim backupSheet As Worksheet
Dim timeStamp As String
timeStamp = Format(Now, “yyyymmdd_HHmmss”)
Sheets(“入力シート”).Copy After:=Sheets(“入力シート”)
Set backupSheet = ActiveSheet
backupSheet.Name = “入力シート_バックアップ_” & timeStamp
このコードを実行すると、「入力シート」がコピーされ、その直後に「入力シート_バックアップ_20250719_103000」のような名前のシートが作成されます。
こうしておけば、編集前の状態を履歴として残すことができ、誤操作発生時のリスクを最小限に抑えられます。
特に複数人でファイルを共有している場合や、入力後に集計処理を行うようなシーンでは、簡易的なバージョン管理として重宝します。
◼︎日付やユーザー名を使ってシートを管理する
シートをコピーしたあと、その目的や作業者、作成日時がすぐにわかるように管理することも重要です。
VBAでは日付関数や環境変数を使って、動的にシート名を付けることができます。
たとえば、コピー時に作業者のユーザー名と日付を組み合わせたシート名を付ける例がこちらです。
Dim userName As String
Dim dateStamp As String
userName = Environ(“Username”)
dateStamp = Format(Date, “yyyymmdd”)
Sheets(“入力シート”).Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = “入力_” & userName & “_” & dateStamp
このように書くことで、「入力_TaroYamada_20250719」のような一意で意味のあるシート名が自動で付きます。
複数人が関わる業務や、日次・週次単位で繰り返し使う帳票などでは、このようなルールでシートを整理しておくと後からの確認がしやすくなります。
また、ファイルの共有や差分管理を行う際にも、履歴の追跡が容易になるという利点があります。
5.まとめ|シートコピーの基本を身につけよう
◼︎シートコピーのポイント
この記事では、VBAを使ってシートをコピーする方法を、基本構文から応用まで段階的に解説しました。
ここで、章ごとに学んだ内容を一覧表で振り返っておきましょう。
章 | 内容 | 主な構文 |
1.基本構文 | Sheets().Copy の使い方と動作理解 | Sheets(“Sheet1”).Copy |
2.同一ブック内 | コピー位置の指定、名前変更 | After:=Sheets(“○○”)、ActiveSheet.Name |
3.別ブック対応 | 新規・既存ブックへのコピー | Workbooks(“○○”).Sheets(1) |
4.実務応用 | テンプレート複製・自動バックアップ | Now, Environ, Format を併用 |
特に重要なのは以下の3点です。
•コピー先を明示することで、思い通りの位置に挿入できる
•ActiveSheet や Workbooks などのオブジェクトを使い分ける
•日付やユーザー名などを動的に組み合わせることで、管理がしやすくなる
これらを押さえておけば、実務で頻出する「テンプレート展開」「作業履歴の管理」などが効率化できます。
◼︎実務での活用アイディア
今回学んだ内容を使ってできることは、実はまだまだあります。
たとえば以下のような場面でも「シートコピーの応用」が活きてきます。
•毎月の報告書や請求書を定型フォーマットで展開する
•入力ミスや上書きを防ぐために、作業開始時にバックアップを取る
•担当者別・日付別にシートを自動作成して作業の見える化を図る
これらはどれも、基本的なコピー構文+少しの工夫で実現できます。
今回の記事をきっかけに、まずは自分の業務で「これ、VBAで複製できないかな?」と考えてみるのが第一歩です。
ぜひ、身近な業務で使えないか確認してみてくださいね!
\ Excelマクロ制作も承っています /
各種クラウドソーシングサイトにて業務効率化ツールの作成・カスタマイズを承っております。
ご相談・お見積もりは無料ですので、まずはお気軽にご覧ください!