VBA Stepup6
第6章 CSVファイルの標準取込
この章では、CSVファイルのデータを単純にカンマで分割し、特に編集せずにそのままセルに入れてゆく方法です。最も単純な方法ですが、CSVファイルの設定やCSVファイルの読み方は、次章以降でも使用するので覚えておいてください。
CSVファイルを読み込むには、CSVファイル名、ファイル番号、CSVファイルの1行分のデータなどの変数を準備します。
最も単純なCSVファイルの取り込み手順は以下のとおりです。
Dim fName As String 'CSVファイル名用変数
Dim iFree As Integer 'ファイル番号用変数
Dim strRec As String 'CSVファイル1行分のデータ
Dim varArray As Variant 'カンマで分割したデータ用配列
Dim i As Long, j As Long '行位置や配列用の添字
Dim bPath As String
Set bPath = ThisWorkbook.Path 'パスを取得
fName = bPath & "\test.csv"
iFree = FreeFile '空番号を取得
'CSVファィルを入力モードで開く
Open fName For Input As #iFree
i = 0
Do Until EOF(iFree)
Line Input #iFree, strRec '1行読み込み
i = i + 1
'カンマで区切られた文字をSplit関数で配列に分ける
varArray = Split(steRec, ",")
For j = 0 to UBound(varArray)
'配列に分けられたデータをセルに代入
Cells(i, j + 1).value = varArray(j)
next
Loop
Close #iFree 'CSVファイルを閉じる
この処理は、CSVデータを1行ずつ読んで、カンマを基準に分割した文字を配列に入れ、配列の文字データをセルに代入する流れになっています。 まずファイルを開いて、処理が終わったらファイルを閉じる処理も必要です。今までセル・ワークシート・ブックに比べると手順が多くて複雑に感じるかもしれません。ただこの処理ができるようになると、不要なデータを読み飛ばすことなどもできるようになります。
なお、CSVファイルの単純取込では、ダブルクォーテーションや伝票番号のゼロがなくなる問題が発生します。CSVファイルの中身を見て、単純取込が可能であればこの方法で取り込みます。
Windows以外の改行コードが入っていた場合
最近のインターネットからダウンロードしたCSVファイルの中に、Line Inputを行うとデータが1件読まれたら2件目がない現象が発生しています。この原因としてはCSVファイルの中の改行コードが、Windows以外(UNIX,Linux)の改行コードになっているのです。Line InputではWindowsの改行コードによって1件と判断しているようです。この状態のまま使うsplit関数を使うととんでもない項目数になってしまいます。
もし、Windows以外の改行コードだった場合は、次の対応を行います。
とのCSVファイルをLine Inputで読み込むと、データの最初から最後まで一度に読み込まれます。
この場合にはLine Inputで読み込んだデータを、Windows以外の改行コードで分割して編集します。分割の例は以下のとおりです。
'レコード分割用の配列の変数を宣言する
Dim recArray As Variant
Dim k As Long
Do Until EOF(iFree)
Line Input #iFree, strRec '1行読み込み
If InStr(strRec, vbLf) > 0 then
recArray = Split(strRec, vbLf)
For k = 0 To UBound(recArray)
varArray = Split(recArray(k), ",")
For j = 0 to UBound(varArray)
'配列に分けられたデータをセルに代入
Cells(i, j + 1).value = varArray(j)
Next J
Next k
Else
通常のCSVファイルの処理
End if
一見ちょっと面倒くさそうですが、このようにするとWindowsの改行でもWindows以外の改行でも対応できます。
改行コードのお話
改行コードとは1行の最後にあるデータです。この改行コードはコンピュータの歴史でOSごとに違いがあります。Windows、Macintosh、Unixでは三者三様です。
OS | Windows | Macintosh | Unix |
---|---|---|---|
バイト数 | 2バイト | 1バイト | 1バイト |
改行コード (16進数) |
0D0A | 0D | 0A |
Windowsがなぜ2バイトも使用しているかというと、タイプライターの動きをそのまま改行コードにしたのです。「0D」はキャリッジリターンといってリボンヘッドを一番左に戻す意味です。「0A」はラインフィードといって紙が1行分上がり、ライプライターから見たら1行下に移ります。
Macintoshはキャリッジリターンで、左に移動して下に移りますし、Unixは1行下に移って左に移動するというイメージです。
OSの違いによって改行コードが変わるので、実はメールの送受信でも、OSごとに改行の置き換えをやっています。
配列とは?
この章でいきなり配列という聞きなれない言葉が登場しました。配列はプログラミングで非常によく使います。
配列とは、複数のデータを連続的に並べたデータ構造のことです。Excelでいう列のように隣り合って区切られているようなものです。Excelでいう列番号と同様に、配列は添字で識別されます。 Excelは複数行・列で構成されているため、配列を使うと効率よくプログラムが組めます。
プログラムになれない人は配列が非常に苦手です。配列と添字との関係に慣れないと混乱するようです。私もプログラムの実務で2ヶ月ほど悩んだ記憶があります。 配列が理解できるようになると、インターネット上にあるVBAの情報が非常にわかるようになります。配列が理解できるように頑張りましょう。