【VBAスタンダード対策】Split関数と配列ループの構造を攻略!
文字列を特定の文字で切り分ける Split 関数。この関数が生成する配列には、独自の構造ルールがあります。上限と下限を関数で動的に取得する、安全なループ処理の書き方をマスターしましょう。
1. 問題:Split関数が生成する配列のループ処理
【 問題 】 カンマ区切りの文字列を Split 関数で分割し、その全要素をメッセージボックスで表示したい。空欄 ( A ) に入る最も適切なコードはどれでしょうか?
Sub Sample()
Dim buf As String
Dim myAry As Variant
Dim i As Long
buf = "VBA,Standard,Exam"
myAry = Split(buf, ",")
For i = ( A )
MsgBox myAry(i)
Next i
End Sub
Dim buf As String
Dim myAry As Variant
Dim i As Long
buf = "VBA,Standard,Exam"
myAry = Split(buf, ",")
For i = ( A )
MsgBox myAry(i)
Next i
End Sub
① 1 To 3
② 0 To 2
③ LBound(myAry) To UBound(myAry)
④ 1 To UBound(myAry)
2. 正解:配列の境界を取得する関数に関する正解
正解: ③ LBound(myAry) To UBound(myAry)
3. 解説:Split関数の「絶対ルール」と動的処理
Split 関数を使用する際、実務や試験で絶対に外せない構造的ポイントが2つあります。
[ Split関数の構造的特徴 ]
1. 下限(LBound)は必ず「0」
たとえ
2. 要素数はデータによって変わる
分割元が "A,B,C" なら上限は 2、"A,B" なら上限は 1 になります。上限を「3」などの定数で固定すると、データが少ない時に「インデックスが範囲外です」というエラーを招きます。
★ 理系NEOな解決策:
・
・
このペアを使うことで、データの個数が変わっても**構造的にエラーが出ないループ**が完成します。
1. 下限(LBound)は必ず「0」
たとえ
Option Base 1 を設定していても、Split 関数が作る配列の下限は強制的に 0 になります。そのため、開始を 1 にしてしまうと最初の要素(VBA)を読み飛ばすことになります。2. 要素数はデータによって変わる
分割元が "A,B,C" なら上限は 2、"A,B" なら上限は 1 になります。上限を「3」などの定数で固定すると、データが少ない時に「インデックスが範囲外です」というエラーを招きます。
★ 理系NEOな解決策:
・
LBound(配列):最小の添字(Splitなら常に0)を返す・
UBound(配列):最大の添字を返すこのペアを使うことで、データの個数が変わっても**構造的にエラーが出ないループ**が完成します。
1. ここが試験に出る!: スタンダード試験では、Split の戻り値を受け取る変数が Variant 型、または String()(動的配列)であること、そしてループの開始が 0(またはLBound)になっているかどうかが厳しくチェックされます。
2. エンジニアの視点: Java 17などの `String.split()` は配列オブジェクトを返しますが、VBAの Split も同様に「メモリ上に一時的な配列構造」を構築します。個数を数える `Count` プロパティが存在しないため、UBound を使うのがVBA流のサイズ確認構造です。
4. まとめ
「Splitの出口は常に0から。サイズはUBoundに聞く」。この構造を徹底すれば、どんなに長いCSVデータが来ても、一文字たりとも漏らさず処理できます。データの「始まり」と「終わり」を関数に判定させる柔軟なコードこそ、堅牢なマクロの基盤となるのです。
PR