読者です 読者をやめる 読者になる 読者になる

配列関係の覚書

Split関数(VBA)など配列回りの覚書

Split関数

Split関数は、


Split(文字列, デリミタ)

とすれば、第1引数の文字列を、第2引数のデリミタで区切った文字列を配列にして返してくれるとっても便利な関数。

んで、めちゃくちゃ基本的なことなんだが、

配列であるからには添え字は0スタート

なんである。

ところが、素人の悲しさ。こういう当たり前のことがしばしばあやふやになるw

というわけで、覚書として残しておこう。

Split関数の使用例

リスト1
Public Sub testHage1()
  Dim hageArray As Variant    '……(1)'
  hageArray = Split("ち~んw,ウホッw,ウマーw,アヒャw", ",")    '……(2)'
  Debug.Print LBound(hageArray)    '……(3)'
  Debug.Print UBound(hageArray)    '……(4)'
  Dim i As Integer
  For i = LBound(hageArray) To UBound(hageArray)    '……(5)'
    Debug.Print hageArray(i)
  Next
End Sub

(1)の

Dim hageArray As Variant

は、Split関数の返り値(配列)を受け取るための変数。配列の要素数が分からないのでVariant型にしている。

(2)の

hageArray = Split("ち~んw,ウホッw,ウマーw,アヒャw", ",")

で、Splitを実行。返り値を変数hageArray(なんちゅう名前や……)にセットしている。

(3)、(4)の

Debug.Print LBound(hageArray)
Debug.Print UBound(hageArray)

で、LBound及びUBound関数を使って最小の添え字と最大の添え字をイミディエイトに表示するようにしている。

(5)の

For i = LBound(hageArray) To UBound(hageArray)
  Debug.Print hageArray(i)
Next

では、Forループを使って配列hageArrayの全ての要素をイミディエイトに表示するようにしている。

実行結果

f:id:akashi_keirin:20170423110156j:plain

この通り、配列の添え字は「0」~「3」ですね。当たり前だけど。

Variant型の使用を避ける

Variant型が嫌いです。なんか、すっげえ雑な対応のような気がするのです。

そこで、考えた。

Split関数の返り値をUBoundに突っ込んでその数でReDimすりゃいいんじゃね?

と。

で、やってみた。

スト2
Public Sub testHage2()
  Dim hageArray() As String    '……(1)'
  ReDim hageArray(UBound(Split("ち~んw,ウホッw,ウマーw,アヒャw", ",")))    '……(2)'
  hageArray() = Split("ち~んw,ウホッw,ウマーw,アヒャw", ",")    '……(3)'
  Debug.Print LBound(hageArray)
  Debug.Print UBound(hageArray)
  Dim i As Integer
  For i = LBound(hageArray) To UBound(hageArray)
    Debug.Print hageArray(i)
  Next
End Sub

(1)では、リスト1と異なり、

Dim hageArray() As String

String型の配列として正々堂々と(?)変数を宣言。

(2)では、

ReDim hageArray(UBound(Split("ち~んw,ウホッw,ウマーw,アヒャw", ",")))

Split関数の返り値をUBound関数の引数にぶち込んで配列変数hageArray()をReDim。

んで、(3)の

hageArray() = Split("ち~んw,ウホッw,ウマーw,アヒャw", ",")

で配列hageArrayに要素をぶち込んでいる。

実行結果

f:id:akashi_keirin:20170423110156j:plain

ほれ、同じ結果になった。

・・・・・・

でもねえ・・・・・・。

なんて無駄なコードなんだ!!!!!!!!

まとめと感想

まとめ
  • Split関数でできた配列の添え字は、「0」~「要素数-1」です
  • LBound関数の返り値は、配列の添え字の最小値です
  • UBound関数の返り値は、配列の添え字の最大値です
  • 配列用の変数をReDimするときは、添え字の最大値で行いましょう
感想

まだまだ分かっていないことが多いなあ。

@akashi_keirin on Twitter