はじめに
VBAで配列を扱う際、その配列にいくつの要素が含まれているのか、またインデックス番号がいくつから始まっているのかを、プログラムの中で正確に知りたい場面がよくあります。特に、For
ループで配列の全要素を処理する場合、この情報は不可欠です。
VBAには、配列の最小インデックスと最大インデックスを自動的に取得するための、LBound()
(Lower Bound) と UBound()
(Upper Bound) という2つの便利な関数が用意されています。
この記事では、LBound
とUBound
を使って配列の大きさを正確に把握し、その情報を活用して配列の全データを一括でセルに書き出す、実践的なテクニックを解説します。
LBound
/ UBound
を使ったサンプルコード
このマクロは、Array
関数で作成した配列の要素数を LBound
と UBound
を使って算出し、その要素数に合わせてセル範囲のサイズを Resize
してから、配列の全データを一括で書き出します。
完成コード
' LBoundとUBoundで配列の大きさを調べてセルに書き出す
Sub CheckArrayBounds()
'== 配列を準備 ==
Dim dataItems As Variant
dataItems = Array("商品A", "商品B", "商品C", "商品D")
'== 配列のインデックスと要素数を調べる ==
Dim firstIndex As Long
Dim lastIndex As Long
Dim elementCount As Long
' LBound関数で最初のインデックス番号を取得
firstIndex = LBound(dataItems) ' Array関数なので 0 が返る
' UBound関数で最後のインデックス番号を取得
lastIndex = UBound(dataItems) ' 要素が4つなので 3 が返る
' 全要素数を計算 (最後のインデックス - 最初のインデックス + 1)
elementCount = lastIndex - firstIndex + 1 ' 3 - 0 + 1 = 4
'== 結果をメッセージボックスに表示 ==
MsgBox "最初のインデックス: " & firstIndex & vbCrLf & _
"最後のインデックス: " & lastIndex & vbCrLf & _
"要素数: " & elementCount, vbInformation, "配列の情報"
'== 計算した要素数を使って、配列の全データをセルに一括転記 ==
' B2セルを基準に、1行・elementCount列のサイズに変更して値を代入
Worksheets("Sheet1").Range("B2").Resize(1, elementCount).Value = dataItems
End Sub
コードの解説
LBound(配列名)
LBound
(Lower Bound) 関数は、指定した配列の最小(下限)のインデックス番号を返します。
Array
関数で作成した配列の場合、インデックスは0
から始まるため、LBound
は0
を返します。Dim myArray(1 To 5)
のように宣言した配列であれば、1
を返します。
UBound(配列名)
UBound
(Upper Bound) 関数は、指定した配列の最大(上限)のインデックス番号を返します。
- この例では、要素が4つ(インデックス
0
,1
,2
,3
)なので、UBound
は3
を返します。
要素数の計算
配列の総要素数は、UBound(配列名) - LBound(配列名) + 1
という計算式で、どんなインデックス範囲の配列でも正確に求めることができます。
ご提示のコードにある UBound(myList) + 1
という方法は、インデックスが 0
から始まることが分かっている場合に使える簡単な計算方法です。
.Resize(1, elementCount).Value = dataItems
これが、算出した要素数を活用している部分です。
.Resize(行数, 列数)
: セル範囲のサイズを変更するメソッドです。Range("B2").Resize(1, elementCount)
は、「B2セルを基準に、1行・elementCount
(この例では4)列の範囲」という意味になります。- このように、配列の大きさに合わせて動的にセル範囲のサイズを調整し、そこに配列の全データを一括で代入しています。これにより、配列の要素数が将来変わっても、コードを修正する必要がなくなります。
まとめ
今回は、VBAの LBound
と UBound
関数を使って、配列のインデックス範囲と要素数を正確に取得する方法を解説しました。
LBound()
: 配列の最初のインデックス番号を取得する。UBound()
: 配列の最後のインデックス番号を取得する。UBound - LBound + 1
: 配列の総要素数を計算する。
これらの関数は、配列を扱うあらゆる場面、特にループ処理やセルへの書き出しにおいて、コードを柔軟で堅牢にするための必須のテクニックです。