Excel

【VBA】worksheetsのcopy(1:別ブック:シートをコピーして貼り付ける:複数シート:引数:プロパティなど)

当サイトでは記事内に広告を含みます
技術ブログ特化メルマガはこちら

VBAでシートをコピーする作業は、Excelの自動化において非常に頻繁に使用される重要な操作です。

Worksheets.Copyメソッドを使いこなすことで、テンプレートシートの複製や、データの整理、レポート作成など、様々な業務を効率化できます。

しかし、このメソッドには引数の指定方法や、別ブックへのコピー、複数シートの一括処理など、初心者の方が戸惑いやすいポイントが数多く存在します。

この記事では、Worksheets.Copyメソッドの基本的な使い方から応用テクニックまで、実践的なコード例を交えながら丁寧に解説していきます。

 

Worksheets.Copyメソッドの基本構文と引数

それではまず、Worksheets.Copyメソッドの基本構文と引数について解説していきます。

Copyメソッドの基本的な構文

Worksheets.Copyメソッドは、シートをコピーする際に使用する基本的なメソッドです。構文は以下のようになります。

' 基本構文
Worksheets("シート名").Copy Before:=コピー先, After:=コピー先

' 実際の使用例
Sub シートコピー基本()
    ' Sheet1をSheet2の前にコピー
    Worksheets("Sheet1").Copy Before:=Worksheets("Sheet2")
End Sub

このメソッドでは、コピー元のシートを指定し、BeforeまたはAfter引数でコピー先の位置を指定します。どちらか一方の引数のみを使用することがポイントです。

 

Before引数とAfter引数の使い分け

Before引数とAfter引数は、コピーしたシートをどの位置に配置するかを決定します。Before引数を使うと指定したシートの前に、After引数を使うと指定したシートの後ろに配置されます。

Sub Before引数の使用例()
    ' 売上データシートを集計シートの前にコピー
    Worksheets("売上データ").Copy Before:=Worksheets("集計")
    
    ' コピーされたシートの名前を変更
    ActiveSheet.Name = "売上データ_コピー"
End Sub

Sub After引数の使用例()
    ' テンプレートシートを最後のシートの後ろにコピー
    Worksheets("テンプレート").Copy After:=Worksheets(Worksheets.Count)
    
    ' 今日の日付をシート名にする
    ActiveSheet.Name = "レポート_" & Format(Date, "yyyymmdd")
End Sub
Worksheets.Countを使用することで、常にブックの最後にシートをコピーすることができます。これは新しいレポートを追加する際などに便利なテクニックです。

 

引数を省略した場合の動作

BeforeとAfterの両方の引数を省略すると、新しいブックが自動的に作成され、そこにシートがコピーされます。この動作を理解しておくことは非常に重要です。

Sub 引数省略時の動作()
    ' 引数を省略すると新規ブックが作成される
    Worksheets("顧客リスト").Copy
    
    ' この時点で新しいブックがアクティブになっている
    ActiveWorkbook.SaveAs "C:\作業フォルダ\顧客リスト_" & Format(Date, "yyyymmdd") & ".xlsx"
End Sub

 

同一ブック内でシートをコピーする方法

続いては、同一ブック内でシートをコピーする方法を確認していきます。

 

特定の位置にシートをコピーする

同一ブック内でシートをコピーする際は、インデックス番号を使って位置を指定する方法が便利です。

Sub インデックスでコピー()
    ' 1番目のシートを2番目の位置にコピー
    Worksheets(1).Copy After:=Worksheets(1)
    
    ' コピーされたシートは自動的に2番目になる
    Worksheets(2).Name = "コピー_" & Worksheets(1).Name
End Sub

 

シート名を指定してコピーする

実務では、シート名を使ってコピーする方法がより直感的で分かりやすいです。

Sub シート名でコピー()
    Dim コピー元 As String
    
    ' シート名を変数に格納
    コピー元 = "月次レポート"
    
    ' 月次レポートを年間集計の前にコピー
    Worksheets(コピー元).Copy Before:=Worksheets("年間集計")
    
    ' 新しいシート名を設定
    ActiveSheet.Name = "月次レポート_" & Format(Date, "yyyy年mm月")
End Sub

 

コピーしたシートの名前を変更する

シートをコピーした後は、ActiveSheetを使って即座に名前を変更することができます。

