配列を作るArray関数の使い方をご紹介した記事の中で、バージョンによってヘルプが間違っている場合がある、Array関数で作成された配列のインデックスの最小値はOption Baseの影響を受ける、ということを書きました。
実は「Option Base 1」の影響を受けないで、最小値が「0」となるケースがありますのでご紹介しておきます。
Array関数の比較を行うサンプルマクロ
Array関数で配列を作るだけの以下のマクロを実行して、Stopステートメントで中断したところで、メニュー[表示]-[ローカルウィンドウ]からローカルウィンドウを表示すると、Option Baseの影響を受けないケースがあることを確認できます。
Option Base 1
Sub Array関数がOptionBaseの影響を受けることを確認する()
Dim arr_n As Variant
Dim arr_v As Variant
arr_n = Array("東京", "大阪", "名古屋")
arr_v = VBA.Array("東京", "大阪", "名古屋")
Stop
End Subarr_n のほうは「Option Base 1」の影響を受けて「1」が最小値です。
arr_v のほうは「Option Base 1」が書かれているにも関わらず、配列の添字・インデックスの最小値が「0」となっています。
つまり、
arr_n = Array("東京", "大阪", "名古屋")
のように書いた場合はOption Baseの影響を受け最小値が「1」になり、
arr_v = VBA.Array("東京", "大阪", "名古屋")
のように書いた場合はOption Baseの影響を受けずに最小値は「0」となるということです。
VBA.Arrayとは
日本では、VBA関数をライブラリ名から書くスタイルをあまり見かけないため、
arr_v = VBA.Array("東京", "大阪", "名古屋")
というコードをご覧になってビックリする方がいらっしゃるかもしれません。
Excelマクロを作る際に利用するVBAの関数は、VBAライブラリの中の、名前に「Constants」という文字列を含まない、いずれかのモジュールに含まれるFunctionプロシージャかPropertyプロシージャで、更にグローバルのメンバーになっていることがオブジェクトブラウザーを使うと確認できます。
ですから、例えば、
ans = MsgBox("実行しますか?", vbYesNo)
といったMsgBox関数の場合は、Interactionモジュールのメンバーですから、
可読性が上がるわけでもないので、実務で実際に利用するマクロでこんな書き方をする必要はありませんが、
ans = VBA.Interaction.MsgBox("実行しますか?", vbYesNo)
のように「ライブラリ名.モジュール名.VBA関数名」と書いたり、
ans = Interaction.MsgBox("実行しますか?", vbYesNo)
のように「モジュール名.VBA関数名」と書いたり、
ans = VBA.MsgBox("実行しますか?", vbYesNo)
のように「ライブラリ名.VBA関数名」と書いたりできるのです、実は。
今回注目している、
arr_v = VBA.Array("東京", "大阪", "名古屋")
は「ライブラリ名.VBA関数名」という書き方をしているわけです。
で、この書き方をしたときにはOption Baseの影響を受けないで、配列の添字・インデックスの最小値は「0」となるのです。
そしてこのことは、最近のバージョンのヘルプでは、しっかりと書かれています。
Array 関数を使用して作成した配列の下限は、Array がタイプ ライブラリの名前で修飾されていない限り (VBA.Array など)、Option Base ステートメントで指定した下限によって決まります。タイプ ライブラリの名前で修飾されている場合は、Option Base の影響を受けません。
このことがわかると、ArrayとVBA.Arrayの違いが気になってきますが、これについては別記事として書かせていただきますVBAのArray関数は2つあるのではないかと推測しています(2015-09-25)。
Home » エクセルマクロ・Excel VBAの使い方 » 配列 » Array関数がOption Base 1の影響を受けないケース