【VBA】配列の最初のインデックス番号と最後のインデックス番号を取得する方法 (LBound, UBound)

目次

はじめに

VBAで配列を扱う際、その配列にいくつの要素が含まれているのか、またインデックス番号がいくつから始まっているのかを、プログラムの中で正確に知りたい場面がよくあります。特に、Forループで配列の全要素を処理する場合、この情報は不可欠です。

VBAには、配列の最小インデックス最大インデックスを自動的に取得するための、LBound() (Lower Bound) と UBound() (Upper Bound) という2つの便利な関数が用意されています。

この記事では、LBoundUBoundを使って配列の大きさを正確に把握し、その情報を活用して配列の全データを一括でセルに書き出す、実践的なテクニックを解説します。


LBound / UBound を使ったサンプルコード

このマクロは、Array関数で作成した配列の要素数を LBoundUBound を使って算出し、その要素数に合わせてセル範囲のサイズを 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 から始まるため、LBound0 を返します。
  • Dim myArray(1 To 5) のように宣言した配列であれば、1 を返します。

UBound(配列名)

UBound (Upper Bound) 関数は、指定した配列の最大(上限)のインデックス番号を返します。

  • この例では、要素が4つ(インデックス0, 1, 2, 3)なので、UBound3 を返します。

要素数の計算

配列の総要素数は、UBound(配列名) - LBound(配列名) + 1 という計算式で、どんなインデックス範囲の配列でも正確に求めることができます。

ご提示のコードにある UBound(myList) + 1 という方法は、インデックスが 0 から始まることが分かっている場合に使える簡単な計算方法です。

.Resize(1, elementCount).Value = dataItems

これが、算出した要素数を活用している部分です。

  • .Resize(行数, 列数): セル範囲のサイズを変更するメソッドです。
  • Range("B2").Resize(1, elementCount) は、「B2セルを基準に、1行・elementCount(この例では4)列の範囲」という意味になります。
  • このように、配列の大きさに合わせて動的にセル範囲のサイズを調整し、そこに配列の全データを一括で代入しています。これにより、配列の要素数が将来変わっても、コードを修正する必要がなくなります。

まとめ

今回は、VBAの LBoundUBound 関数を使って、配列のインデックス範囲と要素数を正確に取得する方法を解説しました。

  • LBound(): 配列の最初のインデックス番号を取得する。
  • UBound(): 配列の最後のインデックス番号を取得する。
  • UBound - LBound + 1: 配列の総要素数を計算する。

これらの関数は、配列を扱うあらゆる場面、特にループ処理やセルへの書き出しにおいて、コードを柔軟で堅牢にするための必須のテクニックです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次