Excel VBAでシートをコピーする方法
-
Contents
- 今回の目標
- 説明
- ブック内のシートをコピーする
- 他のブックにシートをコピーする
- 注意点など
- 関連リンク
今回の目標
「マクロでシートをコピーをしたい!」や「既存のブックから新しいブックにシートをコピーできない?」と思ったあなたへ。 この記事では、シートをコピーする方法や、複数のシートをコピーする方法、新しいブックを作成してシートをコピーする方法等を丁寧に解説します! 実務で使える具体例つきです。
目標リスト
- シートをコピーできるようになる
- 複数のシートをコピーできるようになる
- 他のブックへシートをコピーできるようになる
説明
シートのコピーについて
Excelマクロでは、シートをコピーできます。
シートのコピーはマクロから行うこともでき、ブック内で1枚のシートをコピーするだけでなく、複数シートを同時にコピー、他のブックへシートをコピーすることができます。
Worksheets.Copy と引数一覧
シートをコピーする場合、Worksheets オブジェクトの Copy メソッドを使用します。
Copy メソッドの引数で、シートをコピーする先のシートの位置の指定できます。
Copy メソッドの構文
Copy(Before, After)
Copy メソッドの引数一覧
引数 | 省略 | 説明 |
---|---|---|
Before | 可能 | シートオブジェクトを指定する。指定したシートの1つ左に、シートをコピーする。 |
After | 可能 | シートオブジェクトを指定する。指定したシートの1つ右に、シートをコピーする。 |
※ Before と After を同時に指定すると、実行時エラー1004が発生します。
Before と After どちらも指定しないと、新規ブックにコピーします。
シートをコピーする方法
シート を 新規ブックにコピーする方法です。
引数を指定しないと、コピーしたシートで構成された新規ブックが作成されます。
Worksheets("コピーするシート名").Copy
シートを1つ左隣りにコピーする方法です。
引数 Before に、1つ左隣りにコピーしたいシートのオブジェクトを指定します。
Worksheets("コピーするシート名").Copy Before:=Worksheets("左隣に置きたいシート名")
"Sheet1" を "Sheet2" の1つ右隣りにコピーする方法です。
引数の After に、1つ右隣りにコピーしたいシートのオブジェクトを指定します。
Worksheets("コピーするシート名").Copy After:=Worksheets("右隣に置きたいシート名")
ブック内にシートをコピーする
特定のシートの1つ右にシートをコピーする
特定のシートの1つ右にシートをコピーする方法です。
After メソッドで、シートオブジェクトを指定します。
サンプルコードでは、"Sheet2" の右隣りに "Sheet3" をコピーします。
サンプルコード
Sub SheetCopySample1_1_1()
'"Sheet2" の右隣りに "Sheet3" をコピーする
Worksheets("Sheet3").Copy After:=Worksheets("Sheet2")
End Sub
● 実行前
● 実行後
シート先のシートオブジェクトを変数に代入する方法です。
コピーをした後のアクティブなシートは、コピー先のシートになります。
この仕様を利用し、コピー後にアクティブなシートを変数に代入します。
サンプルコードでは、シート ”Sheet3” を ”シート2” の右隣りにコピーした後、コピー先のシートオブジェクトを変数に代入しています。
サンプルコード
Sub SheetCopySample1_1_2()
Dim ws As Worksheet
'"Sheet2" の右隣りに "Sheet3" をコピーする
Worksheets("Sheet3").Copy After:=Worksheets("Sheet2")
'コピー先のシートオブジェクトを取得する
Set ws = ActiveSheet
End Sub
● 実行前
● 実行後
ブックの一番左(先頭)にシートをコピーする
ブックの一番左(先頭)にシートをコピーする方法です。
「Worksheets(1)」とすることで、一番左(先頭)のシートを指定できます。
サンプルコードでは、"Sheet1" を一番左にコピーします。
サンプルコード
Sub SheetCopySample1_2()
'一番左(先頭)に "Sheet1" をコピーする
Worksheets("Sheet1").Copy Before:=Worksheets(1)
End Sub
● 実行前
● 実行後
ブックの一番右(最後尾)にシートをコピーする
ブックの一番右(最後尾)にシートをコピーする方法です。
「Worksheets.Count」はブックのシート数を返します。
「Worksheets(Worksheets.Count)」とすることで、最後尾(一番右)のシートを指定できます。
サンプルコードでは、"Sheet1" をブックの一番右(最後尾)にコピーします。
サンプルコード
Sub SheetCopySample1_3()
Dim wsNum As Long
'ブックに存在するシート枚数を取得する
wsNum = ThisWorkbook.Worksheets.Count
'一番右(最後尾)に "Sheet1" をコピーする
Worksheets("Sheet1").Copy After:=Worksheets(wsNum)
End Sub
● 実行前
● 実行後
複数のシートをコピーする
複数のシートをコピーする方法です。
「Worksheets(Array("Sheet1", "Sheet2"))」とすることで、"Sheet1" と "Sheet2" を指定できます。
サンプルコードでは、"Sheet1" と "Sheet2" を一番右(最後尾)にコピーをして、それぞれを変数に代入しています。
サンプルコード
Sub SheetCopySample1_4()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
'ブックの最後尾に "Sheet1" と "Sheet2" をコピーする
Worksheets(Array("Sheet1", "Sheet2")).Copy _
After:=Worksheets(Worksheets.Count)
'コピー先の1つ目のシートオブジェクトを取得する
Set ws1 = ActiveSheet
'コピー先の2つ目のシートオブジェクトを取得する
Set ws2 = Worksheets(ActiveSheet.Index + 1)
End Sub
● 実行前
● 実行後
コピー後のシート名を変更する
コピー後のシート名を変更する方法です。
Worksheets.Name プロパティでシート名を変更できます。
サンプルコードでは、"Sheet1" を先頭(一番左)にコピーして、シート名を ”コピー後のシート” に変更します。
サンプルコード
Sub SheetCopySample1_5()
'先頭(一番左)に "Sheet1" をコピーする
Worksheets("Sheet1").Copy Before:=Worksheets(1)
'コピー後のシート名を変更する
ActiveSheet.Name = "コピー後のシート"
End Sub
● 実行前
● 実行後
コピー後、アクティブなシートを元に戻す
コピー後、アクティブなシートを元に戻す方法です。
コピー前にシート名をシートオブジェクトを変数に保存しておき、コピー後にシートオブジェクトをアクティブにします。
サンプルコードでは、アクティブなシートを変数に代入 → 先頭(一番左)に "Sheet1" をコピー → アクティブなシートを元に戻す、の順で処理を行っています。
サンプルコード
Sub SheetCopySample1_6()
Dim actWs As Worksheet
'アクティブなシートを変数に格納する
Set actWs = ActiveSheet
'先頭(一番左)に "Sheet2" をコピーする
Worksheets("Sheet2").Copy Before:=Worksheets(1)
'アクティブなシートを元に戻す
actWs.Activate
End Sub
● 実行前
● 実行後
他のブックにシートをコピーする
新しいブックを作成してシートをコピーする
新しいブックを作成してシートをコピーする方法です。
コピー後は、アクティブなブックが新しいブックになり、同時にコピー先のシートがアクティブなシートになります。
実務ではコピー先のシートを操作することが多いため、それぞれを変数に代入しておくと便利です。
サンプルコードでは、マクロを実行しているブックの "Sheet1" を新しいブックにコピーし、ブックとシートを変数に代入しています。
サンプルコード
Sub SheetCopySample2_1()
Dim wb As Workbook
Dim ws As Worksheet
'新しいブックに "Sheet1" をコピーする
ThisWorkbook.Worksheets("Sheet1").Copy
'新しいブックオブジェクトを取得する
Set wb = ActiveWorkbook
'コピー先のシートオブジェクトを取得する
Set ws = ActiveSheet
End Sub
● 実行後(新規作成されたブックのシートの見出しです)
開いている他のブックにシートをコピーする
開いている他のブックにシートをコピーする方法です。
コピー先のブックと コピー位置(After / Before)を指定します。
なお、コピー先となるブックをあらかじめ開いておく必要があります。
サンプルコードでは、マクロを実行しているブックの "Sheet1" を新しいブックにコピーし、ブックとシートを変数に代入しています。
サンプルコード
Sub SheetCopySample2_2()
' 開いている "Book2.xlsx" の一番左(先頭)に、
' マクロを実行しているブックの "Sheet1" をコピーする
ThisWorkbook.Worksheets("Sheet1").Copy _
Before:=Workbooks("Book2.xlsx").Worksheets(1)
End Sub
● 実行前(Book2.xlsx のシートの見出し)
● 実行後(Book2.xlsx のシートの見出し)
注意点など
非表示のシートは、コピー後も非表示になる
コピー元のシートの表示状態はコピー先に引き継がれます。
そのため、非表示のシートをコピーすると、コピー後のシートも非表示の状態です。
サンプルコード
Sub SheetCopySample3_1()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
'"Sheet1" の右隣りに "Sheet1" をコピーする
ws.Copy After:=ws
End Sub
● 実行前
・シートの見出し
・シートの再表示
● 実行後
・シートの見出し(実行前と変わっていません)
・シートの見出し("Sheet (2)" が追加された)
新規ブックにコピーするときのアクティブ切り替えの注意点
新規ブックにシートをコピーするときの注意点です。
画面更新を停止(ScreenUpdating = False)した状態、シートを新規ブックへコピーすると、ブックやシートに対する Activate が効かないケースがあります。
詳細には、内部的には一時的にアクティブなブックが切り替わりますが、画面上は切り替わらず、マクロ終了後には内部の状態も元に戻ってしまいます。
この現象は、次の手順で発生します。
1.画面更新を停止する
2.新規ブックにシートをコピーする
3.Activate でアクティブなブックを切り替える
※実際は切り替わらない
回避方法は次のいずれかです。
1.コピー後に Activate を使用しない設計にする
2.コピー前に画面更新を有効にし、 コピー完了後に再び停止する
3.アクティブにしたいブック以外を閉じる
サンプルコード
Sub SheetCopySample3_2()
Dim wb As Workbook
'新しいブックオブジェクトを取得する
Set wb = ActiveWorkbook
'画面更新を停止する
Application.ScreenUpdating = False
'新しいブックに "Sheet1" をコピーする
ThisWorkbook.Worksheets("Sheet1").Copy
'画面更新を再開する
Application.ScreenUpdating = True
'ブック / シートのアクティブを元に戻したい…
wb.Activate ' ← 切り替わらない
End Sub
・実行前
・画面更新を停止しない場合(通常のマクロ)
・画面更新を停止した場合
【補足】
wb.Activate の後で「Debug.Print ActiveWorkbook.name」を行うとコピー元のブック名が表示されますが、表示されているアクティブなブックはコピー先のブックです。
この状態で再度マクロを実行すると、1回目に実行したコピー先のブック名が表示されます。