Copyメソッドを使うときのシートの指定

シートに対してCopyメソッドを使うとシートのコピーを行うことが出来ますが、その際にシートの指定方法には3つの方法があります。

ここではそれらについて説明します。

Copyメソッド自体の詳細については「VBAでシートのコピーを行う」をご参照ください。


シートの指定方法

本題のコピーですが、大きく3通りの方法があります。

Copyメソッドを使うのはいずれも同じですが、コピー元の指定方法が異なります。

1. シート名を指定する方法

1つはシート名を指定する方法です。

以下のコードの3行目の「WorkSheets(“Sheet1”)」のように引数でシート名を指定します。

シート名が事前に分かっている場合に使います。

2. インデックスを指定する方法

もう1つはシートのインデックスを指定する方法です。

インデックスは全シートの一番左が1になり、それ以降の右が1ずつ加算された値になります。

10シートある場合は一番左が1で、一番右が10になります。

シート名が分からなくても処理が可能なのが強みです。

3. シートオブジェクトを指定する方法

もう1つはシートのオブジェクト名を指定する方法です。

シートのオブジェクトの名前はVBAのプロジェクトウィンドウで確認できます。

以下の場合では、シート名が”a”ですがシートオブジェクト名はSheet1になっています。

このようにシート名とシートオブジェクト名には異なる名前が設定されることがあります。

以下の例ではコピー元のシートは事前に作成済みでオブジェクト名にshtTempと命名していることが前提です。



シート名とインデックスとシートオブジェクトのどれを使えばいいか

上記の「シート名」「インデックス」「シートオブジェクト」の3つですが状況に応じて使い分けが必要になってきます。

個人的には特に条件が無ければシートオブジェクト名を指定する方法を用いることが多いです。

理由は、Excel操作中にシート名やシートの位置を変更されたりすると動作しなくなるため、それを避けるためです。

そのため、上の例のようにVisibleプロパティにxlSheetHidden定数で隠しシートを作っておき、VBAの画面でシートのオブジェクト名にshtTempなどの名前を付けておいて、それをコピーする方法をよく採ります。


Copyメソッドの癖

Copyメソッドには利点でもあり欠点でもあるのですが、癖があります。

それはCopyメソッド実行後はCopyしたシートがアクティブになる点です。

個人的には「それバグだろ」、「余計なことすんなよ」と言いたくなる仕様です。

そのためコピーだけしたい場合には、元のアクティブだったシートをおぼえておいて、Copyメソッド後に再度表示するという処理が必要になります。

VBAはこういうおせっかい仕様がいろいろあるので、使ってみて「え?」と思う動きをすることが多々あります。

こればかりは作ってから確認するしかありません。