ワークシートをコピーする「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」に、
それぞれテキストを置換して作った手抜きページなので、読む必要はありません。
それぐらい双子のメソッドなんだという風に、覚えておいてください。