
マクロ 82回
配列を返す関数としてスピリット関数があります。
引数に元の文字列と区切り文字列を指定すると、区切り文字を境目にして、元の文字列を分割し配列として返す関数です。
カンマ区切りのデータがある場合には、そのカンマで分割して配列に格納するといった扱い方ができます。
例えば、CSVデータ、商品情報、住所データ、ログデータなど、
“区切り文字でまとめられた文字列” を扱う際に非常に便利です。
返り値はバリアント型の変数で受け取ります。
(サンプルファイルは、こちらから
マクロ82回サンプルデータ)

1. スピリット関数を使った 配列を作るマクロの例を見てみましょう。
スピリット関数を使って「埼玉支店,千葉支店,小山支店,前橋支店,熊谷支店」 という文字列をカンマを境目に分割します。
その結果をバリアント型の変数支店名 に格納すると支店名は配列として操作できるようになるので、
支店名(0)で1番目に格納した データを表示することができます。
Sub 支店split()
Dim 支店名 As Variant
Dim i As Long
支店名 = Split("埼玉支店,千葉支店,小山支店,前橋支店,熊谷支店", ",")
For i = 0 To UBound(支店名)
Cells(i + 2, 1).Value = 支店名(i)
Next
End Sub

2. 文字列「埼玉支店,千葉支店,小山支店,前橋支店,熊谷支店」をカンマで区切って配列に代入しています。
変数支店名に代入した値を、For文を使いループ処理して、セルA2以降に入力して表示しました。

3. 上記の例では、For文でループする際の
For i = 0 To UBound(支店名)にSplit関数が返す配列の最小要素番号は0と決まっているので0を指定、最大値はUBound(支店名)で調べています。最小要素数を調べるLBound関数を使って書くこともできます。
For i = LBound(支店名) To UBound(支店名)

4.氏名を姓と名にスペースで分ける時にSplit関数を使うことができます。
下図のサンプルでは、
20名の氏名があり、それを姓と名分割します。氏の列は、2列目なので、Cells(i,2)、名の列は3列目なので、Cells(i,3)、としています。

Sub 氏名split()
Dim 氏名 As Variant
Dim i As Long
For i = 2 To 21
氏名 = Split(Cells(i, 1), " ")
Cells(i, 2).Value = 氏名(0)
Cells(i, 3).Value = 氏名(1)
Next
End Sub
5. 実行すると、図のように、姓と名に分けて入力できます。

6. こちらは住所を半角スペースで区切って分割した例です。

Sub 住所split()
Dim 住所 As Variant
Dim i As Long
For i = 2 To 15
住所 = Split(Cells(i, 1), " ")
Cells(i, 2).Value = 住所(0)
Cells(i, 3).Value = 住所(1)
Cells(i, 4).Value = 住所(2)
Cells(i, 5).Value = 住所(3)
Next
End Sub
7. 実行すると、このように分割できます。

8.
