即効テクニック |
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 SubSplit(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関数で、区切り文字にスペース(" ")を指定している点に留意してください。