和風スパゲティのレシピ

日本語でコーディングするExcelVBA

指定のシートが何番目のシートか調べる

指定のシートが何番目のシートか調べる方法を解説します。

ワークシートのIndex番号を取得する

例えばActiveSheetが何番目のシートかを調べる場合は、
以下のコードを実行します。

Debug.Print ActiveSheet.Index

とても簡単なコードですね。

あるWorksheetオブジェクトがブック内で何番目のシートなのかは、
Indexプロパティの値で調べることができます


Worksheetに限らず、○○.IndexでIndex番号を調べられるものは多いです。
覚えておきましょう。



ちなみに「シートが何番目か調べたい」と思った方は、
Worksheets(x)のxに入れる数字を調べたい」という方が多いでしょうか?


その目的も、もちろんこのコードで達成することができ、まずは、

Debug.Print ActiveSheet Is Sheets(ActiveSheet.index)

こちらは常にTrueになります。
※ オブジェクト同士が同じものであるかは、「=」ではなく「Is」で比較します。


WorksheetsではなくSheetsでの指定を行っているのは、グラフシートやマクロシートがある場合は、Worksheets(x)とSheet(x)は異なる値になるためです。
 

Debug.Print ActiveSheet Is Worksheets(ActiveSheet.index)

これはグラフシートなどが入る場合はTrueとは限らないのでご注意ください。
(ワークシートのみのブックなら常にTrueなので問題ありません)


IndexプロパティはSheets(x)のxを求めるプロパティで、
つまりマクロシートやグラフシートも含めた全シートで何番目かを返します。

Worksheets(x)には、そういった特殊なシートを除いた、「ワークシートで何番目か」を指定する必要がありますので、この点に注意してください。


グラフシートやマクロシートがあるブックにおいて、
Worksheets(x)のxを一発で調べるプロパティは、私の知る限りはありません。

For文で同じ名前の「ワーク」シートを探して、頑張って取得しましょう。

Function GetWorksheetIndex(指定シート As Worksheet) As Long
    With 指定シート.Parent
        Dim i As Long
        For i = 1 To .Worksheets.Count
            If .Worksheets(i) Is 指定シート Then
                GetWorksheetIndex = i
                Exit Function
            End If
        Next
    End With
End Function

 

隣のシートを取得する

さて重ねて推測しますと、
「Worksheets(x)のxに入れる数字を調べたい」と思った方は、
あるシートの隣のシートを取得したい」という方も多いでしょうか?


その目論見通り、隣のシートは、今回のIndexプロパティで、

Set 左隣のシート = Worksheets(指定シート.Index -1)
Set 右隣のシート = Worksheets(指定シート.Index + 1)

このように取得することができます。


もちろんこの書き方でもよいのですが、実はWorksheetオブジェクトには、
「隣のシートを取得するプロパティ」が用意されています。

Set 左隣のシート = 指定シート.Previous
Set 右隣のシート = 指定シート.Next

 
このように、Worksheetオブジェクトには、左右(前後)のシートを取得するNext/Previousプロパティが用意されています。


Indexプロパティはいろいろな場所で出てきて知識の価値が高いので、
Indexを覚えてそれを使ってもいいと思いますが、
知っていればNext/Previousプロパティの方が早く書けます。

気が向いたら覚えてあげてください。


なお、例によってこれらの指定は「グラフシート」があるとうまく動きません。

その場合は、For文で「ワーク」シートを(ry

Function GetNextWorksheet(指定シート As Worksheet) As Worksheet
    Set GetNextWorksheet = 指定シート.Parent.Worksheets _
        (GetWorksheetIndex(指定シート) + 1)
End Function

Function GetPrevWorksheet(指定シート As Worksheet) As Worksheet
    Set GetNextWorksheet = 指定シート.Parent.Worksheets _
        (GetWorksheetIndex(指定シート) - 1)
End Function

For文で頑張ると思いきや、さっきの「WorksheetsのIndex」を調べる関数ですでに頑張っていましたので、ここではFor文はサボれますね(´∀`)

おまけ:ブックが何番目のブックか調べる

さきほど「Indexプロパティはコレクションの数を数えるときよく出てくるから知識の価値が高い」と言いました。


早速類似の問題「指定ブックが何番目のブックか」を調べてみましょう。



Workbooks.Indexのテスト

ないんかい(笑)




なぜかWorkbookにはIndexプロパティが用意されていません。

よって、For文で(ry

Function GetWorkbookIndex(指定ブック As Workbook) As Long
    Dim i As Long
    For i = 1 To Workbooks.Count
        If 指定ブック Is Workbooks(i) Then
            GetWorkbookIndex = i
            Exit Function
        End If
    Next
End Function

Function GetNextWorkbook(指定ブック As Workbook) As Workbook
    Set GetNextWorkbook = Workbooks(GetWorkbookIndex(指定ブック) + 1)
End Function

Function GetPrevWorkbook(指定ブック As Workbook) As Workbook
    Set GetPrevWorkbook = Workbooks(GetWorkbookIndex(指定ブック) - 1)
End Function

まあシートと違って、ブックのIndexが欲しいなんて場面はそうそうないですけどね。