goo blog サービス終了のお知らせ 

VBAのメモ帳

私がVBA学習中に、躓いたり疑問に思ったところをメモしています。

ワークシートオブジェクトの指定-sheet1

2012-04-08 03:19:15 | VBA
ワークシートオブジェクトの指定方法はいくつか有ります。
1.Worksheets(1)
2.Sheets(1)
3.Worksheets("名前")
4.Sheets("名前")
5.Sheets1

マクロの記録機能では、4の形式でコードが記録されます。

まず、WorksheetsとSheetsの違いですが、
Sheetsはグラフシートも含みますが、Worksheetsはグラフシートを含みません。

たとえば「シート1」「シート2」「シート3」「グラフ1」という4つのシートを持つブックを作成します。
以下のコードを実行すると
Sub Test()
Sheets("グラフ1").Select

End Sub
は、エラーになりませんが、
Sub Test()
Worksheets("グラフ1").Select

End Sub
は、エラーになります。

また、
Sub Test()
MsgBox Worksheets.Count

End Sub
は、メッセージボックスに3が表示され、
Sub Test()
MsgBox Sheets.Count

End Sub
は、4が表示されます。
(Countは、コレクションに含まれるオブジェクトの数を返すプロパティです)


次に、Worksheets(1)方式は、シートを左からの順番で指定する方法です。
この方式は、あくまで並び順で指定しているので、ユーザーがシートの並びを変えてしまえば、Worksheets(1)の指すシートは変わってしまいます。(シートの作成順で番号が振られているのではありません)

さてここで、先ほどのブックのシートの並びを
「シート1」「シート2」「シート3」「グラフ1」から
「シート1」「グラフ1」「シート2」「シート3」に変えます。

このとき、
Sub Test()
Sheets(3).Select

End Sub
とすれば当然「シート2」が選択されます。
では、
Sub Test()
Worksheets(3).Select

End Sub
とすると、「シート3」が選択されます。
Worksheetsは、グラフシートを無視してワークシートの数だけ数えているのです。



Sheets(1)形式とSheets("名前")形式それぞれの利点は、

Sheets(1)形式
・シートの名前が変更されてもコードが正常に動作する。
・複数のシートに順にアクセスするコードを書きやすい。
For i=1 to 100
Sheets(i).Select

Next 1

Sheets("名前")形式
・シートの順番が変わってもコードが正常に動作する。

私は、ユーザーがシートの名前を変更するより、シートの順番を変える可能性のほうが高いと思うのでSheets("名前")形式を使うことが多いです。月別など同じフォーマットのシートが増えていく場合は、Sheets(1)形式を使います。



最後にSheet1という指定方法です。
これはちょっと異質で、本などを見てもあまり使っているコードを見かけせん。

Sheet1という表現は、VBEのプロジェクトエクスプローラに表示される[Sheet1(名前)]のうちSheet1で指定する方法です。

まず注目すべきは、Sheets1ではなくてSheet1であることです。他の表現方法と違ってコレクションの中から選択するという表現をしていません。
また、Sheet1は、シートの並び順を変えてもSheet1のままです。

このようなシートの名前にも並びにも関係なく特定できるという特性を持っているので、設定を記述したシートなどプログラム処理が必ず参照するシートやマスターとなるシートを指定をするときに重宝します。

しかし、いくつか注意する点が有ります。
以下のコードを実行すると、
Sub Test()
ActiveWorkbook.Sheet1.Select

End Sub
実行時エラーになります。
そして、
Sub Test()
ThisWorkbook.Sheet1.Select

End Sub
は、コンパイルエラーになります。

Sheet1を使うときは、ブックを指定してはいけないのです。
Sub Test()
Sheet1.Select

End Sub


では、Sheet1はどのブックのシートを指しているのでしょうか?
続きます。


最新の画像もっと見る