Sub コピー後の名前変更()
    Dim 新シート名 As String
    Dim カウンター As Integer
    
    ' 元のシートをコピー
    Worksheets("商品マスタ").Copy After:=Worksheets("商品マスタ")
    
    ' 重複しない名前を生成
    カウンター = 1
    Do While シート名存在チェック("商品マスタ_" & カウンター)
        カウンター = カウンター + 1
    Loop
    
    ' 名前を設定
    ActiveSheet.Name = "商品マスタ_" & カウンター
End Sub

' シート名の存在チェック関数
Function シート名存在チェック(シート名 As String) As Boolean
    Dim ws As Worksheet
    
    シート名存在チェック = False
    For Each ws In Worksheets
        If ws.Name = シート名 Then
            シート名存在チェック = True
            Exit Function
        End If
    Next ws
End Function

 

別ブックにシートをコピーする実践テクニック

続いては、別ブックにシートをコピーする実践テクニックを確認していきます。

 

新規ブックにシートをコピーする方法

新規ブックにシートをコピーする場合は、引数を省略するだけで自動的に新規ブックが作成されます。

Sub 新規ブックへコピー()
    Dim 元ブック As Workbook
    Dim 新ブック As Workbook
    
    ' 現在のブックを変数に格納
    Set 元ブック = ThisWorkbook
    
    ' シートをコピー(新規ブックが自動作成される)
    元ブック.Worksheets("出荷データ").Copy
    
    ' 新しく作成されたブックを変数に格納
    Set 新ブック = ActiveWorkbook
    
    ' 新規ブックを保存
    新ブック.SaveAs Filename:="C:\出荷データ\出荷データ_" & Format(Date, "yyyymmdd") & ".xlsx"
    新ブック.Close SaveChanges:=True
    
    ' 元のブックをアクティブに戻す
    元ブック.Activate
End Sub

 

既存の別ブックにシートをコピーする

既存のブックにシートをコピーする場合は、対象ブックを開いてからコピー先を指定します。

Sub 既存ブックへコピー()
    Dim コピー元ブック As Workbook
    Dim コピー先ブック As Workbook
    
    ' コピー元のブックを設定
    Set コピー元ブック = ThisWorkbook
    
    ' コピー先のブックを開く
    Set コピー先ブック = Workbooks.Open("C:\集計フォルダ\年間集計.xlsx")
    
    ' シートをコピー(コピー先ブックの最後に追加)
    コピー元ブック.Worksheets("月次売上").Copy After:=コピー先ブック.Worksheets(コピー先ブック.Worksheets.Count)
    
    ' コピー先ブックを保存して閉じる
    コピー先ブック.Close SaveChanges:=True
    
    MsgBox "シートのコピーが完了しました", vbInformation
End Sub
別ブックへコピーする際は、必ずブックオブジェクトを変数に格納して管理することで、操作対象を明確にし、エラーを防ぐことができます。

 

ブックを指定してコピー先を制御する

複数のブックが開いている状態でも、ブック名を使って確実にコピー先を制御できます。

Sub ブック指定でコピー()
    ' ブック名を指定してコピー
    ThisWorkbook.Worksheets("受注データ").Copy _
        Before:=Workbooks("管理台帳.xlsx").Worksheets(1)
    
    ' コピーされたシートはコピー先ブックの1番目になる
    Workbooks("管理台帳.xlsx").Worksheets(1).Name = "受注_" & Format(Date, "mmdd")
End Sub

 

複数シートを一括でコピーする方法

続いては、複数シートを一括でコピーする方法を確認していきます。

 

連続する複数シートのコピー

連続する複数のシートをまとめてコピーする場合は、配列を使ってシートを選択してからCopyメソッドを実行します。

Sub 連続シートコピー()
    ' 複数シートを配列で指定してコピー
    Worksheets(Array("キウイ売上", "パパイヤ売上", "マンゴー売上")).Copy
    
    ' 新規ブックが作成され、3つのシートがコピーされる
    ActiveWorkbook.SaveAs "C:\集計\果物売上_" & Format(Date, "yyyymmdd") & ".xlsx"
End Sub

 

特定の条件に合うシートだけをコピー

シート名に特定の文字列が含まれる場合など、条件に応じてシートを選択的にコピーすることも可能です。

Sub 条件付きシートコピー()
    Dim ws As Worksheet
    Dim 新ブック As Workbook
    Dim 初回フラグ As Boolean
    
    初回フラグ = True
    
    ' 全シートをループ
    For Each ws In ThisWorkbook.Worksheets
        ' シート名に「2024」が含まれるシートをコピー
        If InStr(ws.Name, "2024") > 0 Then
            If 初回フラグ Then
                ws.Copy
                Set 新ブック = ActiveWorkbook
                初回フラグ = False
            Else
                ws.Copy After:=新ブック.Worksheets(新ブック.Worksheets.Count)
            End If
        End If
    Next ws
    
    If Not 初回フラグ Then
        新ブック.SaveAs "C:\アーカイブ\2024年データ.xlsx"
    End If
