HOME > 即効テクニック > Excel VBA > ファイル操作関連のテクニック > 固定長データをSplit関数で区切る

即効テクニック

ファイル操作関連のテクニック

固定長データをSplit関数で区切る

(Excel 2000/2002/2003/2007)
Excelで操作するデータがテキスト形式で提供されることは、よくあるケースです。
テキスト形式のデータとして多いのは「CSV形式」でしょうか。

1001,大久保,2008/9/1,3690,商品A
1002,山田,2008/10/25,105000,商品B-1
 :

のように、各データがカンマで区切られているのがCSV形式です。
これをExcelのシートに取り込むには、次のようにします。

Sub Sample1()
    Dim buf As String, cnt As Long
    Open "C:\Sample.csv" For Input As #1
        Do Until EOF(1)
            Line Input #1, buf
            cnt = cnt + 1
            Cells(cnt, 1).Resize(1, 5) = Split(buf, ",")
        Loop
    Close #1
End Sub
Split(buf, ",") は、変数bufに格納されている1行分のデータから、各要素をカンマで区切った配列として返します。 さて、CSV形式のように、要素が何かで区切られた形式であれば簡単ですが、固定長形式のデータだった場合はどうでしょう。 固定長データとは、 1001 大久保 2008/9/1 3690 商品A 1002 山田 2008/10/25 105000 商品B-1  : のように、各要素の文字数(バイト数)があらかじめ決められていて、その文字数に満たない部分にスペースが埋められているような形式です。 もちろん、あらかじめ各要素の文字数はわかっているでしょうから、Mid関数などを使って、区切る位置と文字数を指定すれば分割は可能です。 しかし、位置や文字数を正確に指定しなければなりませんし、各要素の文字数が変更になると、すべてを修正しなければなりません。 何か簡単に取り込む方法はないのでしょうか。 固定長データの場合、各要素はスペースで区切られています。 しかし、文字数によってスペースの数が変化します。これが悩みの種です。 であれば、スペースの数を統一してしまいましょう。 各要素が「1つのスペース」で区切られているのなら、先のSplit関数を使えます。 そこで、すべての「2つのスペース」を「1つのスペース」に置換します。
Sub Sample2()
    Dim buf As String, cnt As Long
    Open "C:\Sample.dat" For Input As #1
        Do Until EOF(1)
            Line Input #1, buf
            Do While InStr(buf, "  ") > 0
                buf = Replace(buf, "  ", " ")
            Loop
            buf = Trim(buf)
            cnt = cnt + 1
            Cells(cnt, 1).Resize(1, 5) = Split(buf, " ")
        Loop
    Close #1
End Sub
「2つのスペース」を「1つのスペース」に置換しているのが
buf = Replace(buf, "  ", " ")
です。 この作業を「2つのスペース」がなくなるまで繰り返します。
Do While InStr(buf, "  ") > 0
最後に、データの先頭と末尾に残った余分なスペースを
buf = Trim(buf)
と、Trim関数で取り除いています。 最後のSplit関数で、区切り文字にスペース(" ")を指定している点に留意してください。