SheetsオブジェクトのIndexプロパティ
ブックにあるシートのインデックスは、SheetsオブジェクトやWorksheetsオブジェクトのIndexプロパティで取得できます。
Sheetsオブジェクトはワークシートだけでなくグラフシート、マクロシート、ダイアログシートも含みますが、Worksheetsオブジェクトはワークシートのみを対象とします。
SheetsオブジェクトとWorksheetsオブジェクトの違いについては「VBAのSheetsとWorksheetsの違い」をご参照ください。
なお、シート数はCountプロパティで取得できます。
Indexプロパティは1から始まるため、一番右のシートのインデックスはCountプロパティと同じ値になります。
ブックとシートは違います
ブックとシートの違いを聞かれることがあります。
ブックは「test.xlsx」などのファイル自体を指します。
シートはブックを開いた時に下段に表示されて、それぞれ別の用紙のように扱われ、シートごとに名前が付けられます。
ブックのインデックス、という言い方はそもそもあまりしませんが、シートのインデックスというと、通常は左から2番目のシートのインデックスは2、という意味で使われます。
上の画像で言えば、Sheet1がインデックス1、Sheet2がインデックス2、Sheet3がインデックス3になります。
さらに右にシートが1つ追加されれば、追加したシートのインデックスは4になります。
全てのインデックスを取得するサンプルコード
以下のコードはワークシート全てのインデックスを取得するサンプルです。
ループして、1シートずつインデックスとシート名を表示します。
ここではWorksheetsだけしかない場合のコードとシートの種類が複数ある場合のそれぞれについてサンプルを紹介します。
ワークシートだけの場合(Worksheetsオブジェクト)
ワークシートだけのインデックスが取得できればいい場合は、以下のようにWorksheetsオブジェクトのループを行います。
1 2 3 4 5 6 7 |
Sub SheetIndexTest() Dim sht As Worksheet For Each sht In Worksheets Debug.Print "Index=" & sht.Index & " Name=" & sht.Name Next End Sub |
実行結果
Sheet1、Sheet2、Sheet3の3つのシートがある場合に実行すると以下が出力されます。
Index=1 Name=Sheet1
Index=2 Name=Sheet2
Index=3 Name=Sheet3
全ての種類のシートの場合(Sheetsオブジェクト)
マクロシートなどがある場合はWorksheetsオブジェクトではなくSheetsオブジェクトのループを行います。
また、2行目のsht変数もワークシート以外のマクロシートなども対象とするために、型はObject型にします。
1 2 3 4 5 6 7 |
Sub SheetIndexTest2() Dim sht As Object For Each sht In Sheets Debug.Print "Index=" & sht.Index & " Name=" & sht.Name Next End Sub |
実行結果
Sheet1、Sheet2、Sheet3、Macro1(マクロシート)の4つのシートがある場合に実行すると以下が出力されます。
Index=1 Name=Sheet1
Index=2 Name=Sheet2
Index=3 Name=Sheet3
Index=4 Name=Macro1
なお、この4シートがあるブックで、先のワークシートのみを対象とするSheetIndexTest()を実行すると、マクロシートのインデックス4はワークシートではないため出力されません。
アクティブシートのインデックス番号を取得するには
現在表示されているアクティブシートのインデックスを取得する場合は、アクティブシートを示すActiveSheetオブジェクトのIndexプロパティを取得します。
1 2 3 4 5 6 7 |
Sub ActivesheetIndexTest() Dim i i = ActiveSheet.Index Debug.Print i End Sub |
なお、ActiveSheetオブジェクトはドット(.)を押してもプロパティ候補が出ません。
もし出したい場合は以下のようにWorksheetオブジェクトに変換すると表示されるようになります。
1 2 3 4 5 6 7 8 9 |
Sub ActivesheetIndexTest2() Dim i Dim sht As Worksheet Set sht = ActiveSheet i = sht.Index Debug.Print i End Sub |