wrote :: 2005.12.12

トップページ > Excel > VBA > Split関数で文字列を区切る

Split関数で文字列を区切る

ここ最近、私が最もよく使うVBAコマンドのひとつはSplit関数です。特に、テキストファイルやHTMLソースなど外部のファイルを編集・加工するときには必須の関数です。今回はSplit関数を例にして、任意の文字列を区切るテクニックをご紹介します。

Split関数は、ある要素で区切られた文字列を、その要素で区切り、区切られた各文字列を、一次元配列として返します。言葉で表すとややこしいですが、要するに次のような処理をしてくれます。



「123,田中,toru」のように、データが「,」で区切られた文字列があったとします。この文字列をSplit関数は、「123」「田中」「toru」という3つの要素を持つ配列に変換してくれます。CSVファイルのデータを扱うときなどに便利ですね。
Split関数の返り値は「任意の要素を持つ一次元配列」です。あらかじめ要素の数が明らかなときは、それを受け取る配列変数を用意しておけばいいのですが、一般的にはいくつの要素が返るかわかりません。そんなときは、Split関数の返り値(配列)をバリアント型変数で受け取ります。バリアント型変数に配列を格納すると、変数を配列として操作できるようになります。

Sub Sample()
    Dim buf As String, tmp, i As Long
    buf = "123,田中,toru"
    tmp = Split(buf, ",")
    For i = 0 To UBound(tmp)
        MsgBox tmp(i)
    Next i
End Sub

  

非常に短いこのコードには、いくつかのポイントがあります。まず、Split関数の返り値を受け取る変数tmpが、型宣言されていない点に留意してください。これは変数tmpをバリアント型で宣言しているのと同じことです。
変数tmpに格納された配列の各要素をFor Nextステートメントで順番に取り出しています。このとき、配列の先頭はtmp(0)から始まります。tmp(1)ではありませんので注意が必要です。
変数tmp内にいくつの要素が含まれているかはUBound関数で知ることができます。上記のサンプルでは、Ubound関数が「2」を返します。

今度は次のようなデータで考えてみましょう。

名前:田中	住所:横浜市	年齢:42	金額:1,234
名前:森	住所:我孫子市	年齢:38	金額:567
名前:日下部	住所:港区	年齢:41	金額:8,901

テキストファイル(C:\sample.txtとします)に上のようなデータが記録されています。空白に見える部分は、実際にはタブで区切られています。また、各要素は「名前:田中」のようにタイトルとデータが「:」で区切られています。このテキストファイルを読み込み、ワークシートに展開するサンプルを紹介します。

Sub Sample2()
    Dim buf As String, tmp, tmp2, i As Long, cnt As Long
    Open "C:\sample.txt" For Input As #1
        Do Until EOF(1)
            Line Input #1, buf
            cnt = cnt + 1
            tmp = Split(buf, Chr(9))            ''1行の文字列をタブで区切る
            For i = 0 To UBound(tmp)
                tmp2 = Split(tmp(i), ":")       ''各要素を「:」で区切る
                Cells(cnt, i + 1) = tmp2(1)
            Next i
        Loop
    Close #1
End Sub

実行結果は次の通りです。



ここではSplit関数を2回使っています。

1回目:1行分の文字列をタブで区切る
2回目:各要素を「:」で区切る

タブ記号はChr関数を使って、Chr(9)を指定します。
2回目のSplit関数で区切られた配列tmp2では、tmp2(0)に「名前」などのタイトルが入り、tmp2(1)に「田中」などのデータが格納されます。





[目次]に戻る