【VBA】CSVの文字内の「,」を除く方法!LINE INPUT!
<スポンサーリンク>
VBAでCSVをLINE INPUTで読み込んだ時に、
文字内に「,」が含まれていると、
1,000 → 「1」「000」
のように分けられてしまいます。。
今回はそんなCSVの「,」の対処法を紹介したいと思います!
まずは再現。
まずは、SPLITで想定外の箇所まで
分割されてしまう事例を再現します。
下記のプログラムを実行すると、
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
下記の通り、残念ながら数字の中の「,」も分割されてしまいます。
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"」
のように、「”」を使うことで、どこが区切り位置かわかるようになっています。
この仕組みを使って、作ったのが↓のプログラムです。
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
この実行結果は、下記の通り、思った通りの場所で分割できていることが分かります。
AAAA,BBB,1_000,10,15_000
0→AAAA
1→BBB
2→1_000
3→10
4→15_000
プログラムの仕組み
仕組みとしては、本当に単純で、
F = InStr(1, MOJIRETSU, """")
S = InStr(F + 1, MOJIRETSU, """")
で、1つ目の「”」と、2つ目の「”」の位置を調べて、
MOJI1 = Left(MOJIRETSU, F - 1)
MOJI2 = Mid(Replace(MOJIRETSU, ",", "_"), F + 1, S - F - 1)
MOJI3 = Right(MOJIRETSU, Len(MOJIRETSU) - S)
MOJIRETSU = MOJI1 & MOJI2 & MOJI3
で、
・「”」の左までの文字列
・「”」「”」の間の[,]を[_]に変えた文字列
・「”」の右の文字列
を取り出して合体させています。
あとは、これを繰り返して、「”」がなくなるまで繰り返して終わりです。
まとめ
他の人のやり方を見ると、別で関数を作っていたのですが、
強引に作ってみました。笑
残念ながら文字列に「"」が入ってくるとどうもならなくなりますが、、、
「,」しかない場合は、このプログラムを使ってみてください!
コメント欄