質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1622閲覧

VBAでダブルクオテーションの無い、かつデータ内にカンマが含まれているCSVファイルを取り込みたい

singlestroke

総合スコア68

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/07/03 08:27

編集2021/07/03 08:53

やりたいこと

以下のような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日|

元データをすべてのデータをダブルクォーテーションで囲んでもらわない限り無理な気はするのですが、対処方法がありましたら教えていただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんな感じでお茶を濁すのはどうでしょうか。

VBA

1If UBound(arrLine) > 6 Then 2 arrLine(5) = arrLine(5) & arrLine(6) 3 arrLine(6) = arrLine(7) 4 ReDim Preserve arrLine(6) 5End If 6

投稿2021/07/03 08:59

jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

singlestroke

2021/07/03 09:12

カンマが「マンション名」でかつ「カンマが1つ」ということであればいけそうですね。 ありがとうございます。
jinoji

2021/07/03 09:24 編集

カンマが入りそうなのはマンション名だけ、という割り切りで、 カンマ複数を想定するなら、たとえば以下のように変えればいいかと。 u = UBound(arrLine) If u > 6 Then Debug.Print i, u, strLine(i) For k = 6 To u - 1 arrLine(5) = arrLine(5) & arrLine(k) Next arrLine(6) = arrLine(u) ReDim Preserve arrLine(6) End If
singlestroke

2021/07/03 13:57

カンマの数は1つ、入る可能性があるのは「番地等」と「マンション名」で同時に入ることはない、という条件になりそうです。
guest

0

| ダブルコロンで囲われていない列のデータ内にカンマが存在する

この「ダブルコロン」はダブルクォーテーションのことですか?

カンマはデータの区切りなので、データにそういう誤りがあるとしたら、どうしようもないと思います。

投稿2021/07/03 08:50

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

singlestroke

2021/07/03 08:53

> この「ダブルコロン」はダブルクォーテーションのことですか? そうです。修正しました。 やはり無理ですかね。。
itagagaki

2021/07/03 09:05

カンマが想定よりも多いことから、カンマを含むカラムが存在することは推測できても、ではそれがどのカラムなのかを推定することは不可能ですよね。 あ、でも、カンマを含む可能性があるのはマンション名以外には無いとすれば、カンマが多い場合つまりカラム数が多い場合に既定のカラム数になるまでマンション名のカラムに次のカラムのデータを結合していくという処理をすれば、まあ可能ではあると思いますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問