ここでは配列を操作するときの関数を学びます。
LBound関数、UBound関数
配列のインデックス番号(要素数)を得ます。
静的配列、すなわちインデックス番号を指定して宣言した場合にはあまり意味がありませんが、動的配列を使用するときのように、要素数が配列の宣言時には決まっていないようなときに、真価を発揮します。
例では、セルA1に入力された数値の数だけ、B列に連番を振ります。つまり、セルA1に10と入力されていれば、B1~B10ぞれぞれのセルに1~10が入力されます。
Private Sub CommandButton1_Click()
Dim tmp() As String
ReDim tmp(Range("A1").Value)
For i = 1 To UBound(tmp)
Cells(i, 2).Value = i
Next
End Sub
一行ずつ説明します。
Dim tmp() As String
配列tmpを宣言しています。インデックス番号は指定していないので、動的配列です。
ReDim tmp(Range("A1").Value)
Redimを用いると、配列のインデックス番号を途中で変更できます。セルA1に入力された値がその引数となります。10と入力されれば、tmp(10)と宣言したのと同じことです。
For i = 1 To UBound(tmp)
ここでUBound関数が出てきます。
<書式>
UBound(配列)
”U”はUpperのUです。引数である配列の、大きい方の要素数を得ます。
よって、ここでは1からセルA1に入力された値だけ繰り返す、という意味になります。
Cells(i, 2).Value = i
セルB1の値を、ループした回数の数にします。一回目のループなら「Cells(1,2).Value = 1」、二回目なら「Cells(2,2).Value = 2」となります。
Next
For文の終わりです。
Split関数
指定した”区切り文字”で、文字列を分割し、それぞれの要素を配列の要素として格納します。
セルA1に入力されたホームページアドレスから、HTMLファイルの名前を抜き出して見ましょう。
つまり、このページなら、アドレスは「www37.atwiki.jp/officewiki/editx/42.html」です。この文字列をセルA1に入力し、その最後の”42.html”を抜き出します。
こうなるでしょう。
Private Sub CommandButton1_Click()
arrUrl = Split(Range("A1").Value, "/")
MsgBox url(UBound(arrUrl))
End Sub
一行ずつ説明します。
arrUrl = Split(Range("A1").Value, "/")
変数arrUrlに、Split関数の出力を代入しています。
Split関数の書式は
Split(文字列,"区切り文字")
です。
セルA1には「http://www37.atwiki.jp/officewiki/editx/42.html」と入力されています。これを”/”を区切り文字として、一個一個抜き出します。つまり、配列arrUrlには
arrUrl(0) = http:
arrUrl(1) =
arrUrl(2) = www37.atwiki.jp
arrUrl(3) = officewiki
arrUrl(4) = pages
arrUrl(5) = 42.html
と入ります。配列のインデックス番号の最初の数字は0です。二番目が空欄なのは、「http://」と、/が2個連続しているためです。
MsgBox arrUrl(UBound(arrUrl))
HTMLファイル名は、アドレスの最後の/の次の文字列です。よって、配列の最大のインデックス番号がわかれば、出力できます。UBound関数は、指定した配列の要素数の最大値を求めます。配列arrUrlのインデックス番号の最大値は5です。よって、これは「arrUrl(5)」と指定したのと同じことです。
結果的に、「42.html」とメッセージボックスに表示されます。
例1だと、すべての要素がわかりませんので、それを抜き出して、セルに表示しましょう。
Private Sub CommandButton1_Click()
arrurl = Split(Range("A1").Value, "/")
For i = 0 To UBound(arrurl)
Cells(i + 1, 7).Value = arrurl(i)
Next
End Sub
一行ずつ説明します。
arrurl = Split(Range("A1").Value, "/")
セルA1の値を”/”を区切り文字として分割し、配列arrUrlに格納します。
ここは例1と同じです。
For i = 0 To UBound(arrurl)
UBound関数を用いて、配列arrUrlのインデックス番号の最大値を抜き出します。
よって、このFor文は、0~5回繰り返すことになります。
Cells(i + 1, 7).Value = arrurl(i)
ワークシートのG1~G6それぞれに、分割して格納した要素を書き出します。「Cells(i +1,7)と、行番号に1を足しているのは、配列のインデックス番号はデフォルトでは0から始めるからです。1を足しておかないとセルG0という、存在しないセル番地を指定したことになりエラーになります。
Next
For文の終端です。