ブックのインデックスとシートのインデックス

ブックのインデックス、という話を耳にすることがあるのですが、大抵の場合はシートのインデックスを指しているようです。

シートのインデックスの取得については「VBAでシートのインデックスを取得する」をご参照ください。

ただ、場合によっては、開いているブックのインデックスが欲しい場合もあります。

「3番目に開いたブック」などという意味でのインデックスです。

シートのインデックスの場合はシートオブジェクトのIndexプロパティで取得できますが、ブックにはそういうプロパティがありません。

そのため疑似的なインデックスという位置づけになります。

厳密にはブックのインデックスは取得できない

厳密な意味で言うと、ブックのインデックスを取得することは出来ません。理由は2つあります。

1つはExcelが複数起動している場合に、何番目に起動した、という情報がないことです。Excel内で表示されている全てのブックはWorkbooksオブジェクトで取得は出来ます。しかし、Excelアプリケーションを2つ以上起動させている場合は、それぞれWorkbooksオブジェクトは異なるため、何番目に起動したか、という情報にはなりません。

2つ目の理由は、Workbooksオブジェクトをループさせて取得したブックが、本当に開いた順番になっているとは言えない点です。VBAの他のコレクション系のオブジェクトにも言えることですが、何を持ってソートされているのかが不定です。開いた順番なのか、ブックの名前なのか、それとも他の要素なのか、などです。

おそらくは開いた順番だとは思いますが確証がありません。

というわけで、以下のサンプルコードは、あくまでも疑似的で、Excelが複数起動していてもマクロを動かしたExcelを対象とするという限定的な内容であることをご了承ください。

サンプルコード

上の説明の通り、複数のExcelが起動している場合ではそれぞれのWorkbooksオブジェクトが保持する情報が異なります。

そのため、ここではマクロを実行するExcelアプリケーションのブックのインデックスを取得する方法に特化しています。

なお、開いているブック以外にもPERSONAL.XLSBなどが開いていれば、それもインデックスにカウントされます。

実行結果
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