複数のシートを作成できるExcelでは、VBAでも多くの処理で、どのシートに対する処理なのかを指定する必要があります。
しかし、シートの指定方法は主に3種類あります。
3種類のどの方法でも大丈夫という部分は多いですが、シーンによっては特定の方法でなければうまく動作しないこともあります。
このページではそういったシートの指定方法をどう使い分ければいいのか、それぞれの特徴やメリット・デメリットについて解説します。
3つの指定方法とその違いがわかるようになりますので、ぜひチェックしてみてください。
3つのシート指定方法
シート名で指定
シート名で指定する方法です。
Sheets("シート名") Worksheets("シート名")
この2つはどちらも同じです。
私はコードはできるだけ短いほうがいいので、Sheets(“シート名”)を使います。
Sheets(“シート1”).Select
Worksheets(“シート1”).Range(“A1”).Select
例示するまでもないですね。
最も一般的な方法だと思いますが、当然ながらBook保護をしていない場合などで、シート名を変更されると一発でエラーになります。
一方で、コードの可読性は高いです。シート名だと直感的に理解できますから。
また、他Bookのシート操作(指定)にも使えます。
インデックス番号で指定
ここで言うインデックス番号とは、シートの並び順のことです。
左端から1、2、3・・・となっていて、整数で指定します。
この画像の場合、Sheet1が「1」でSheet2が「2」といった具合です。
コードは次のように指定します。
Sheets(1) Worksheets(1)
括弧内が名前指定のときと違い「””(ダブルコーテーション)」がないのがポイントです。
仮にSheets(“1”)にした場合、「1」というシート名を指定していることになってしまいます。
Sheets(1).Select
Worksheets(2).Range(“A1”).Select
これも例示するまでもないですね。
この方法は主にFor~Nextなどの繰り返し処理などで活躍します。
次のコードは左端から3つのシートに保護をかけるコードで、シートのインデックス番号に指定した変数「i」の中身を1~3に変化させることで対象シートを順番に指定しています。
Sub シート指定保護()
'シートのうち左から3つのシートだけ保護をかける
Dim i As Long
For i = 1 To 3
Sheets(i).Protect Password:=""
Next i
End Sub
見てのとおり、このような処理ではシートの指定に数値が使えないと成立しません。
一方で、Bookに保護をかけてない場合、シートの並び順を変えられると意図しないシートに処理が行われるという危険性を持っています。
この方法も他Bookのシート操作(指定)に使えます。
オブジェクト名で指定
オブジェクト名とはExcelの内部識別に使われる「シートの本名」のようなもので、Excelシート上でユーザーが変更できる一般的な「シート名」とは別物です。
具体的にはVBAのエディタ画面の左上に表示されている「プロジェクトエクスプローラー」に並んでいるシート名の手前の部分です。(下図の赤枠の部分です。)
特に変更していなければ「Sheet1」、「Sheet2」というような名前になっているはずです。
このオブジェクト名を次のようにそのまま指定します。
Sheet1.Select
このオブジェクト名による指定の最大のメリットは、シート名を変更されたり、シートの並び順を変更されても、処理内容に影響がないことです。
つまり、シート名や並び順を変えたとしても、それに起因するエラーや誤作動の起きない安全性の高い指定方法と言えます。(もちろんシートを削除されてしまうとエラーになりますが。)
用途によってはBook保護なしでの運用もできるかもしれません。
デメリットは他Bookのシート操作(指定)に使えないことです。
各指定方法の特徴比較
3つの指定方法について、主なメリット・デメリットをまとめると次のようになります。
指定方法 | メリット | デメリット |
---|---|---|
シート名 | ・コードの可読性が高い。 ・他Bookの操作に使える。 | ・シート名を変更するとコードも修正する必要がある。 |
インデックス№ | ・For~Nextなどの構文で利用しやすい。 ・他Bookの操作に使える。 | ・並び順を変更するとコードも修正する必要がある。 ・並び順を変更してもエラーで止まらないため危険。 ・コードの可読性が悪い。 |
オブジェクト名 | ・シート名や並び順を変更しても正常に動作する。 | ・コードの可読性が悪い。 ・他Bookの操作には使えない。 |
このように、どれがベストというものではなく、3種類とも用途別に長けた使い道があります。
各指定方法の特徴を押さえておけば、最適な使い分けができるのではないでしょうか。
ちなみに、オススメするは「オブジェクト名」での指定です。
その理由を次に記載します。
オブジェクト名での指定をおすすめする理由
好みがあるため一概に言えるものではないですが、個人的には「オブジェクト名」での指定が最も使いやすく安全性の高い方法だと考えています。
その理由は
「シート名」や「並び順」を変更してもコードを修正しなくていい。
これに尽きます。
VBAを組み込んだBookは使いながら改修を加えることが多く、シート名や並び順の変更は「あるもの」と考えておくのが無難だと思います。
そして、オブジェクト名での指定はシート名やシートの並び順を変えたとしても、コードの修正漏れなどうっかりミスを防ぐ意味でも合理性があると思います。
ただ誤解がないように言っておきますが、シート名での指定(特に変数指定)がベストな場面もありますし、インデックス番号による指定でないとできないこともあります。
結局は冒頭に記載したとおり、目的によって3通りの指定方法を使い分ける必要は出てきます。
どうぞご参考まで。
コメント