contents
|
まず簡単に、VBAにおける配列の扱いの基本について、一通り説明しておきましょう。
VBAで単に「配列」という言葉が使われた場合、配列変数を意味していることが多いようです。
配列変数は普通の変数(ここでは配列変数と区別するために「スカラ変数」と呼ぶことにします)と同様、いわばデータを一時的に入れておくための入れ物ですが、その構造が配列になっており、同じ種類のデータをまとめて扱うことができます。
VBA(VB)では、配列変数はあらかじめサイズ(要素の数)を決めて宣言するか、とりあえずサイズは決めないで宣言しておき、コードの実行中、状況に応じてサイズを設定・変更します。
前者を固定長配列(静的配列)、後者を動的配列といいます。
次のコードの1行目のステートメントが固定長配列、2行目が動的配列の宣言です。
Dim MyFriends(3) As Long Dim MyGFs() As Variant
配列の変数名は、スカラ変数同様、ユーザーが勝手に決めることができます。スカラ変数と違うのは、配列変数の場合は変数名の後に( )を付けることです。この( )の中には、配列の要素を特定するインデックス番号(添字)を指定します。
固定長配列では、宣言を行う際、カッコの中にインデックスの最大値を指定します。
上で宣言した固定長配列のMyFriendsの場合、4つの要素を持ち、0〜3までのインデックス番号で、要素を指定します。
たとえば次の例は、MyFriendsの2番目の要素として「12」という数値を入れるステートメントです。
MyFriends(1) = 12
「MyFriends(3)」という宣言で3つではなく4つの要素数が設定されたり、2番目の要素が1というインデックス番号で表されるのは、図でもわかるように、通常、VBAでは配列のインデックスは1ではなく0から始まるからです。
インデックスの開始値は1のほうがわかりやすい、という場合は、モジュールの宣言セクションに「Option Base 1」という行を入れることで、開始値を1に変更することも可能です。
「Option Base」で指定できるのは0か1だけですが、宣言のときに「Dim MyFriends(3 To 6)」のようにインデックスの開始値と終了値を指定することも可能です。
( )の中にインデックスを1つだけ指定するのは1次元配列ですが、カンマで区切って指定することで、2次元以上の配列を表すこともできます。
次の例では、2行×4列の2次元配列を宣言しています。
Dim MyFriends(1,3) As Long
この配列の2行目・1列目の位置に「15」という数値を入れたい場合は、次のようなステートメントになります。
MyFriends(1,0) = 15
Excelのワークシートは構造的には2次元配列と同じなので、VBAの2次元配列とは親和性が高いといえます。
なお、3次元配列以降は、さらにカンマで各次元の要素数を指定していくことになります。VBAでは、仕様上は60次元までの配列を扱えます。
一方、動的配列は、コードの実行中、Redimステートメントでサイズを設定・変更することができます。
Redim MyGFs(3,3)
この配列変数にすでに何かの値を代入していた場合、Redimステートメントでサイズを変更すると、その値は失われます。
値をなくさずにサイズを変更したい場合は、Preserveキーワードを使用します。
ただし、2次元以上の配列でこのキーワードを使用する場合、変更できるのは最後の次元だけです。
Redim Preserve MyGFs(3,1)