VBAで配列の要素の数を取得するには、UBound 関数を使用します。
UBound 関数
UBound 関数の構文は以下のとおりです。
1 |
UBound(配列名,次元) |
第1引数には配列名を指定します。第2引数には要素数を取得したい次元を指定します。第2引数を省略した場合は、1が適用されます。戻り値には取得した要素数が返されます。
以下にマクロ例を示します。
1 2 3 4 5 6 7 8 |
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)を変更するだけでよく、それ以外のコードは変更せずに済みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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プロパティは、選択されたセル範囲の終端を返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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 |