構文
引数 arrayname には、配列の名前を指定します。
引数 dimension は省略可能です。添え字の最大値を調べる配列の次元を指定します。
解説
配列で使用できる最大の添え字を表す整数値を返します。
サンプル
次の例は、指定した配列で使用できる添え字の最大値を表示します。
Sub Sample() Dim a(10) As Variant, b(10, 1 To 5) As Variant, c As Variant c = Array(1, 2, 3) MsgBox UBound(a) MsgBox UBound(b, 2) MsgBox UBound(c) End Sub
所見
UBound関数は、配列の大きさを調べるときに使います。一般的な配列は、宣言時に大きさを指定しますので、大きさを調べる必要はありません。そうではなく、UBound関数で配列の大きさを調べるのは、次のようなケースです。
動的配列とは、マクロ実行中に、大きさを変更できるような配列です。動的配列については、下記のページをご覧ください。
たとえば、次のように使います。
Sub Sample() Dim buf As String, n As Long ReDim Files(0) ''動的配列を宣言します buf = Dir("C:\Windows\*.*") Do While buf <> "" n = UBound(Files) ''現在の大きさ(要素数)を調べます ReDim Preserve Files(n + 1) ''動的配列の大きさを1つ増やします Files(n + 1) = buf ''ファイル名を格納します buf = Dir() Loop MsgBox UBound(Files) - 1 & "個あります" ''動的配列の大きさ(要素数)を調べます End Sub
最後で「UBound(Files) - 1」とマイナス1しているのは、Files(0)を使っていないからです。
動的配列以外にも、UBound関数で配列の大きさを調べることがあります。それは、VBAの「配列を返す」関数やメソッドから、配列を受け取ったときです。
たとえば、Split関数は、文字列を区切り文字で分割した結果を配列で返します。
上図では、元の文字列が「"平沢,秋山,中野"」と分かっていますから、配列の要素数も3つと分かります。しかし、たとえば、CSVファイルから1行分のデータを読み込み、それをSplit関数で分割するようなとき、1行に何個のデータが記述されているか分からないときもあります。そんなときは、Split関数が返す配列の大きさを、UBound関数で調べます。
たとえば、こんな感じです。次のコードは、CSVファイルの各要素を、アクティブシートに読み込みます。
Sub Sample() Dim buf As String, cnt As Long, tmp As Variant, i As Long Open "C:\Sample.csv" For Input As #1 Do Until EOF(1) Line Input #1, buf tmp = Split(buf, ",") cnt = cnt + 1 For i = 0 To UBound(tmp) Cells(cnt, i + 1) = tmp(i) Next i Loop Close #1 End Sub
あるいは、[ファイルを開く]ダイアログボックスを表示する ApplicationオブジェクトのGetOpenFilenameメソッド は、複数選択可能にしたとき、ユーザーが選択したファイルを、配列形式で返します。ユーザーがいくつのファイルを選択したかを調べるときは、GetOpenFilenameメソッドが返す配列の大きさをUBound関数で取得します。
Sub Sample() Dim Files As Variant ChDrive "C" ChDir "C:\Tmp" Files = Application.GetOpenFilename(MultiSelect:=True) If Not IsArray(Files) Then Exit Sub MsgBox UBound(Files) & "個が選択されました" End Sub
このように、UBound関数は、引数に指定した配列の最も大きい要素番号を返します。反対に、最も小さい要素番号を返すのがLBound関数です。これも、覚えておきましょう。
上記のように、Split関数が返す配列は、要素番号0からの配列を返しますが、GetOpenFilenameメソッドが返す配列は、要素番号1からの配列を返します。そうした特徴を熟知していないと、思わぬミスをしてしまいがちです。そんなときは、LBound関数で最小要素数を調べると安全です。