Home » エクセルマクロ・Excel VBAの使い方 » 配列 » Array関数がOption Base 1の影響を受けないケース

Array関数がOption Base 1の影響を受けないケース

対象:Excel2007, Excel2010, Excel2013

Array関数がOption Base 1の影響を受けない書き方

配列を作るArray関数の使い方をご紹介した記事の中で、バージョンによってヘルプが間違っている場合がある、Array関数で作成された配列のインデックスの最小値はOption Baseの影響を受ける、ということを書きました。

実は「Option Base 1」の影響を受けないで、最小値が「0」となるケースがありますのでご紹介しておきます。

[スポンサードリンク]

Array関数の比較を行うサンプルマクロ

Array関数で配列を作るだけの以下のマクロを実行して、Stopステートメントで中断したところで、メニュー[表示]-[ローカルウィンドウ]からローカルウィンドウを表示すると、Option Baseの影響を受けないケースがあることを確認できます。

Option Explicit
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 Sub

arr_n のほうは「Option Base 1」の影響を受けて「1」が最小値です。
arr_v のほうは「Option Base 1」が書かれているにも関わらず、配列の添字・インデックスの最小値が「0」となっています。

Array関数がOption Base 1の影響を受けない書き方

つまり、
 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プロシージャで、更にグローバルのメンバーになっていることがオブジェクトブラウザーを使うと確認できます。

Array関数がOption Base 1の影響を受けない書き方

なお、オブジェクトブラウザーでArray関数が見つからないという場合は、オブジェクトブラウザー内で右クリックして表示されるショートカットメニューで[非表示のメンバーを表示]をOnにしてください。

ですから、例えば、
  ans = MsgBox("実行しますか?", vbYesNo)
といったMsgBox関数の場合は、Interactionモジュールのメンバーですから、

Array関数がOption Base 1の影響を受けない書き方

可読性が上がるわけでもないので、実務で実際に利用するマクロでこんな書き方をする必要はありませんが、
  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関数がOption Base 1の影響を受けない書き方

このことがわかると、ArrayとVBA.Arrayの違いが気になってきますが、これについては別記事として書かせていただきますVBAのArray関数は2つあるのではないかと推測しています(2015-09-25)。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » 配列 » Array関数がOption Base 1の影響を受けないケース

「配列」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.