Excel VBAで配列の要素数を取得する:UBound

VBAで配列の要素の数を取得するには、UBound 関数を使用します。

UBound 関数

UBound 関数の構文は以下のとおりです。

UBound(配列名,次元)

第1引数には配列名を指定します。第2引数には要素数を取得したい次元を指定します。第2引数を省略した場合は、1が適用されます。戻り値には取得した要素数が返されます。

以下にマクロ例を示します。

Dim A(3, 6) As Variant   ' 配列Aを宣言

Debug.Print UBound(A)     ' 3
Debug.Print UBound(A, 1)  ' 3
Debug.Print UBound(A, 2)  ' 6

配列 A は1次元目の要素数が3、2次元目の要素数が6の2次元配列です。上のプログラムを実行すると、イミディエイトウィンドウに以下のように表示されます。

Ary6

使用例

UBound関数は、配列のサイズをあらかじめ決められないような場合、威力を発揮します。下記は、セル値を配列Aに代入し、指定した行番R(下記例では1)の要素を配列Bに代入するものです。配列Bを動的配列(要素数が決まっていない配列)にし、UBound関数でサイズを決めてやります。それによって、Aの要素数が変わっても宣言部(Dim)を変更するだけでよく、それ以外のコードは変更せずに済みます。

[シートの状態]Ary7[コード]

Sub UBoundSample2()

    Dim A(1 To 3, 1 To 3) As Variant, B() As Variant
    Dim i As Long, j As Long
    Dim R As Long '抜き取り行

    R = 1 '抜き取る行番

'↓ここから下は要素数が変わってもコード変更必要なし
'値代入
    For i = 1 To UBound(A, 1)
        For j = 1 To UBound(A, 2)
            A(i, j) = Cells(i, j).Value
        Next j
    Next i

'配列AのR行目をBへ書き込み
    ReDim B(1 To UBound(A, 1)) '配列Aの第1次元要素数をBへ設定
    For j = 1 To UBound(B)
        B(j) = A(R, j)
    Next j 

End Sub

For~Nextでセルの値を配列Aに書き込みました。Redimは中身が空だった配列Bの再定義をしています。

[実行結果]Ary8

さらに、Aも動的配列にし、Endプロパティを使用して配列サイズを取得するようにすれば、セル数が変更されてもコードの変更はまったく必要なくなります。Endプロパティは、選択されたセル範囲の終端を返します。

Dim A() As Variant, B() As Variant
Dim i As Long, j As Long
Dim R As Long '抜き取り行

R = 1 '抜き取る行番

'配列Aのサイズ定義(Endプロパティ使用)
ReDim A(1 To Cells(Rows.Count, 1).End(xlUp).Row, _
            1 To Cells(1, Columns.Count).End(xlToLeft).Column)
'値代入
For i = 1 To UBound(A, 1)
    For j = 1 To UBound(A, 2)
        A(i, j) = Cells(i, j).Value
    Next j
Next i

'抜き取り
ReDim B(1 To UBound(A, 1)) '配列Aの要素数をBにも設定
For j = 1 To UBound(B)
    B(j) = A(R, j)
Next j

End Sub

購読

平日・毎朝更新中