ITサポーターTsuchida

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の情報が非常にわかるようになります。配列が理解できるように頑張りましょう。