End Sub

 

配列を使った複数シートの効率的なコピー

配列を活用することで、より柔軟で効率的な複数シートのコピー処理が実現できます。

Sub 配列で複数シートコピー()
    Dim コピー対象 As Variant
    
    ' コピーしたいシート名を配列で定義
    コピー対象 = Array("ドラゴンフルーツ売上", "ライチ売上", "パッションフルーツ売上")
    
    ' 配列で指定したシートをコピー(新規ブック作成)
    Worksheets(コピー対象).Copy
    
    ' 保存
    ActiveWorkbook.SaveAs "C:\集計\エキゾチックフルーツ売上.xlsx"
End Sub

 

よくあるエラーと対処法

続いては、よくあるエラーと対処法を確認していきます。

 

「インデックスが有効範囲にありません」エラー

このエラーは、存在しないシート名やインデックス番号を指定した場合に発生します。

Sub エラー対処_インデックス()
    Dim シート名 As String
    Dim ws As Worksheet
    
    シート名 = "グアバ売上"
    
    ' エラー処理を設定
    On Error Resume Next
    Set ws = Worksheets(シート名)
    On Error GoTo 0
    
    ' シートの存在確認
    If ws Is Nothing Then
        MsgBox "シート「" & シート名 & "」が見つかりません", vbExclamation
        Exit Sub
    End If
    
    ' シートが存在する場合のみコピー
    ws.Copy After:=ws
    ActiveSheet.Name = シート名 & "_コピー"
End Sub

 

「オブジェクトが設定されていません」エラー

このエラーは、ブックオブジェクトが正しく設定されていない場合に発生します。

Sub エラー対処_オブジェクト未設定()
    Dim コピー先ブック As Workbook
    Dim ファイル名 As String
    
    ファイル名 = "集計ブック.xlsx"
    
    ' ブックが開いているか確認
    On Error Resume Next
    Set コピー先ブック = Workbooks(ファイル名)
    On Error GoTo 0
    
    ' ブックが開いていない場合は開く
    If コピー先ブック Is Nothing Then
        Set コピー先ブック = Workbooks.Open(ThisWorkbook.Path & "\" & ファイル名)
    End If
    
    ' 正常にブックが設定された場合の処理
    ThisWorkbook.Worksheets("データシート").Copy _
        After:=コピー先ブック.Worksheets(コピー先ブック.Worksheets.Count)
End Sub

 

シート名の重複エラーの回避方法

同じ名前のシートが既に存在する場合、エラーが発生してしまいます。タイムスタンプを使って回避しましょう。

Sub タイムスタンプで重複回避()
    Dim 元シート名 As String
    Dim 新シート名 As String
    
    元シート名 = "月次データ"
    
    ' タイムスタンプを使用してユニークな名前を生成
    新シート名 = 元シート名 & "_" & Format(Now, "yyyymmdd_hhnnss")
    
    ' シートをコピー
    Worksheets(元シート名).Copy After:=Worksheets(元シート名)
    
    ' 名前を設定
    ActiveSheet.Name = 新シート名
End Sub
タイムスタンプは秒単位まで含めることで、ほぼ確実にユニークな名前を生成でき、シート名の重複エラーを防ぐことができます。

 

まとめ マクロのworksheetsのcopy(別ブック:シートをコピーして貼り付ける:複数シート:引数:プロパティなど)

本記事では、VBAのWorksheets.Copyメソッドについて、基本的な使い方から実践的な応用テクニックまで詳しく解説してきました。

Worksheets.Copyメソッドは、Before引数とAfter引数を使い分けることでコピー位置を制御でき、引数を省略すると新規ブックが作成されるという特徴があります。

同一ブック内でのコピーはもちろん、別ブックへのコピーや複数シートの一括処理も、適切なコードを書くことで簡単に実現できます。

実務では、シート名の重複エラーやオブジェクト未設定エラーなどに遭遇することがありますが、事前の存在確認やエラー処理を適切に実装することで、安定したマクロを作成できます。

本記事で紹介したコード例を参考に、ぜひご自身の業務に合わせたシートコピー処理を実装してみてください。