みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでCSVファイルを取り込む方法シリーズです。
前回はCSVファイルの改行コードがLFの場合にエクセルVBAで上手にデータを取り込む方法についてお伝えしました。
さて、CSV。
本来、色々なソフトウェアでデータを簡単にやりとりをするためのフォーマットなのですが、けっこう色々なパターンが存在しちゃっているんですね…。
今回はまた別の例として、データがダブルクォーテーションで囲まれているパターンのCSVをエクセルVBAで取り込む方法についてお伝えしたいと思います。
では、行ってみましょう!
一般的なCSVファイルを取り込むプログラムのおさらい
まずは一般的なCSVファイルを取り込むプログラムについて、おさらいをしておきたいと思います。
Sub getCSV()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim strPath As String
strPath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-csv\test\ラーメン店アンケート_dq.csv"
Dim i, j As Long
Dim strLine As String
Dim arrLine As Variant 'カンマでsplitして格納
Open strPath For Input As #1 'csvファイルをオープン
i = 1
Do Until EOF(1)
Line Input #1, strLine
arrLine = Split(strLine, ",") 'strLineをカンマで区切りarrLineに格納
For j = 0 To UBound(arrLine)
ws.Cells(i, j + 1).Value = arrLine(j)
Next j
i = i + 1
Loop
Close #1
End Sub
CSVのレコードを1行ずつ取り込んで、Splitでカンマで分割して配列に格納。
配列に格納した要素をワークシートのセルに書き込んでいく、というプログラムです。
詳しくはこちらの記事で紹介しています。
データがダブルクォーテーションで囲われているパターン
例えばこのようなCSVファイルが存在します。
データがダブルクォーテーションで囲まれていますね。
実はこのケースは結構出くわすパターンです。
例えばデータ要素にカンマや改行(LFやCR)が含まれているときは、そのままでは取り扱えなくなってしまいます。
そんなときのため、データ要素をダブルクォーテーションで囲うことで取り扱えるようにするわけですね。
しかしながら、このタイプのCSVファイルを上記のgetCSVで取り込むと
当然こうなります。
これでは数値の集計はできませんね…。
では、対応するプログラムを作っていきましょう。
ダブルクォーテーションを含むCSVを取り込むプログラム
ダブルクォーテーションを削除しつつCSVデータを取り込むプログラムはこちらです。
'CSVファイルの取り込み 一行ずつ取得しカンマでスプリットする最も定番なパターン
Sub getCSV()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim strPath As String
strPath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-csv\test\ラーメン店アンケート_dq.csv"
Dim i, j As Long
Dim strLine As String
Dim arrLine As Variant 'カンマでsplitして格納
Open strPath For Input As #1 'csvファイルをオープン
i = 1
Do Until EOF(1)
Line Input #1, strLine
arrLine = Split(Replace(strLine, """", ""), ",") 'strLineをカンマで区切りarrLineに格納
For j = 0 To UBound(arrLine)
ws.Cells(i, j + 1).Value = arrLine(j)
Next j
i = i + 1
Loop
Close #1
End Sub
…どこを変えたかわかりますか?
なんと変更したのは一行だけです。
20行目ですね。
ダブルクォーテーションをReplaceで削除する
Replace(文字列,置換前文字列,置換後文字列)
とすることで、文字列内の任意の文字列を置換することができます。
今回は
Replace(strLine, """", "")
としています。
VBAの場合、ダブルクォーテーションはエスケープ文字で””””とダブルクォーテーション4つ分で表現します。これが置換前の文字列。
置換後の文字列は””のダブルクォーテーションが2つですが、これはNullつまり長さゼロの文字列ですね。したがってNullで置換するということは削除するというのと同じことです。
こちらで実行した結果はこうなります。
バッチリですね。
まとめ
以上、データがダブルクォーテーションで囲まれているCSVファイルをエクセルVBAで取り込む方法でした。
わかってみたら何てことないですね。
しかしながら、まだいくつか手ごわいパターンが残っています。
次はデータ内にカンマが使われてしまっているパターンです。
全てのCSVを取り込めるようにしたいと思いますので、ドシドシ紹介したいと思います。