• ベストアンサー

VBAでCSVの取り込み

CSVの取り込みを試みていますが、、 あいうえお,abc,"12,000",東京都,・・・・ いうデータで なにを目当てに区切っていいのか困っています。 ","で通常区切りますが、これだと12,000が分断されて・・・ どうしたらいいものでしょうか? 最終的にアクセスに放り込みます。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.10

こんにちは。 >Accessのインポートだと[2,000,000]を例とした場合、 そのために、" "(クォーテーション)が入っているわけですが、いつも、CSVの質問で迷宮入りになる話の中に、インポートは公開されていますが、何で出力されたものか明らかではないことがあります。 Win --Win(or MS-DOS)は問題は少ないのですが、それでも、うまく行かないこともあります。また、CSVにそっくりなのに、中身に、見えないバイナリコードが入っているものもあります。仮に、" "(クォーテーション)が入っていても、丹念に問題箇所の文字コードは調べたほうがよいです。 そういう私も、CSVをうまく認識しないのでおかしいなって思ったら、CSVの中身がUnix 系の仕様になっていたことがあります。結局のところ、アプリケーションの中のテキストコンバートツールのようなものがあっても、マルチパーパスのファイル変換ではありませんから、専用ツール(フリーウェア)で出ていたりするようです。VBAでも可能なことは可能ですが、まず、細かな点を抑えていないと難しいです。 正規表現で書くのは簡単なことです。しかし、そのコードで解決するかどうか分からないのです。なぜ、Accessで失敗しているか、その原因が明らかではないと、経験的にどんなコードを書いても成功しないように思うのです。

urourojp
質問者

補足

すみません。 アクセスには取り込めました。 文字列はダブルコーテーションで囲まれているという設定をはずしていました。チェックを入れたらOKでした。 データはWEBショップの売上げのような感じです。Unixかもしれません。 預かりものですが、依頼者はそのあたりがよくわかっていません。 すみません。

その他の回答 (9)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.9

こんにちは >Access(Ver97 は知りませんが、それ以降なら問題ないはずです) で、そういうことはありえないと思います 私的には、ver97しかもっていないので、 97で、試してみましたが。 インポートうまく行っています。 97なので、ウィザードで、ちょっと、型に手間取りましたが。 私的にも、Wendy02さんの、言うとおりだと思います。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんばんは。 >正規表現なんかでうまくいかないものでしょうか? >Accessのインポートではおかしなところで切れてだめでした。 Access(Ver97 は知りませんが、それ以降なら問題ないはずです) で、そういうことはありえないと思います。もし、うまく行っていないのなら、CSV自体が、完全ではない可能性がありますから、テキストエディタで、正しく「カンマ(,)}区切りになっているか、CSV の中身を調べたほうがよいです。仮に、VBAでテキストを処理したところで、同じことが起こる可能性が高いと思います。 なぜか、理由とは関係なくコード自体を教えてほしいというように読めますが、Access という名前を出した以上、今回の場合は、その必要性がないように思います。

urourojp
質問者

補足

Excelで開いたときは、位取りの","がないときと同じように正常に開きました。 Accessのインポートだと[2,000,000]を例とした場合、 [2],[000],[000]が別フィールドにはいっていました。 テキストデータを先に整形してはというご意見をいただき、正規表現が浮かびましたが、なにぶん、苦手なもので、すみません。

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.7

質問者様にお聞きしますが最初から疑問となっていることで確認をお願いします。 「VBAでCSVの取り込み」と主題がなっておりますが VBA(Visual Basic For Application) Office製品にはこのVBAが備わっています。 VBAで開発を行っているのはExcel、Word、Accessの何れかかと思いますがどれで開発をしていらっしゃいますか? >最終的にアクセスに放り込みます。 Accessではないと言うこと? >Excelで開いて保存するのが一番簡単みたいですが、できたら、軽くテキストベースで処理できたらと思いました。 Excelではないと言うこと? 残りはWordですがWordで開発をしておられると言うことでしょうか? 回答をお願いします。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

