PeaceJetのブログ

金融系の社内エンジニアをやりながら、マーケティングやデータ分析などもやっています。

UBound関数について【エクセルマクロ・VB・VBA】

配列の要素を調べるために、UBound関数を使用しますが、

返される値には注意が必要だったりします。

公式ドキュメントには、次のように書かれています。
https://msdn.microsoft.com/ja-jp/library/95b8f22f%28v=vs.90%29.aspx

戻り値

Integer 型の値です。指定した次元で使用できる添え字の最大値です。Array に要素が 1 つしかない場合、UBound は 0 を返します。要素が長さゼロの文字列である場合など、Array に要素がない場合、UBound は -1 を返します。

確認してみましょう。

Sub CheckUBound()
    
    Dim Array1, Array2, Array3, Array4 As Variant
    
    Array1 = Split("", ",")
    Array2 = Split("foo", ",")
    Array3 = Split("foo,bar", ",")
    Array4 = Split("foo,bar,hoge", ",")

    Debug.Print UBound(Array1) '-1
    Debug.Print UBound(Array2) '0
    Debug.Print UBound(Array3) '1
    Debug.Print UBound(Array4) '2

End Sub

以上のような結果となります。

コツは、”最大の添え字”が返されるということがポイントです。

可変長配列を使用する際に

ReDim Array(0)

などと宣言している場合、添字である 0 が返されます。


以下、まとめです。

Sub CheckUBound()
    
    Dim Array1, Array2, Array3, Array4 As Variant
    ReDim Array5(0)
    
    Array1 = Split("", ",")
    Array2 = Split("foo", ",")
    Array3 = Split("foo,bar", ",")
    Array4 = Split("foo,bar,hoge", ",")
    
    'コメントアウトされている数字が、返される値です。
    Debug.Print UBound(Array1) '-1
    Debug.Print UBound(Array2) '0
    Debug.Print UBound(Array3) '1
    Debug.Print UBound(Array4) '2
    
    Debug.Print UBound(Array5) '0

End Sub