CSVをExcelに取り込む

Dim tmp
Dim strBuf As String, strBuf1 As String
Dim i As Long
Dim LastLEN As Long
Dim shThis As Worksheet
Dim CSVpath As String

'シートとCSVのパスを指定
Set shThis = ThisWorkbook.Worksheets("")
CSVpath = ""

'取り込み先のシートをクリア
With shThis
.Cells.Clear

Open CSVpath For Input As #1
i = 1
Do Until EOF(1)
Line Input #1, strBuf

'セグメント内改行対策箇所
Do Until EOF(1)
If (Len(strBuf) - Len(Replace(strBuf, """", ""))) Mod 2 = 0 Then Exit Do
Line Input #1, strBuf1
strBuf = strBuf & strBuf1
Loop

'引用符削除
strBuf = Replace(strBuf, """,", ",")
strBuf = Replace(strBuf, ",""", ",")
strBuf = Replace(strBuf, """""", """")
If Left(strBuf, 1) = """" Then strBuf = Right(strBuf, Len(strBuf) - 1)
If Right(strBuf, 1) = """" Then strBuf = Left(strBuf, Len(strBuf) - 1)

'読み込んだ文字列を分割して配列に
tmp = Split(strBuf, ",")

'直前の配列と要素数が違えばメッセージ
If UBound(tmp) <> LastLEN And i > 1 Then msgbox "フィールド数が違う行があります。" & vbCrLf & "行:" & i
LastLEN = UBound(tmp)

'一行ずつ貼り付け
.Range(.Cells(i,1),.Cells(i,UBound(tmp)+1)) = tmp
i = i + 1
Loop
Close #1

End With

●問題点
文字の","が含まれていると、区切り文字の","を区別できないため分割される。
→カンマより左の引用符数をカウントして奇数なら文字の","と判別できる。が、数値の桁区切りの","には対応できない。
改行対策で改行を削除しているため実際のデータとは異なってくる。

配列を1要素ずつ指定すれば必要な列だけを抜き出すことも可能。
ただし要素を個別に張り付ける分、数が増えると処理時間が延びる。

 

先に表示形式を変えれば数値などの自動変換を防げる。

.Columns().NumberFormatLocal = "@" '文字列

※2018/4/24 修正
セグメント内改行対策コードの追加と引用符削除を手直し。