配列は処理を行い、最終的にセルにデータを転記したり、何かの返り値を取得することを目的とします。配列のサイズは常に一定ということは無く、行いたい処理の都度、サイズは変わるものです。例えば、配列のデータをセルに転記する場合は、セルの範囲と配列のサイズを一致させるのに、その都度コードを書き換えるのは実務的ではありません。
ここでは、そんな困ったことを便利にする方法を解説します!
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件であることが確認できました)
コメント