こんにちは、管理人のりゅうです。
テンプレートがあり、そのレイアウトを使いまわしたい場合や、週次・月次のシートを増やしたい場合、Worksheet.Copyメソッドを使ってシートをコピーしましょう。
本記事では、Worksheets.Copyの「すぐに使えるサンプルコード」「応用術」「使用の際の注意点」などをじっくり解説します。
シートをコピーするソースコード
シートをコピーするには、「Worksheets.Copy」を使用します。
以下のコードを貼り付けて実行すれば、ブックの末尾に Sheet1がコピーされます。
Public Sub CopySheet()
' ブックの末尾に Sheet1をコピー
Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count)
End Sub
よく使う応用パターン
先頭・末尾にシートをコピーする
先頭にシートをコピーする
Public Sub CopySheet()
' ブックの末尾に Sheet1をコピー
Worksheets("Sheet1").Copy After:=Worksheets(1)
End Sub
末尾にシートをコピーする
Public Sub CopySheet()
' ブックの末尾に Sheet1をコピー
Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count)
End Sub
コピー後のシートを変数に格納する
Copyメソッドには戻り値がありません。
ただ、Copyメソッドを実行すると、コピー先のシートがActiveになるため、ActiveSheetを使ってシートを変数に格納しましょう。
Public Function CopySheet() As Worksheet
Dim wsObj As Worksheet
' ブックの末尾に Sheet1をコピー
Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count)
' コピーしたシートを変数に格納
Set wsObj = ActiveSheet
' コピー先のシートを戻り値として返却
Set CopySheet = wsObj
End Function
コピー後のシート名を変更する
コピー先のシートを「CopySheet」という名前に変更するソースコードです。
Public Sub CopySheet()
Dim wsObj As Worksheet
' ブックの末尾に Sheet1をコピー
Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count)
' コピー先シートの名前を変更
ActiveSheet.Name = "CopySheet"
End Function
コピー後のシート名を重複なしの名前に変更する
シートの存在チェックのロジックと併用することで、重複が無い名前でシートをコピーします。
以下のソースコードでは、「CopySheet」というシート名でコピーされますが、重複するシートがある場合は「CopySheet(1)」のように、連番を振り作成します。
Public Sub CopySheet()
Dim baseName As String: baseName = "CopySheet"
Dim newName As String: newName = baseName
Dim i As Long: i = 1
' ブックの末尾に Sheet1をコピー
Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count)
' 重複するシートの存在チェック
Do While SheetExists(newName)
' 存在しない名前の場合は、変数に値をセットしループ終了
newName = baseName & "(" & i & ")"
i = i + 1
Loop
' シート名を変更する
ActiveSheet.Name = newName
End Sub
Private Function SheetExists(nm As String) As Boolean
On Error Resume Next
' シートの存在チェック
SheetExists = Not Worksheets(nm) Is Nothing
On Error GoTo 0
End Function
Worksheets.Copyの詳細情報
基本構文
シートをコピーするには、WorksheetsコレクションのCopyメソッドを使用します。
object.Copy(Before/After)
引数
# | 引数 | 必須 | 説明 |
---|---|---|---|
1 | Before | ワークシートを指定します。 コピー先が、指定したワークシートの直前(左側)にコピーされます。 | |
2 | After | ワークシートを指定します。 コピー先が、指定したワークシートの直後(右側)にコピーされます。 |
使用における注意点
引数を指定しない場合の挙動
Copyメソッドは以下のように、引数を省略することは可能ですが、引数を省略した場合は新しいブックが作成され、そのブックにシートがコピーされてしまいます。
既に開かれているブックにコピーしたい場合は、Before/Afterプロパティのいずれかにシートを指定しましょう。
Public Sub CopySheet()
Worksheets("Sheet1").Copy
End Function
コピー先のブックが保護されているとコピーできない
Copyメソッドでコピーする先のブックが保護されている場合エラーとなります。
必ず、コピー先のブックが保護されていないか確認するようにしましょう。
コピー後のActiveSheetについて
シートをコピーすると、コピーされたシートがActiveとなります。
従って、「ActiveSheet」などを利用している場合に、予期せず追加されたシートを参照してしまう場合があります。
ActiveSheetは極力避けるようコーディングをするのがオススメです。
ActiveSheetの危険性については、ActivateSheetの危険性についてにて解説しているので、一読いただくのをオススメします。
まとめ
今回は、Copyメソッドについて解説しました。
Copyメソッドは使用における注意点に記載した通り、引数を省略してしまうと新規ブックが開いてしまう点は、不具合を埋め込みやすいので、特に注意しましょう。
その他注意点も一読いただき、バグが無いコーディングを目指しましょう!
関連記事はこちら
- 【Excel VBA】シートの選択(Selectメソッド)
- 【Excel VBA】シートの存在チェック(同名シートの存在チェック)
- 【Excel VBA】シートの移動(Moveメソッド)
- 【Excel VBA】シートの色変更(Colorプロパティ)
- 【Excel VBA】シートの保護(Protect)
- 【Excel VBA】シートの削除(Worksheets.Delete)
オススメの書籍

Excel VBAを始めてみたばかりの方へオススメです!
本記事のような具体的なコードも大事ですが、Excel VBA全体の流れを体系的に学べる書籍が 1冊あると理解が一気に進みます。

本のタイトルの通りで、まさに辞典のように何でも載っています。
メジャーなサンプルコードからマイナーなものまで載っていて、パラパラめくるだけでも楽しいです。
約1,000ページもあるので重いですが、購入すると電子版も付いてくるのでオススメです!
コメント