UBound


構文

引数 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関数です。これも、覚えておきましょう。

LBound関数

上記のように、Split関数が返す配列は、要素番号0からの配列を返しますが、GetOpenFilenameメソッドが返す配列は、要素番号1からの配列を返します。そうした特徴を熟知していないと、思わぬミスをしてしまいがちです。そんなときは、LBound関数で最小要素数を調べると安全です。