みなさん、こんにちは!
タカハシ(@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を取り込めるようにしたいと思いますので、また別の記事で紹介したいと思います。