Excel VBAでシートをコピーする方法

今回の目標

「マクロでシートをコピーをしたい!」や「既存のブックから新しいブックにシートをコピーできない?」と思ったあなたへ。 この記事では、シートをコピーする方法や、複数のシートをコピーする方法、新しいブックを作成してシートをコピーする方法等を丁寧に解説します! 実務で使える具体例つきです。

目標リスト

  • シートをコピーできるようになる
  • 複数のシートをコピーできるようになる
  • 他のブックへシートをコピーできるようになる

説明

シートのコピーについて

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回目に実行したコピー先のブック名が表示されます。

ページの先頭へ