キャンプ、登山、旅、アウトドア、日本再発見

スカイファルコン

アイキャッチ

IT

改行を含むCSVをエクセルで読み込みたいとき

更新日:

とある仕事で、とあるウェブアプリから吐き出された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行で出力されます。
そこで、ちゃんと読み込んでくれるプログラムを書こうと思い、ネットで書き方を探してみると、

CSVの読み込み方法

さらに、LFでの改行に対応させる場合、

CSVの読み込み方法(改)

にあるような、かなり複雑なコードを書く必要があることが判明。

で、結局、データに改行が含まれる場合は無理に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行ずつ読み込もうとしてたときの労力はなんだったのか…。

但し、このやり方の場合、エクセルの自動変換機能により、読み込み時にデータが勝手に変換されることがあるようなので、ご注意を。

-IT

Copyright© スカイファルコン , 2024 All Rights Reserved SkyFalcon.