【Excel VBA】シートをコピーする方法まとめ|名前変更や注意点も解説

はじめに

こんにちは、管理人のりゅうです。
テンプレートがあり、そのレイアウトを使いまわしたい場合や、週次・月次のシートを増やしたい場合、Worksheet.Copyメソッドを使ってシートをコピーしましょう。
本記事では、Worksheets.Copyの「すぐに使えるサンプルコード」「応用術」「使用の際の注意点」などをじっくり解説します。

シートをコピーするソースコード

シートをコピーするには、「Worksheets.Copy」を使用します。
以下のコードを貼り付けて実行すれば、ブックの末尾に Sheet1がコピーされます。

サンプルコード
Public Sub CopySheet()

    ' ブックの末尾に Sheet1をコピー
    Worksheets("Sheet1").Copy After:=Worksheets(Worksheets.Count)
End Sub

Copyメソッドは、「書式」「数式」「ページ設定」「シートの保護状態」まで丸ごと複製されます。
また、Afterプロパティを使うことで、指定したシートの後ろ(右側)にシートが複製されます。
※後述するBefore/Afterプロパティを使わないと、コピー元のシートが別ブックとして作成されるのでご注意ください。

よく使う応用パターン

先頭・末尾にシートをコピーする

先頭にシートをコピーする

サンプルコード
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)

引数

#引数必須説明
1Beforeワークシートを指定します。
コピー先が、指定したワークシートの直前(左側)にコピーされます。
2Afterワークシートを指定します。
コピー先が、指定したワークシートの直後(右側)にコピーされます。
Copyメソッド – 引数

使用における注意点

引数を指定しない場合の挙動

Copyメソッドは以下のように、引数を省略することは可能ですが、引数を省略した場合は新しいブックが作成され、そのブックにシートがコピーされてしまいます。

既に開かれているブックにコピーしたい場合は、Before/Afterプロパティのいずれかにシートを指定しましょう。

サンプルコード
Public Sub CopySheet()
    Worksheets("Sheet1").Copy
End Function

コピー先のブックが保護されているとコピーできない

Copyメソッドでコピーする先のブックが保護されている場合エラーとなります。
必ず、コピー先のブックが保護されていないか確認するようにしましょう。

コピー元のブックが保護されていてもエラーになりません。

コピー後のActiveSheetについて

シートをコピーすると、コピーされたシートがActiveとなります。
従って、「ActiveSheet」などを利用している場合に、予期せず追加されたシートを参照してしまう場合があります。
ActiveSheetは極力避けるようコーディングをするのがオススメです。

ActiveSheetの危険性については、ActivateSheetの危険性についてにて解説しているので、一読いただくのをオススメします。

まとめ

今回は、Copyメソッドについて解説しました。

Copyメソッドは使用における注意点に記載した通り、引数を省略してしまうと新規ブックが開いてしまう点は、不具合を埋め込みやすいので、特に注意しましょう。

その他注意点も一読いただき、バグが無いコーディングを目指しましょう!

関連記事はこちら

オススメの書籍

Excel 2019/2016/2013 VBAプログラミング実践 (よくわかる)

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

(サンプルファイル・無料電子版付)できる大事典 Excel VBA 2019/2016/2013&Microsoft 365

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

大手外資系コンサルティングファーム勤務。ExcelVBA歴は8年。金融関係のプロジェクトにて約100万レコードを処理するマクロの開発実績あり。ExcelVBAの基礎・応用情報を発信中。

コメント

コメントする

CAPTCHA