【VBA】CSVの文字内の「,」を除く方法!LINE INPUT!
<スポンサーリンク>
VBAでCSVをLINE INPUTで読み込んだ時に、
文字内に「,」が含まれていると、
1,000 → 「1」「000」
のように分けられてしまいます。。
今回はそんなCSVの「,」の対処法を紹介したいと思います!
まずは再現。
まずは、SPLITで想定外の箇所まで
分割されてしまう事例を再現します。
下記のプログラムを実行すると、
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | Sub CSV() MOJIRETSU = "AAAA,BBB," "1,000" ",10," "15,000" "" Debug.Print MOJIRETSU MOJI = Split(MOJIRETSU, "," ) Debug.Print 0 & "→" ; MOJI(0) Debug.Print 1 & "→" ; MOJI(1) Debug.Print 2 & "→" ; MOJI(2) Debug.Print 3 & "→" ; MOJI(3) Debug.Print 4 & "→" ; MOJI(4) Debug.Print 5 & "→" ; MOJI(5) End Sub |
下記の通り、残念ながら数字の中の「,」も分割されてしまいます。
1 2 3 4 5 6 7 | AAAA,BBB,"1,000",10,"15,000" 0→AAAA 1→BBB 2→"1 3→000" 4→10 5→"15 |
CSVで文字内に「,」が入るときは「"」で分けられる。
CSVファイルで、文字内に「,」が入るときは、
「”(ダブルクォーテーション)」で分けられます。
例えば、上記のMOJIRETSUの場合、
「AAAA,BBB,1,000,10,15,000」
だと、どこが区切り位置かわからないので、
「AAAA,BBB,"1,000",10,"15,000"」
のように、「”」を使うことで、どこが区切り位置かわかるようになっています。
この仕組みを使って、作ったのが↓のプログラムです。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | Sub CSV2() MOJIRETSU = "AAAA,BBB," "1,000" ",10," "15,000" "" F = InStr(1, MOJIRETSU, "" "" ) If F > 0 Then LABEL1: S = InStr(F + 1, MOJIRETSU, "" "" ) MOJI1 = Left(MOJIRETSU, F - 1) MOJI2 = Mid(Replace(MOJIRETSU, "," , "_" ), F + 1, S - F - 1) MOJI3 = Right(MOJIRETSU, Len(MOJIRETSU) - S) MOJIRETSU = MOJI1 & MOJI2 & MOJI3 F = InStr(1, MOJIRETSU, "" "" ) If F > 0 Then GoTo LABEL1 End If MOJI = Split(MOJIRETSU, "," ) Debug.Print MOJIRETSU 'AAAA,BBB,"1,000",10,"15,000" Debug.Print 0 & "→" ; MOJI(0) Debug.Print 1 & "→" ; MOJI(1) Debug.Print 2 & "→" ; MOJI(2) Debug.Print 3 & "→" ; MOJI(3) Debug.Print 4 & "→" ; MOJI(4) End Sub |
この実行結果は、下記の通り、思った通りの場所で分割できていることが分かります。
1 2 3 4 5 6 | AAAA,BBB,1_000,10,15_000 0→AAAA 1→BBB 2→1_000 3→10 4→15_000 |
プログラムの仕組み
仕組みとしては、本当に単純で、
1 | F = InStr(1, MOJIRETSU, "" "" ) |
1 | S = InStr(F + 1, MOJIRETSU, "" "" ) |
で、1つ目の「”」と、2つ目の「”」の位置を調べて、
1 2 3 4 5 | MOJI1 = Left(MOJIRETSU, F - 1) MOJI2 = Mid(Replace(MOJIRETSU, ",", "_"), F + 1, S - F - 1) MOJI3 = Right(MOJIRETSU, Len(MOJIRETSU) - S) MOJIRETSU = MOJI1 & MOJI2 & MOJI3 |
で、
・「”」の左までの文字列
・「”」「”」の間の[,]を[_]に変えた文字列
・「”」の右の文字列
を取り出して合体させています。
あとは、これを繰り返して、「”」がなくなるまで繰り返して終わりです。
まとめ
他の人のやり方を見ると、別で関数を作っていたのですが、
強引に作ってみました。笑
残念ながら文字列に「"」が入ってくるとどうもならなくなりますが、、、
「,」しかない場合は、このプログラムを使ってみてください!
コメント欄