
動画でExcel 配列を扱うための必須の知識、 LBound、UBound、OptionBase
このページは、動画版「マクロ講座 102回:配列を扱うための必須の知識」の解説記事です。
Excel VBA では、データをまとめて扱うために配列を使うことがとても重要です。配列を正しく理解できると、コード量が大幅に減り、処理速度も向上します。
ここでは、配列を扱う上で必ず知っておくべき基礎知識として、次の3つを解説します。
(サンプルファイルは、こちらです。 配列を扱うための必須の知識、LBound、UBound、OptionBase、サンプル102回)
配列を宣言するとき、次のように書くとします。 Dim brancharr(9) As Variant
この配列は「10 個」の要素を持っています。 なぜなら VBA の配列は基本的に **0 から始まる** からです。
最小インデックス → 0
最大インデックス → 9
要素数 → 10
このように理解すると、配列の仕組みが見えてきます。

次のように書けば、コードは一気に短くなります。
Dim brancharr(9) As Variant
Dim r As Long
For r = 0 To 9
brancharr(r) = Cells(r + 1, 1).Value
Next r

配列のインデックスを「1 から始めたい」場合は次の2つの方法があります。
① Option Base 1 を使う
モジュールの先頭に次の 1 行を書きます。
Option Base 1
すると、
Dim brancharr(9)
は 1~9 の配列になります。

To を使って宣言する
もう一つの方法は、配列変数の宣言時に、かっこの中のインデックスを1 to 10のように、明示的に1から始まると書く方法です。
Dim brancharr(1 To 10) As Variant
これは Option Base の設定に関係なく、必ず 1 始まり になります。

Split 関数は Option Base の影響を受けません。
Split関数を使用して配列を作成する場合、Option Baseステートメントはインデックスの番号付けに影響を与えず、常に0から始まります。

Sub oneDimension()
Dim brancharr(9) As Variant
Dim r As Long
For r = 0 To 9
brancharr(r) = Cells(r + 1, 1).Value
Next r
End Sub
LBound関数とUBound関数を使用すると、
配列の最小インデックスと最大インデックス安全に取得できます。
配列の範囲を自動で判断してくれるので、数字を手書きする必要がありません。
LBound(arrayname, dimension)は最小インデックスを返し、UBound(arrayname)は最大インデックスを返します。

For 文をすべて LBound / UBound に置き換える
For r = LBound(brancharr) To UBound(brancharr)
Debug.Print brancharr(r)
Next r
インデックスの最小値0は、LBound(brancharr,1)に書き換えることができます。
同様にインデックスの最大値9は、UBound(brancharr,1)に書き換えることができます。dimension次元を省略すると、1次元とみなされます。

シートから1次元配列を取得するマクロを実行しましょう。 マクロをステップ実行すると、配列の「今どんな値が入っているか」をローカルウィンドウで確認できます。 これは配列を扱うときに非常に役立つツールです。

配列を使いたい時には通常、Dim brancharr(9) As Variantのように宣言します。
しかし、配列を宣言するときに「要素数が分からない」というケースはよくあります。 その場合は、まずデータ件数を調べ、その数だけ配列を作ります。
そのために、動的配列があります。宣言時は、要素数を指定しないで宣言することができます。
Dim brancharr() As Variant
シートから取得する場合は、要素数となるデータがいくつあるか、行数を数えればいいのです。

変数にmaxubというLong型を宣言しました。これはインデックスの最大値を取得するための変数です。
maxub = Range("A1", Range("A1").End(xlDown)).Cells.Count
Range("A1")から、データのある最終行までのセルをカウントします。

Sub oneDimension_ubcount()
Dim brancharr() As Variant
Dim r As Long, maxub As Long
maxub = Range("A1", Range("A1").End(xlDown)).Cells.Count
ReDim brancharr(1 To maxub)
' For r = LBound(brancharr) To UBound(brancharr)
For r = 1 To maxub
brancharr(r) = Cells(r, 1).Value
Next r
End Sub
最初の宣言時には、brancharr()は要素数が決まっていませんでしたが、 maxub でセルの個数が分かりましたから、当然配列のサイズも決まります。
ReDimステートメント を使って配列のサイズを宣言します。
サイズを宣言したことにより、LBound関数とUBound関数が使えるようになりました。
ReDim brancharr(1 To maxub)
このようにデータをシートから取得する場合は、データの数を求めることで配列のサイズを調べることができます。
配列を使いこなすことは、VBA のスキルアップに直結します。 特に LBound / UBound や動的配列の考え方は、実務で配列を扱う際に欠かせません。
これらを理解すると、配列を使った処理がぐっと楽になります。ぜひ動画と合わせて学習してみてください。