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

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

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

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

VBA

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

Q&A

解決済

2回答

8157閲覧

VBAでデータにカンマが含まれている、改行コードがLFのCSVを取り込みたい

singlestroke

総合スコア68

CSV

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

VBA

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

0グッド

0クリップ

投稿2021/04/14 00:16

##やりたいこと
以下のようなCSVファイルをエクセルにインポートしたい。

  • データは「""」で囲まれている
  • 改行コードはLF
  • データ内に「,」や「:」が含まれている

##やってみたコード

VBA

1Sub Import() 2 3 Dim ws As Worksheet 4 Set ws = ThisWorkbook.Worksheets(1) 5 6 Dim myFile As Variant 7 ChDir "C:\vba" 8 myFile = Application.GetOpenFilename("CSVファイル(*.csv),*.csv") 9 10 Dim i, j As Long 11 Dim strLine As String 12 Dim arrLine As Variant 13 14 'csvファイルをオープン 15 Open myFile For Input As #1 16 17 i = 1 18 Do Until EOF(1) 19 Line Input #1, strLine 20 'strLineを=で区切りarrLineに格納 21 arrLine = Split(Replace(replaceColon(strLine), """", ""), "=") 22 For j = 0 To UBound(arrLine) 23 ws.Cells(i, j + 1).Value = arrLine(j) 24 Next j 25 i = i + 1 26 Loop 27 Close #1 28End Sub 29 30 31'受け取った文字列のカンマをコロンに置き換える 32'ダブルクォーテーションで囲まれているカンマは置き換えない 33Function replaceColon(ByVal str As String) As String 34 35 Dim strTemp As String 36 Dim quotCount As Long 37 38 Dim l As Long 39 'strの長さだけ繰り返す 40 For l = 1 To Len(str) 41 42 'strから現在の1文字を切り出す 43 strTemp = Mid(str, l, 1) 44 'strTempがダブルクォーテーションなら 45 If strTemp = """" Then 46 'ダブルクォーテーションのカウントを1増やす 47 quotCount = quotCount + 1 48 'strTempがカンマなら 49 ElseIf strTemp = "," Then 50 'quotCountが2の倍数なら 51 If quotCount Mod 2 = 0 Then 52 '現在の1文字を=に置き換える 53 str = Left(str, l - 1) & "=" & Right(str, Len(str) - l) 54 End If 55 End If 56 Next l 57 58 replaceColon = str 59 60End Function

##結果
CSVの改行コードをCRLFにするとうまくいくが、LFの場合すべてのデータが改行されず1行目に格納されてしまいました。

以下参考サイトサンプルではコロン「:」で区切っていたようですが、本CSVデータには日時のデータも含まれているため、コロンを使用するとそこでデータが区切られセルに格納されてしまいました。そのため代わりに「=」を使用しました。

##参考サイト
https://tonari-it.com/vba-csv-camma/

改行コードがLFでもきちんとエクセル内にインポートされるにはどのように改変したらよいのでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

投稿2021/04/14 00:49

sazi

総合スコア25173

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

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

singlestroke

2021/04/14 05:34

こんな感じですかね。 '1行取り込めばCSVファイル全て取り込める Open myFile For Input As #1 Line Input #1, buf Close #1 'bufをLFコードで区切りtmpに格納 tmp = Split(buf, vbLf) For i = 0 To UBound(tmp) - 1 tmp2 = Split(Replace(replaceColon(tmp(i)), """", ""), "=") Cells(i + 1, 1).Resize(1, UBound(tmp2) + 1).Value = tmp2 Next i
sazi

2021/04/14 06:16

データ内にLFが含まれていないならそんな感じですね。
singlestroke

2021/04/14 08:24

もしデータ内に改行があった場合のヒントだけいただいてもよろしいでしょうか。
sazi

2021/04/14 10:12

リンク先にコードがありますよ。
guest

0

Line Input #1, strLine の値をsplit関数で処理してはどうでしょうか。

投稿2021/04/14 00:28

mdj

総合スコア220

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

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

singlestroke

2021/04/14 05:12

Line Input #1, strLine strLine = Split(strLine, vbLf) とすると「型が一致しません」となってしまうのですが。
mdj

2021/04/14 05:51

split関数の戻り値の型を調べてください。strLineとは型が異なります。 saziさんがご回答されている方法で進めることで問題ないとは思いますが、何故「型が一致しません」なのかを理解しておくほうが良いかなと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問