ブックのインデックスとシートのインデックス
ブックのインデックス、という話を耳にすることがあるのですが、大抵の場合はシートのインデックスを指しているようです。
シートのインデックスの取得については「VBAでシートのインデックスを取得する」をご参照ください。
ただ、場合によっては、開いているブックのインデックスが欲しい場合もあります。
「3番目に開いたブック」などという意味でのインデックスです。
シートのインデックスの場合はシートオブジェクトのIndexプロパティで取得できますが、ブックにはそういうプロパティがありません。
そのため疑似的なインデックスという位置づけになります。
厳密にはブックのインデックスは取得できない
厳密な意味で言うと、ブックのインデックスを取得することは出来ません。理由は2つあります。
1つはExcelが複数起動している場合に、何番目に起動した、という情報がないことです。Excel内で表示されている全てのブックはWorkbooksオブジェクトで取得は出来ます。しかし、Excelアプリケーションを2つ以上起動させている場合は、それぞれWorkbooksオブジェクトは異なるため、何番目に起動したか、という情報にはなりません。
2つ目の理由は、Workbooksオブジェクトをループさせて取得したブックが、本当に開いた順番になっているとは言えない点です。VBAの他のコレクション系のオブジェクトにも言えることですが、何を持ってソートされているのかが不定です。開いた順番なのか、ブックの名前なのか、それとも他の要素なのか、などです。
おそらくは開いた順番だとは思いますが確証がありません。
というわけで、以下のサンプルコードは、あくまでも疑似的で、Excelが複数起動していてもマクロを動かしたExcelを対象とするという限定的な内容であることをご了承ください。
サンプルコード
上の説明の通り、複数のExcelが起動している場合ではそれぞれのWorkbooksオブジェクトが保持する情報が異なります。
そのため、ここではマクロを実行するExcelアプリケーションのブックのインデックスを取得する方法に特化しています。
なお、開いているブック以外にもPERSONAL.XLSBなどが開いていれば、それもインデックスにカウントされます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub bookIndexTest() Dim wb As Workbook Dim i i = 1 For Each wb In Workbooks If wb.Name = ActiveWorkbook.Name Then Debug.Print i & " ★Activebook " & wb.Name Else Debug.Print i & " " & wb.Name End If i = i + 1 Next Debug.Print Workbooks.Count End Sub |
実行結果
vba.xlsm、Book1、Book2、Book3、test.xlsxの5ファイルを開いている場合の実行結果です。
Excel起動時にPERSONAL.XLSBを開いているため、それもカウントに含まれています。
そのため、見た目上は5ファイル開いていますが、PERSONAL.XLSBを含めた6ファイルの「6」がループを抜けたあとのCountプロパティで出力されています。
1 PERSONAL.XLSB
2 vba1.xlsm
3 ★Activebook Book1
4 Book2
5 Book3
6 VBAワード.xlsx
6