Copyメソッドを使うときのシートの指定
シートに対してCopyメソッドを使うとシートのコピーを行うことが出来ますが、その際にシートの指定方法には3つの方法があります。
ここではそれらについて説明します。
Copyメソッド自体の詳細については「VBAでシートのコピーを行う」をご参照ください。
シートの指定方法
本題のコピーですが、大きく3通りの方法があります。
Copyメソッドを使うのはいずれも同じですが、コピー元の指定方法が異なります。
1. シート名を指定する方法
1つはシート名を指定する方法です。
以下のコードの3行目の「WorkSheets(“Sheet1”)」のように引数でシート名を指定します。
シート名が事前に分かっている場合に使います。
1 2 3 4 5 |
Private Sub CopySheet1() '// シートをコピー WorkSheets("Sheet1").Copy After:=WorkSheets("Sheet1") ActiveSheet.Name = Format(Now, "YYYY-MM-DD HH.MM.SS") End Sub |
2. インデックスを指定する方法
もう1つはシートのインデックスを指定する方法です。
インデックスは全シートの一番左が1になり、それ以降の右が1ずつ加算された値になります。
10シートある場合は一番左が1で、一番右が10になります。
シート名が分からなくても処理が可能なのが強みです。
1 2 3 4 5 |
Private Sub CopySheet2() '// シートをコピー WorkSheets(1).Copy After:=WorkSheets(1) ActiveSheet.Name = Format(Now, "YYYY-MM-DD HH.MM.SS") End Sub |
3. シートオブジェクトを指定する方法
もう1つはシートのオブジェクト名を指定する方法です。
シートのオブジェクトの名前はVBAのプロジェクトウィンドウで確認できます。
以下の場合では、シート名が”a”ですがシートオブジェクト名はSheet1になっています。
このようにシート名とシートオブジェクト名には異なる名前が設定されることがあります。
以下の例ではコピー元のシートは事前に作成済みでオブジェクト名にshtTempと命名していることが前提です。
1 2 3 4 5 6 7 8 9 |
Private Sub CopySheet3() '// 隠しシートを一時的に表示 shtTemp.Visible = xlSheetVisible '// シートをコピー shtTemp.Copy Before:=shtTemp shtTemp.Visible = xlSheetHidden ActiveSheet.Name = Format(Now, "YYYY-MM-DD HH.MM.SS") End Sub |
シート名とインデックスとシートオブジェクトのどれを使えばいいか
上記の「シート名」「インデックス」「シートオブジェクト」の3つですが状況に応じて使い分けが必要になってきます。
個人的には特に条件が無ければシートオブジェクト名を指定する方法を用いることが多いです。
理由は、Excel操作中にシート名やシートの位置を変更されたりすると動作しなくなるため、それを避けるためです。
そのため、上の例のようにVisibleプロパティにxlSheetHidden定数で隠しシートを作っておき、VBAの画面でシートのオブジェクト名にshtTempなどの名前を付けておいて、それをコピーする方法をよく採ります。
Copyメソッドの癖
Copyメソッドには利点でもあり欠点でもあるのですが、癖があります。
それはCopyメソッド実行後はCopyしたシートがアクティブになる点です。
個人的には「それバグだろ」、「余計なことすんなよ」と言いたくなる仕様です。
そのためコピーだけしたい場合には、元のアクティブだったシートをおぼえておいて、Copyメソッド後に再度表示するという処理が必要になります。
VBAはこういうおせっかい仕様がいろいろあるので、使ってみて「え?」と思う動きをすることが多々あります。
こればかりは作ってから確認するしかありません。