やりたいこと
以下のようなCSVファイルをエクセルにインポートしたい。
- データはダブルクォーテーションで囲われている列と囲われていない列がある
- 文字コードShift_JIS、改行コードLF
- ダブルクォーテーションで囲われていない列のデータ内にカンマが存在する
実際のサンプルデータ
sample.csv
1顧客ID,"申込日",都道府県,市区町村,番地等,マンション名,日付 21000,"2021年06月28日",愛知県,名古屋市西区,X丁目XX-X,〇〇ハイツ,201,2021年7月3日
試してみたコード
VBA
1Sub Import() 2 3 '########## インポート ########## 4 Dim i As Long, j As Long 5 Dim buf As String, tmp As Variant, tmp2 As Variant, n As Long 6 Dim strLine As Variant 7 Dim arrLine As Variant 8 Dim myFile As Variant 9 10 Dim ws As Worksheet 11 Set ws = ThisWorkbook.Worksheets(1) 12 13 Open ActiveWorkbook.Path & "\sample.csv" For Input As #1 14 Line Input #1, buf 15 Close #1 16 17 'bufをLFコードで区切りtmpに格納 18 strLine = Split(buf, vbLf) 19 20 For i = LBound(strLine) To UBound(strLine) 21 '項目行 22 If i = 0 Then 23 arrLine = Split(Replace(strLine(i), """", ""), ",") 24 Else 25 'strLineをコロンで区切りarrLineに格納 26 arrLine = Split(Replace(replaceColon(strLine(i)), """", ""), ":") 27 End If 28 29 For j = 0 To UBound(arrLine) 30 If i = 0 Then 31 ws.Cells(i + 1, j + 1).Value = arrLine(j) 32 Else 33 ws.Cells(i + 1, j + 1).Value = Replace(arrLine(j), """", "") 34 End If 35 Next j 36 Next i 37 38End Sub 39 40'受け取った文字列のカンマをコロンに置き換える 41'ダブルクォーテーションで囲まれているカンマは置き換えない 42Function replaceColon(ByVal str As String) As String 43 44 Dim strTemp As String 45 Dim quotCount As Long 46 47 Dim l As Long 48 'strの長さだけ繰り返す 49 For l = 1 To Len(str) 50 'strから現在の1文字を切りだす 51 strTemp = Mid(str, l, 1) 52 'strTempがダブルクオーテーションなら 53 If strTemp = """" Then 54 'ダブルクオーテーションのカウントを1増やす 55 quotCount = quotCount + 1 56 'strTempがカンマなら 57 ElseIf strTemp = "," Then 58 'quotCountが2の倍数なら 59 If quotCount Mod 2 = 0 Then 60 '現在の1文字をコロンに置き換える 61 str = Left(str, l - 1) & ":" & Right(str, Len(str) - l) 62 End If 63 End If 64 Next l 65 66 replaceColon = str 67 68End Function
結果
「マンション名」にカンマが入ってしまっているため以下のようにずれてセルに格納されてしまう。
|顧客ID|申込日|都道府県|市区町村|番地等|マンション名|日付||
|:--|:--:|--:|
|1000|2021年06月28日|愛知県|名古屋市西区|X丁目XX-X|〇〇ハイツ|201|2021年7月3日|
元データをすべてのデータをダブルクォーテーションで囲んでもらわない限り無理な気はするのですが、対処方法がありましたら教えていただけますと幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/03 09:12
2021/07/03 09:24 編集
2021/07/03 13:57