「vba split 配列かどうか」
「vba split できなかったとき 配列」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスがあることに気づきました。
VBA(Visual Basic for Applications)のSplit関数は、文字列を分解して配列を返します。
このSplit関数の戻りが、本当に配列になっているかどうかを調べる方法を探していたのでしょう。
「vba splitできたか?」
「split できない場合 vba」
といった検索キーワードも、同じことを探していらしたのかもしれません。
Split関数は必ず配列を返す
まず、以下のマクロを実行してみてください。
Trueと表示されたメッセージボックスが表示されるはずです。
Const TXT = "a b c"
Dim arr() As String
arr = Split(TXT)
MsgBox IsArray(arr)
Split関数は第1引数だけが指定された場合、スペースを区切り文字として配列を返します。
上記のマクロの場合、定数・TXTには「a b c」と間にスペースを含んだ文字列が入っているので、
arr = Split(TXT)
という行が実行されると、変数・arrは「a」「b」「c」を要素に持った配列になります。
配列かどうかを調べるIsArray関数は、引数に指定された変数が配列ならTrueを返してきますから、メッセージボックスにTrueが表示されたわけです。
ここまでは、予想どおりの動作です。
つづいて、定数・TXTの「a b c」からスペースを削除して「abc」にしてから、実行してみてください。
Falseが表示されると思った方もいらっしゃるでしょうけれど、今度もメッセージボックスにはTrueが表示されます。
「vba split 配列かどうか」
「vba split できなかったとき 配列」
という検索をなさった方は、このような状態をご覧になったのではないかと推測しています。
Split関数は必ず配列を返す関数で、「abc」をSplitした場合は、「abc」という文字列データの要素を一つだけ持った配列が返されてきます。
そのため定数・TXTが「abc」でも、Trueがメッセージボックスに表示されてしまいます。
Dim arr() As String
と配列変数として宣言されているのだから、当たり前だと感じた方は、是非、
Dim arr As Variant
でも実行してみてください。
LBound関数とUBound関数で要素数を確認する
要素が一つのときは、配列ではないと判定したいのであれば、LBound関数とUBound関数を利用して、配列のインデックス番号の最小値と最大値を比較してみてはいかがでしょう。
Const TXT = "a b c"
Dim arr() As String
arr = Split(TXT)
MsgBox LBound(arr) <> UBound(arr)
上記のマクロをこのまま実行した場合、変数・arrは「a」「b」「c」を要素に持った配列になり、LBound(arr)は「0」、UBound(arr)は「2」ですから、
MsgBox LBound(arr) <> UBound(arr)
の行でTrueが表示されます。
定数・TXTを「abc」にして実行した場合、変数・arrは「abc」というデータの要素を一つだけ持った配列で、LBound(arr)も、UBound(arr)も「0」ですから、
MsgBox LBound(arr) <> UBound(arr)
の行でFalseが表示されます。
ローカルウィンドウで配列変数・arrの中身を見ながら、ご確認ください。
- Newer:10/30(日)9:30~ オブジェクト式解説編を開催しました(女性1・男性2)
- Older:VBAで行挿入を行う
Home » エクセルマクロ・Excel VBAの使い方 » 配列 » Split関数の戻り値が配列かどうか調べる