とある仕事で、とあるウェブアプリから吐き出されたCSVファイルをエクセルで読み込みたくなりました。
というわけで、めっちゃ久しぶりにVBAに触れました。
で、やってみるとうまくいかない。なぜか結果がズレるのです。
そこでCSVファイルをよくよく調べてみると、要素にカンマや改行が含まれていました。
データ中にカンマがあると、そこを区切りと勘違いしてしまう上、改行も、レコードの終わりと勘違いして、次の行へ行ってしまいます。
この時のコードは、以下のように、データの中身を全く考慮しないシンプルなものでした。
Public Sub readCSV() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim strPath As String strPath = "読み込みたいCSVファイル.CSV" Open strPath For Input As #1 'csvファイルをオープン Dim i As Long, j As Long Dim strLine As String Dim arrLine As Variant i = 0 Do Until EOF(1) Line Input #1, strLine i = i + 1 arrLine = Split(strLine, ",") For j = 0 To UBound(arrLine) ws.Cells(i, j + 1).Value = arrLine(j) Next j Loop Close #1 End Sub
しかもこのコードだと、改行がLF(ラインフィード)の場合、改行とみなされず、何行あっても1行で出力されます。
そこで、ちゃんと読み込んでくれるプログラムを書こうと思い、ネットで書き方を探してみると、
さらに、LFでの改行に対応させる場合、
にあるような、かなり複雑なコードを書く必要があることが判明。
で、結局、データに改行が含まれる場合は無理にCSVにこだわらず、ワークブックとして取り込んでしまった方がはるかに楽でした。
例えば読み込む範囲が、A1:AR15の場合のVBAは、以下の通りです。
Public Sub ReadCsv() Dim wb As Workbook Set ws = ThisWorkbook.Worksheets(1) Set wb = Workbooks.Open(Filename:="読み込みたいCSVファイル.CSV") ws.Range("A1:AR15").Value = wb.Worksheets(1).Range("A1:AR15").Value End Sub
これだけで済みました。1行ずつ読み込もうとしてたときの労力はなんだったのか…。
但し、このやり方の場合、エクセルの自動変換機能により、読み込み時にデータが勝手に変換されることがあるようなので、ご注意を。