VBA ワークシートのコピー
In this Article
このチュートリアルでは、VBAを使用してシートまたはワークシートをコピーする方法について説明します。
ワークシートを新しいワークブックにコピーする
Sheets("Sheet1").Copy
アクティブシートを新しいワークブックにコピーする
アクティブシートを新しいワークブックにコピーします。
ActiveSheet.Copy
複数のシートを新しいワークブックにコピーする
選択されている複数のシートを新しいワークブックにコピーします。
ActiveWindow.SelectedSheets.Copy
同じワークブック内のシートをコピーする
まず、最も簡単なシートをコピーする例として、シート(複数可)を新しいワークブックにコピーする方法を紹介しました。 以降の例では、同じワークブック内でシートをコピーします。ワークブック内でシートをコピーする場合、コピー先の場所を指定しなければなりません。 場所を指定するには、ワークシートを他のワークシートの前または後に移動するように VBA に指示します。
シートを他のシートの前にコピーする
ここでは、Sheet2 の前にシートをコピーして貼り付けるように指定します。
Sheets("Sheet1").Copy Before:=Sheets("Sheet2")
最初のシートの前にシートをコピーする
シート名を指定する代わりに、シートの位置を指定することもできます。ここでは、ワークブックの最初のシートの前にあるシートをコピーして貼り付けています。
Sheets("Sheet1").Copy Before:=Sheets(1)
新しく作成されたシートは、Workbook の最初のシートとなります。
最後のシートの後にシートをコピーする
Afterプロパティを使って、シートを他のシートの後に貼り付けるようにVBAに指示します。ここでは、ワークブック内の最後のシートの後にシートをコピーして貼り付けます。
Sheets("Sheet1").Copy After:=Sheets(Sheets.Count)
ワークブック内のシートの数を数えるためにSheets.Countを使用していることに注意してください。
シートを移動する
同様の構文で、ワークブック内のシートを移動させることもできます。このコードでは、Sheet1 を Workbook の最後に移動させます。
Sheets("Sheet1").Move After:=Sheets(Sheets.Count)
コピーしたシートに名前を付ける
シートをコピー&ペーストすると、新しく作成されたシートがActiveSheetになります。したがって、新しいシートの名前を変更するには、単にActiveSheet.Nameを使用します。
Sub CopySheetRename1()
Sheets("Sheet1").Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "LastSheet"
End Sub
シート名がすでに存在する場合、上記のコードではエラーが発生します。 代わりに、「On Error Resume Next」を使って、シートの名前を無視して残りの処理を進めるようにVBAに指示することができます。
Sub CopySheetRename2()
Sheets("Sheet1").Copy After:=Sheets(Sheets.Count)
On Error Resume Next
ActiveSheet.Name = "LastSheet"
On Error GoTo 0
End Sub
もしくは、私達が作成したRangeExists 関数を使用して、シートをコピーする前にシート名がすでに存在するかどうかをテストします。
Sub CopySheetRename3()
If RangeExists("LastSheet") Then
MsgBox "シートはすでに存在しています。"
Else
Sheets("Sheet1").Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "LastSheet"
End If
End Sub
Function RangeExists(WhatSheet As String, Optional ByVal WhatRange As String = "A1") As Boolean
Dim test As Range
On Error Resume Next
Set test = ActiveWorkbook.Sheets(WhatSheet).Range(WhatRange)
RangeExist = Err.Number = 0
On Error GoTo 0
End Function
セルの値からシートをコピーして名前をつける
また、セルの値に基づいてシートをコピーし、名前を付けたい場合があります。 このコードでは、A1のセルの値に基づいてワークシートに名前を付けます。
Sub CopySheetRenameFromCell()
Sheets("Sheet1").Copy After:=Sheets(Sheets.Count)
On Error Resume Next
ActiveSheet.Name = Range("A1").Value
On Error GoTo 0
End Sub
ワークシートを別のワークブックにコピーする
これまで私たちは、ワークブック内のシートをコピーする作業を行ってきました。今度は、シートを他のワークブックにコピー&ペーストする例を取り上げます。このコードは、シートを他のワークブックの先頭にコピーします。
Sheets("Sheet1").Copy Before:=Workbooks("Example.xlsm").Sheets(1)
ワークシートを別のワークブックの末尾にコピーします。
Sheets("Sheet1").Copy After:=Workbooks("Example.xlsm").Sheets(Workbooks("Example.xlsm").Sheets.Count)
最後のワークシートを取得するために、1を Workbooks(“Example.xlsm”).Sheets.Countに置き換えていることに注意してください。
ワークシートを閉じたワークブックにコピーする
また、ワークシートを閉じているワークブックにコピーしたい場合もあります。 このコードでは、閉じたワークブックを開き、そこにシートをコピーすることができます。
Sub CopySheetToClosedWB()
Application.ScreenUpdating = False
Set closedBook = Workbooks.Open("example.xlsm")
Sheets("Sheet1").Copy Before:=closedBook.Sheets(1)
closedBook.Close SaveChanges:=True
Application.ScreenUpdating = True
End Sub
別のワークブックを開かずに、そのワークブックからシートをコピーする
逆に、このコードは閉じたワークブックからワークシートをコピーするもので、手動でワークブックを開く必要はありません。
Sub CopySheetFromClosedWB()
Application.ScreenUpdating = False
Set closedBook = Workbooks.Open("example.xlsm")
closedBook.Sheets("Sheet1").Copy Before:=ThisWorkbook.Sheets(1)
closedBook.Close SaveChanges:=False
Application.ScreenUpdating = True
End Sub
これらの例では、ScreenUpdatingを無効にして、バックグラウンドで処理を実行していることに注意してください。
エクセルシートを複数回複製する
ループを使用すれば、Excelシートを複数回複製することも可能です。
Sub CopySheetMultipleTimes()
Dim n As Integer
Dim i As Integer
n = InputBox("何枚コピーしますか?")
If n > 0 Then
For i = 1 To n
ActiveSheet.Copy After:=ActiveWorkbook.Sheets(Worksheets.Count)
Next
End If
End Sub