和風スパゲティのレシピ

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

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

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

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

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

MsgBox ActiveSheet.Index

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

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


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



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


その目的もこのIndexプロパティで達成することができ、例えば、

Sheets(ActiveSheet.index)

このコードはActiveSheetを素直に取得できます。


ちなみに、

Worksheets(ActiveSheet.index)

は、ActiveSheetを指すとは限らない点にご注意ください。
 

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

Worksheets(ActiveSheet.index)と書いた場合は、マクロシートやグラフシートがあるとその分だけ左右にズレますのでお気を付けください。
(Worksheetだけでブックが構成されている場合は問題ありません)


グラフシートやマクロシートがあるブックにおいて、
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プロパティの方が早く書けます。

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


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

グラフシートを挟んで右隣のシートを取得するのはそもそも危険な気がしますが、
取得したい場合は上記で作った関数でも使って、

Set 右隣のワークシート = Worksheets(GetWorksheetIndex(指定シート) + 1)

このように取得してください。

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

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


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



Workbooks.Indexのテスト

ないんかい(笑)




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

よって、次のブック、前のブックなどを取得したい場合は、
For文で頑張って探すしかないようです。

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が欲しいなんて場面はそうそうないですけどね。

ブックにおける「前」「次」は安定しない(必ずしも開いた順番とは限らない)ため、
これを頼ってマクロを書くのはおすすめしません。

ご利用は計画的に。