VBAでというからにはVBAプログラムを組む覚悟だろう。 プログラムを組めばよい。 まずCSVの1レコードを読む。 その文字列について、INSTR関数で”を見つける。さらに次の”を見つける。その間の文字列を切り出しその中のカンマは削除。同じく文字列最後まで繰り返し。”と”の対のチェックも入れれば完全。 ‟の次や前がカンマかどうかチェックすると完全。 結果をSplit関数でセルの各列用に分離。 各列のセルに値をセット。 次のレコードへ。 ==== 質問者のデータに限っての話で、テキストエディタで””を削除したらどうなるだろう。 要検討。 多分大丈夫では?

urourojp
質問者

お礼

皆さんありがとうございます。 Excelで開いて保存するのが一番簡単みたいですが、できたら、 軽くテキストベースで処理できたらと思いました。 Accessのインポートではおかしなところで切れてだめでした。 #6さんのテキストの時点で変換するのがいいかと思いました。 正規表現なんかでうまくいかないものでしょうか?

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.5

#4です。 先の方法以外も書いてきます。 Sub LoadCSV() Dim FF As Integer Dim FileName As String Dim X(1 To 5) As Variant 'CSVのフィールドが5つの場合 6つなら1 to 6 Dim Gyo As Long Dim Rec As Long FileName = "C:\ファイルパス\TEST.csv" '環境に合わせ変更 FF = FreeFile Open FileName For Input As #FF Gyo = 1 '1行目から出力 Do Until EOF(FF) Rec = Rec + 1 Input #FF, X(1), X(2), X(3), X(4), X(5) 'CSVのフィールドが5つの場合 6つなら,X(6)を追記 Range(Cells(Gyo, 1), Cells(Gyo, 5)).Value = X 'CSVのフィールドが5つの場合 6つなら(Gyo, 5)を(Gyo, 6) Gyo = Gyo + 1 Loop Close #FF MsgBox ("完了") End Sub '-------------- 以下補足 Input #で1単語読みをします。 最初にダミーでLine Inputをして1行読込その後カンマを数えさせることでフィールドを判断させることも出来ますが今回の場合不具合が発生します。 毎回フィールド数が可変する場合はサブルーチンでLine Inputを1回走らせ1行の1文字づつ読込、カンマを数える。 但し、ダブルクオーテーションが始まってその途中にカンマがあるときはカウントしない。 と言う流れであれば自動でフィールド数を調べることも出来ると思います。

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.4

こんにちは。 #1様の書かれている↓ >まず、12000が12,000という形になっている時点でそれはCSVとしての要件を失っているといえます。 CSVで文字列内にカンマを含む場合はダブルクウォーテーションで囲みますので特に不思議な事でもありません。 勘違いをされているようですね。 恐らくCSVを一行読みしカンマを目印にSPLITで分割していると思われますが一度Workbook.openでCSVを開きそこで処理した方が簡単だと思います。 その場合、「"12,000"」は自動で「12,000」と判断され複雑な設定無く開くことが出来ます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 同じような回答にはなりますが、 >","で通常区切りますが、これだと12,000が分断されて・・・ ソフトウェアは、何をお使いですか?Access もExcel も、そのようなことにはならないはずです。 あえて、取り去りたいなら、Excelに一旦入れて、書式を整えてから後、再度CSV に保存すればいのですが、Accessでも、ファイルを開くで、直接CSVを選択すれば、テキストリンクウィザードが出てきますから、VBAを使っても、結果的に、Accessの操作は同じだと思います。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.2

>最終的にアクセスに放り込みます 最初から、アクセスに、CSVファイルをインポートしたら 良いだけなんでは??

回答No.1

まず、12000が12,000という形になっている時点で それはCSVとしての要件を失っているといえます。 データを取り込む前に、データを確かな形にしておくことが必要なのです。 元データを正しい状態にすることを始めてください。

関連するQ&A

専門家に質問してみよう