VBAでシートのコピーを行う

シートのCopyメソッド

シートのコピーを行うにはCopyメソッドを使います。

コピーを行うとそのコピー先でそのシートがアクティブになります。

同じブックだけでなく別のブックや新規ブックにコピーすることも可能です。その際も別ブックや新規ブックがアクティブになり、コピーしたシートもアクティブになります。

別ブックにコピーする場合はそのブックが開いていなければなりません。

Array関数を使うと複数のシートを一度にまとめてコピーすることが可能です。

なお、Copyをする際にシートを指定する方法には3つありますが、それについては「VBAでシートをコピーする際のシートの指定方法」をご参照ください。

構文

Copyメソッドには5つの親オブジェクトがあります。通常はワークシートを意味するWorksheetオブジェクトを使います。

Sub Worksheet.Copy([Before As Worksheet], [After As Worksheet])
Sub Chart.Copy([Before As Worksheet], [After As Worksheet])
Sub DialogSheet.Copy([Before As Worksheet], [After As Worksheet])
Sub Worksheets.Copy([Before As Worksheet], [After As Worksheet])
Sub Sheets.Copy([Before As Worksheet], [After As Worksheet])

BeforeとAfterの型は実際には未定義によるVariant型ですが、わかりやすいようにWorksheet型としています。

Worksheet、Chart、DialogSheet、Worksheets、Sheets 親オブジェクトとしてWorksheetオブジェクト、Chartオブジェクト、DialogSheetオブジェクト、Worksheetsコレクション、Sheetsコレクションのいずれかを指定します。

グラフシート用のChartオブジェクトやダイアログシート用のDialogSheetオブジェクトを使うことはまずないと思います。

Worksheetsコレクションを指定する場合にワークシートを全てコピーします。グラフシート、ダイアログシートはコピーされません。

Sheetsコレクションを指定する場合はシートの種類に関わらず全シートをコピーします。

Before 省略可。Beforeでシートを指定すると、その左に対象シートがコピーされます。

BeforeとAfterを同時に設定することは出来ません。設定した場合はエラーになります。

After 省略可。Afterでシートを指定すると、その右に対象シートがコピーされます。

BeforeとAfterを同時に設定することは出来ません。設定した場合はエラーになります。

BeforeとAfterの両方を省略した場合は、対象シートを新規ブックにコピーされます。

コピー先に同じ名前のシートがある場合

別ブックにシートをコピーする場合に、同じ名前のシートが存在することがあります。

その場合はエラーにはならず、コピーしたシートのシート名が「元のシート名」+「半角スペース」+「(連番)」になります。連番は2から始まります。

「Sheet1」が重複する場合は「Sheet1」と「Sheet1 (2)」になり、さらに「Sheet1」がコピーすると「Sheet1」と「Sheet1 (2)」と「Sheet1 (3)」になります。

サンプルコード

新規ブックにコピー

Copyメソッドの引数を省略しているため、新規ブックにシートをコピーします。

開いている別ブックにコピー

未保存のBook7というブックにシートをコピーするサンプルです。引数BeforeによりBook7の左から2番目のシートの左にコピーします。

開いていない別ブックにコピー

開いていない別ブックにコピーするサンプルです。開いていないブックにはシートのコピーはできないため一度開きます。

その後、シートのコピーを行います。

ブックのOpenメソッドを実行するとアクティブブックが開いたブックに変更されるため、事前にコピー元のアクティブブックとコピー先の開くブックのWorkbookオブジェクトを保持しています。

12行目のCopyメソッドでは、コピー元のWorkbookオブジェクトとコピー先のWorkbookオブジェクト+シートを指定しています。

ブックが開いているかどうか不明の場合

ブックが開いているかどうか不明な場合は「ブックが開かれているかチェックする」のサンプルコードをご参照ください。

ブックが開いているかどうかの分岐の条件文をそのまま使えます。

あとはIfとElseの処理以降にシートコピーの処理を書くだけです。

IsBookOpened関数とGetFileName関数は上記リンク先をご参照ください。

複数のシートを一度にコピーする場合

複数のシートを一度にコピーする場合はWorksheetsコレクションやSheetsコレクションの引数にArray関数でコピーしたいシートを全て指定して、Copyメソッドを行います。

Array関数の引数にはシート名を指定します。

関連記事

サブコンテンツ

このページの先頭へ