- 締切済み
カンマ区切りCSVファイルをVBAで読み込みたい
こんにちは。EXCELのVBAに詳しい方、どうか教えてください! カンマ区切りCSVファイルをEXCELに読み込みたいのですが、 CSVファイルのデータが金額のため、データ自体にもカンマが含まれていて、 金額のカンマでも分割されてEXCELのセルに収まってしまいます。 データの区切りのカンマと、金額のカンマを区別して読み込む良い方法はないでしょうか。 とても困っているので、お解りになる方どうかご回答をお願いいたします。 ・CSVファイルのデータ 1,000 , 2,000 , 1,500 , 3,000 , 1,000 , 2,500 , 2,000 ↑金額のカンマでデータが分割されないように読み込みたいのですが・・・
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- layy
- ベストアンサー率23% (292/1222)
エクセルでお仕事 http://www.asahi-net.or.jp/~ef2o-inue/menu/menu05.html 一応参考(VBAの部分を見ておくこと) カンマ区切りといいつつもこれはカンマで区切りがわからない。 作成する側で作りなおすことを考えるのがまず先。 金額の「,」が出現したときは千円単位なので「,」の後に3桁続く。 金額の末尾で 10円単位以上しかないなら必ず「0,」。 100円単位以上しかないなら必ず「00,」。 金額の単位は100円単位以上しかない?。 金額の単位は1000円未満はあるのか?。 扱う金額がどういうものか、で多少のルールが浮かびあがります。 1 000 2 000 1 500 3 000 1 000 2 500 2 000 で「000」はあり得ないから直前のカンマは金額のカンマ。 1ケタ(1円単位)はあり得ないから「1」「500」の間のカンマも金額のカンマ。 「123,500」も「123」から判明、「100,500」がわからないパターンかどうか。 できるだけのことはやってあとから合体するという手もあります。 いずれもVBAで対応になるかと思います。 が、金額を扱うので不正は許されない。 データを扱いやすくするのがベターです。
- keithin
- ベストアンサー率66% (5278/7941)
なんだかひどいデータですね。失敬。 ありゃ,OpenTextも効かないや。。 というワケでチカラワザで。 Sub macro1() Dim buf As String Dim a Dim h As Range Dim z Worksheets.Add Set h = Range("A1") Open "C:\test\test.csv" For Input As #1 Do Until EOF(1) Line Input #1, buf a = Split(buf, " , ", compare:=vbTextCompare) h.Resize(1, UBound(a) + 1) = a Set h = h.Offset(1) Loop Close #1 For z = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column Columns(z).TextToColumns Destination:=Cells(1, z), DataType:=xlDelimited, _ TextQualifier:=xlNone, ConsecutiveDelimiter:=True, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=False, Other:=False, _ FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True Next z End Sub
- end-u
- ベストアンサー率79% (496/625)
実際のデータもそうなっていますか? ([全角スペース+カンマ+全角スペース]で区切られています?) もしそうなら[全角スペース+カンマ+全角スペース]をTABに変換すれば良いように見えます。 Sub try() '事前にVBEメニュー[ツール]-[参照設定]で 'Microsoft Forms 2.0 Object Libraryを参照設定する事 Dim buf As String Dim n As Long Dim f '読込みファイルを選択 f = Application.GetOpenFilename("csv,*.csv") If VarType(f) = vbBoolean Then Exit Sub '読込みファイルOpen n = FreeFile Open f For Input As #n buf = StrConv(InputB(LOF(n), #n), vbUnicode) Close #n '置換 With CreateObject("VBScript.RegExp") .Global = True .Pattern = " , " '全角スペース+カンマ+全角スペース buf = .Replace(buf, vbTab) End With 'Clipboardにセット With New DataObject .SetText buf .PutInClipboard End With '新規Sheetに貼付け Sheets.Add.Paste End Sub 実際は "1,000",200,"1,000",500,"3,000".. このように桁区切りがある場合、ダブルクォートで囲まれてませんか? その場合はExcelで普通に開く事ができますし、 QueryTable([データ]-[外部データの取り込み])も使う事ができます。