ワークシートオブジェクトの指定方法はいくつか有ります。
1.Worksheets(1)
2.Sheets(1)
3.Worksheets("名前")
4.Sheets("名前")
5.Sheets1
マクロの記録機能では、4の形式でコードが記録されます。
まず、WorksheetsとSheetsの違いですが、
Sheetsはグラフシートも含みますが、Worksheetsはグラフシートを含みません。
たとえば「シート1」「シート2」「シート3」「グラフ1」という4つのシートを持つブックを作成します。
以下のコードを実行すると
Sub Test()
End Sub
は、エラーになりませんが、
Sub Test()
End Sub
は、エラーになります。
また、
Sub Test()
End Sub
は、メッセージボックスに3が表示され、
Sub Test()
End Sub
は、4が表示されます。
(Countは、コレクションに含まれるオブジェクトの数を返すプロパティです)
次に、Worksheets(1)方式は、シートを左からの順番で指定する方法です。
この方式は、あくまで並び順で指定しているので、ユーザーがシートの並びを変えてしまえば、Worksheets(1)の指すシートは変わってしまいます。(シートの作成順で番号が振られているのではありません)
さてここで、先ほどのブックのシートの並びを
「シート1」「シート2」「シート3」「グラフ1」から
「シート1」「グラフ1」「シート2」「シート3」に変えます。
このとき、
Sub Test()
End Sub
とすれば当然「シート2」が選択されます。
では、
Sub Test()
End Sub
とすると、「シート3」が選択されます。
Worksheetsは、グラフシートを無視してワークシートの数だけ数えているのです。
Sheets(1)形式とSheets("名前")形式それぞれの利点は、
Sheets(1)形式
・シートの名前が変更されてもコードが正常に動作する。
・複数のシートに順にアクセスするコードを書きやすい。
For i=1 to 100
Next 1
Sheets("名前")形式
・シートの順番が変わってもコードが正常に動作する。
私は、ユーザーがシートの名前を変更するより、シートの順番を変える可能性のほうが高いと思うのでSheets("名前")形式を使うことが多いです。月別など同じフォーマットのシートが増えていく場合は、Sheets(1)形式を使います。
最後にSheet1という指定方法です。
これはちょっと異質で、本などを見てもあまり使っているコードを見かけせん。
Sheet1という表現は、VBEのプロジェクトエクスプローラに表示される[Sheet1(名前)]のうちSheet1で指定する方法です。

まず注目すべきは、Sheets1ではなくてSheet1であることです。他の表現方法と違ってコレクションの中から選択するという表現をしていません。
また、Sheet1は、シートの並び順を変えてもSheet1のままです。
このようなシートの名前にも並びにも関係なく特定できるという特性を持っているので、設定を記述したシートなどプログラム処理が必ず参照するシートやマスターとなるシートを指定をするときに重宝します。
しかし、いくつか注意する点が有ります。
以下のコードを実行すると、
Sub Test()
End Sub
実行時エラーになります。
そして、
Sub Test()
End Sub
は、コンパイルエラーになります。
Sheet1を使うときは、ブックを指定してはいけないのです。
Sub Test()
End Sub
では、Sheet1はどのブックのシートを指しているのでしょうか?
続きます。
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はどのブックのシートを指しているのでしょうか?
続きます。