ワークシートの番号の決定(Microsoft Excel)
ローレンスは、ワークシートの名前が変更された場合でも、ワークシートの番号を判別する方法を必要としています。たとえば、ワークシートの名前がSheet11の場合、それがシート11であることが簡単にわかります。シートの名前を1月に変更した場合でも、ローレンスはこれがシート11であることを知る方法が必要です。
この問題の解決策は、ユーザー定義関数(マクロ)を使用して行うのが最適です。実際には、マクロがワークシートごとに返す可能性のある2つの数値があります。 1つ目は、ワークシートのインデックス番号です。この番号は、Worksheetsコレクション内のワークシートのWorksheetオブジェクトのインデックスを表します。この値は、次のようなマクロによって返されます。
Function SheetNumber1(shtname As String) Dim sht As Worksheet Application.Volatile For Each sht In ThisWorkbook.Worksheets If LCase(sht.Name) = LCase(shtname) Then SheetNumber1 = sht.Index Exit Function End If Next SheetNumber1 = -1 End Function
この関数をワークシートで使用すると、名前が関数に渡されたワークシートのインデックス番号が返されます。関数に渡された名前がワークシートコレクションに存在しない場合、関数によって値-1が返されます。たとえば、セルで次を使用すると、コレクション内の「January」という名前のワークシートのインデックス値が返されます。
=SheetNumber("January")
このアプローチの問題は、Worksheetsコレクション内のWorksheetオブジェクトの順序が時間の経過とともに変化する可能性があることです。したがって、コレクションの11番目のシートが元々Sheet11であったシートであると常に想定できるとは限りません。
ワークシートの元の名前を(名前の変更方法に関係なく)把握するためのより一貫した方法は、VisualBasicがシートの「コードネーム」と呼ぶものを使用することです。これはワークシートのプロパティであり、次の方法で決定できます。
Function SheetNumber2(shtname As String) Dim sht As Worksheet Dim sTemp As String Application.Volatile For Each sht In ThisWorkbook.Worksheets If LCase(sht.Name) = LCase(shtname) Then sTemp = sht.CodeName SheetNumber2 = Val(Mid(sTemp, 6, 4)) Exit Function End If Next SheetNumber2 = -1 End Function
CodeNameプロパティは、マクロでは読み取り専用です。ワークシートの作成時に割り当てられますが、VisualBasicエディター内で手動で変更することもできます。 CodeNameは常に文字列であり、ワークシートに適用された最初の名前を表すため、「Sheet11」のようになります。 CodeNameを設定すると、ワークシートの名前が変更されても( “January”など)、安定した状態が維持されます( “Sheet11″)。
マクロの例(SheetNumber2)では、CodeNameプロパティがsTemp変数に割り当てられています。これは、ほとんどの場合、「Sheet3」や「Sheet11」のようなものになります。したがって、マクロは6番目の文字(「シート」の直後)で始まるものの数値を取得します。これは、関数によって返される値です。
注:
このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(3398)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。
linkワークシートの番号の決定。