Excel VBAで配列の要素数を取得する:UBound
VBAで配列の要素の数を取得するには、UBound 関数を使用します。
UBound 関数
UBound 関数の構文は以下のとおりです。
UBound(配列名,次元)
第1引数には配列名を指定します。第2引数には要素数を取得したい次元を指定します。第2引数を省略した場合は、1が適用されます。戻り値には取得した要素数が返されます。
以下にマクロ例を示します。
Sub UBoundSample1() Dim A(3, 6) As Variant ' 配列Aを宣言 Debug.Print UBound(A) ' 3 Debug.Print UBound(A, 1) ' 3 Debug.Print UBound(A, 2) ' 6 End Sub
配列 A は1次元目の要素数が3、2次元目の要素数が6の2次元配列です。上のプログラムを実行すると、イミディエイトウィンドウに以下のように表示されます。

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

[実行結果]
さらに、Aも動的配列にし、Endプロパティを使用して配列サイズを取得するようにすれば、セル数が変更されてもコードの変更はまったく必要なくなります。Endプロパティは、選択されたセル範囲の終端を返します。
Sub UBoundSample3()
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
