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
引数を省略した場合の動作
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引数を使い分けることでコピー位置を制御でき、引数を省略すると新規ブックが作成されるという特徴があります。
同一ブック内でのコピーはもちろん、別ブックへのコピーや複数シートの一括処理も、適切なコードを書くことで簡単に実現できます。
実務では、シート名の重複エラーやオブジェクト未設定エラーなどに遭遇することがありますが、事前の存在確認やエラー処理を適切に実装することで、安定したマクロを作成できます。
本記事で紹介したコード例を参考に、ぜひご自身の業務に合わせたシートコピー処理を実装してみてください。