【Lbound,Ubound関数】配列要素数の取得から、意外な使い方まで

Uncategorized

配列は処理を行い、最終的にセルにデータを転記したり、何かの返り値を取得することを目的とします。配列のサイズは常に一定ということは無く、行いたい処理の都度、サイズは変わるものです。例えば、配列のデータをセルに転記する場合は、セルの範囲と配列のサイズを一致させるのに、その都度コードを書き換えるのは実務的ではありません。

ここでは、そんな困ったことを便利にする方法を解説します!

Lbound関数(最小のインデックス番号の取得)

Lbound関数では、配列のインデックス番号の最小値を返します。

構文:Lbound(配列,次元数)

次元数は省略可能で、省略した場合は「1」を指定したものとされます。

Sub Lbound関数()
    Dim MyArray(10) As Variant
    MsgBox LBound(MyArray)
End Sub

実行結果

OptionBaseを設定していなかったので、配列の最小値のインデックス番号「0」を取得できました。

多次元配列の場合

今度は、多次元配列の場合を考えます。

第二引数には次元数を指定できます。次のコードは、二次元のインデックス番号の最小値を取得出来ます。

Sub Lboundサンプル()
    Dim MyArray(0 To 3, 2 To 10) As Variant
    MsgBox LBound(MyArray, 2)'二次元目を指定した
End Sub

結果

Ubound関数(最大のインデックス番号の取得)


Sub Ubound関数()
    Dim MyArray(10) As Variant
    MsgBox UBound(MyArray)
End Sub

実行結果

多次元配列の場合

考え方はLbound関数と全く同じです。第二引数に取得したい次元数を指定します。

Sub Uboundサンプル()
    Dim MyArray(0 To 3, 2 To 10) As Variant
    MsgBox UBound(MyArray, 2)'二次元のインデックス番号の最大値を取得する
End Sub

結果

インデックス番号が1から始まる場合であれば、Uboundの戻り値がそのまま要素数になるので、Ubound関数で要素数が確定できます。

しかし、インデックス番号が0から始まる場合は、カッコの中の数値+1が要素数になるため、Ubound関数だけでは要素数が確定できません。

そこで、Lbound関数とUbound関数を組み合わせることで、OptionBaseの設定に関係なく、常に配列の要素数を返す方法を考える必要があります。

LboundとUboundの組み合わせで、常に要素数を取得する

配列の要素数をUbound関数で取得できるのは、インデックス番号が1から始まる場合だけです。

例えば「セル範囲=配列」として二次元配列を使う場合は、インデックス番号がOptionBaseに無関係に1から始まる仕様のため、「私はOptionBaseをいじらない」とルール付けをしていても、意図せずエラーが発生することになります。

そこで、次のコードの登場です。

Sub OptionBase0()
    Dim MyArray(0 To 10) As Variant
    MsgBox UBound(MyArray) - LBound(MyArray) + 1
End Sub

実行結果

Sub OptionBase1()
    Dim MyArray(1 To 10) As Variant
    MsgBox UBound(MyArray) - LBound(MyArray) + 1
End Sub

実行結果

インデックス番号が0からでも、1からでも、要素数が正確に取得できています。

配列からセル範囲に転記するとき便利になる

出力先のセル範囲を指定するとき、「Range(”A1:B10”)」のように指定するコードを書くと、配列のサイズが変わった場合、セル範囲も変更しなくてはならないため、コーディングが非効率です。

そこで、Resizeの引数にLbound関数、Ubound関数を使うことで、コードの変更の必要がなくなります。

Split関数と組み合わせて、特定の文字が何個含まれるか取得する

Split関数は、第2引数で区切った配列を返す関数です。Split関数の戻り値にUboundを使うことで、区切り文字が何個文字列に入っていたか、判定することが出来ます。

Sub Splitサンプル()
    Dim MyString As String
    MyString = "山田,鈴木,加藤,山田"
    MsgBox UBound(Split(MyString, "山田"))
End Sub

実行結果(「山田」は2件であることが確認できました)

コメント

タイトルとURLをコピーしました