シートの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メソッドの引数を省略しているため、新規ブックにシートをコピーします。
1 2 3 |
Sub SheetCopyNewBookTest() Call Sheets(1).Copy End Sub |
開いている別ブックにコピー
未保存のBook7というブックにシートをコピーするサンプルです。引数BeforeによりBook7の左から2番目のシートの左にコピーします。
1 2 3 |
Sub SheetCopyTest1() Call Sheets(1).Copy(before:=Workbooks("Book7").Worksheets(2)) End Sub |
開いていない別ブックにコピー
開いていない別ブックにコピーするサンプルです。開いていないブックにはシートのコピーはできないため一度開きます。
その後、シートのコピーを行います。
ブックのOpenメソッドを実行するとアクティブブックが開いたブックに変更されるため、事前にコピー元のアクティブブックとコピー先の開くブックのWorkbookオブジェクトを保持しています。
12行目のCopyメソッドでは、コピー元のWorkbookオブジェクトとコピー先のWorkbookオブジェクト+シートを指定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub SheetCopyTest2() Dim wbActive As Workbook '// アクティブブック用 Dim wbOpen As Workbook '// コピー先ブック用 '// アクティブブックを保持 Set wbActive = ActiveWorkbook '// ブックを開く Set wbOpen = Workbooks.Open("C:\web\Book4.xlsx") '// 開いたブックの一番左のシートの右にコピー Call wbActive.Sheets(1).Copy(After:=wbOpen.Worksheets(1)) End Sub |
ブックが開いているかどうか不明の場合
ブックが開いているかどうか不明な場合は「ブックが開かれているかチェックする」のサンプルコードをご参照ください。
ブックが開いているかどうかの分岐の条件文をそのまま使えます。
あとはIfとElseの処理以降にシートコピーの処理を書くだけです。
IsBookOpened関数とGetFileName関数は上記リンク先をご参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Sub SheetCopyOtherTest() Dim bOpened As Boolean '// コピー先ブックの状態判定フラグ Dim wbActive As Workbook '// アクティブブック用 Dim wbOpen As Workbook '// コピー先ブック用 Dim sFilePath '// ファイルパス Dim sFileName '// ファイル名 '// アクティブブックを保持 Set wbActive = ActiveWorkbook '// 指定ファイルパスが開いているか確認 sFilePath = "C:\web\Book4.xlsx" bOpened = IsBookOpened(sFilePath) '// ブックが開いている場合 If (bOpened = True) Then '// 開いているブックのWorkbookオブジェクトを取得 Call GetFileName(sFilePath, sFileName) Set wbOpen = Workbooks(sFileName) '// ブックが開いていない場合 Else '// 開いていないブックを開きWorkbookオブジェクトを取得 Set wbOpen = Workbooks.Open(sFilePath) End If '// シートコピー Call wbActive.Sheets(1).Copy(After:=wbOpen.Sheets(1)) End Sub |
複数のシートを一度にコピーする場合
複数のシートを一度にコピーする場合はWorksheetsコレクションやSheetsコレクションの引数にArray関数でコピーしたいシートを全て指定して、Copyメソッドを行います。
Array関数の引数にはシート名を指定します。
1 2 3 4 5 6 7 |
Sub SheetsCopyTest() '// Nameプロパティを利用 Call Sheets(Array(Sheets(1).Name, Sheets(2).Name)).Copy '// シート名を利用 Call Sheets(Array("Sheet1", "Sheet2")).Copy End Sub |