和風スパゲティのレシピ

日本語でコーディングするExcelVBA

シートをコピーする - Worksheet.Copy

ワークシートをコピーする「Copyメソッド」の使い方を解説します。

基本構文

ワークシートをコピーする場合、以下のどちらかのコードを実行します。

[コピーするシート].Copy Before:=[ここで指定したシートの1つ前に挿入]

[コピーするシート].Copy After:=[ここで指定したシートの1つ後ろに挿入]

実行例

Sub 第1シートをコピーして第2シートの後ろに挿入する
    Worksheets(1).Copy After:= Worksheets(2)
End Sub

このコードを実行すると、アクティブブックの第1シートをコピーし、
作られたシートが第2シートの次、すなわち第3シートに挿入されます。

コピーで作られたシートを編集するとき

コピーによって作成されたシートを編集するときは、Copyメソッドの特徴である
作られたシートがアクティブになっている」ことを活用します。

' コピーしたシートの名称変更やセル値の編集を行う
Worksheets(1).Copy After:= Worksheets(2)

ActiveSheet.Name = "変更するシート名"
Range("A1") = 1

 
変数に格納する場合はこのように書きます。

' コピーした直後にActiveSheetを変数にSetして、その変数へ処理を実行する
Worksheets(1).Copy After:= Worksheets(2)
Dim 作成シート As Worksheet
Set 作成シート = ActiveSheet

作成シート.Name = "変更するシート名"
作成シート.Range("A1") = 1

シートをコピーする処理が入るようなマクロには、
他にもActiveSheetが変わる処理が書かれる可能性が高いです。

なるべく下の例のように、コピー直後に変数にSetして扱うようにしましょう。

サンプルコード集

いろいろな場面での実行例を記載します。

いずれの場合も、出来上がったシートを編集する場合は、
上記のようにActiveSheetを編集してください。

コピー元・行先のシート名を指定してコピー

Worksheets("○○").Copy After:= Worksheets("△△")

ブックの先頭にコピー

Worksheets("○○").Copy Before:= Worksheets(1)

ブックの末尾にコピー

Worksheets("○○").Copy After:= Worksheets(Worksheets.Count)

[シートの数]番目のシート = 末尾のシートです。

別のブックの先頭にコピー

ThisWorkbook.Worksheets("○○").Copy Before:= Workbooks("△△.xlsx").Worksheets(1)

After、Beforeには別のブックのシートも指定可能です。
行先のブックは開いている必要があります。


ブック間でやり取りをする場合は、この例の「Thisworkbook」のように、
Worksheetsの親ブックを明示しておきましょう。

省略した場合はActiveWorkbookを親としてしまうため、
選択中のブックが変わるとバグになってしまいます。

別のブックの末尾にコピー

ThisWorkbook.Worksheets("○○").Copy After:= Workbooks("△△.xlsx").Worksheets(Workbooks("△△.xlsx").Worksheets.Count)

別のブックの末尾を指定する場合は、Workbooks("△△.xlsx")という指定を2回書く必要がある点に注意してください。

移動先のブックのWorksheetの数を数えなければいけませんからね。


かなり見づらいコードになってしまいますが、

ThisWorkbook.Worksheets("○○").Copy _
    After:= Workbooks("△△.xlsx").Worksheets _
                    (Workbooks("△△.xlsx").Worksheets.Count)

このように、_を使って改行をすると、多少は見やすくなります。


または、きっちりと変数に入れておいても見やすくなります。

Dim コピーするシート As Worksheet
Set コピーするシート = ThisWorkbook.Worksheets("○○")

Dim コピー先ブック As Workbook
Set コピー先ブック = Workbooks("△△.xlsx")

コピーするシート.Copy After:=コピー先ブック.Worksheets(コピー先ブック.Worksheets.Count)

このようにコードを整理するのも、マクロ作成の大事なポイントですね。

新しいブックにコピー

Worksheets("○○").Copy

After、Beforeともに指定しない場合は、コピーしたシート1枚からなる新しいブックが出力されます。

とても簡単な記述なので、是非とも覚えておきましょう。



以上が実行例となります。
目的のマクロにあったサンプルコードをお持ち帰りください。

補足:Copyメソッドの正確な引数の構造について

一応補足しておきますと、

[コピーするシート].Copy Before:=[ここで指定したシートの1つ前に挿入]
[コピーするシート].Copy After:=[ここで指定したシートの1つ後ろに挿入]

と、基本構文を記載してきましたが、Copyメソッドの引数構造は、

[コピーするシート].Copy(Before, After)

これが正確な記述です。


このため、

Worksheets(1).Copy Before:= Worksheets(2)
' ⇅同じ意味
Worksheets(1).Copy Worksheets(2) ' 第1引数に渡す
Worksheets(1).Copy After:= Worksheets(2)
' ⇅同じ意味
Worksheets(1).Copy ,Worksheets(2) ' ←第1引数を省略して第2引数に渡す

こういった書き方をすることもできます。

After:=で使っている「:=」は、
引数を渡す順番に関係なく、指定した名前の引数に渡す機能です。


特にBeforeは1番目の引数であるため、
Before:=とわざわざ書く必要は、機械目線ではありません。


しかし、このAfterとBeforeは「同時に指定してはいけない」引数なため、
どうせ(○○, △△)のような指定はできないのです。

それならば、実際に使う場合は、

Worksheets(1).Copy Before:= Worksheets(2)
Worksheets(1).Copy After:= Worksheets(2)

このように、引数名を記載した方が、人間目線では間違いなくわかりやすいです。


ということで、結論はこの2文だけ覚えておけばいいと思います。

Copy(Before, After)という構造と、「:=」の意味については、
知識として心の片隅にでも置いておいてください。

シートを移動するMoveメソッドについて

シートを移動するにはMoveメソッドを使いますが、

[移動するシート].Move Before:=[ここで指定したシートの1つ前に挿入]
[移動するシート].Move After:=[ここで指定したシートの1つ後ろに挿入]

と、Copyメソッドと全く同じ記述をすることになります。
せっかくなので併せて覚えてしましましょう。

Moveメソッドについては以下の記事で解説しておりますが、
本ページの「コピー」を「移動」に、「Copy」を「Move」に、
それぞれテキストを置換して作った手抜きページなので、読む必要はありません。

それぐらい双子のメソッドなんだという風に、覚えておいてください。

www.limecode.jp