- 締切済み
VBAでCSVをExcelに取り込む時に、途中の改行を取り除くには
VBAでCSVをExcelに取り込む時に、途中の改行を取り除くには はじめて質問させていただきます。 内容はhttp://okwave.jp/qa/q2793590.html のものに似ていまして、あるシステムが吐き出すCSVを、Excelで作ったリストの雛形にVBAで取り込むのですが、CSVの途中で改行されていたりするために上手くいきません。 元のCSV例 111,AAA,aaa,BBBB,bbbb 222,CCC,ccc,DDDD,dddd 333,EEE,eee ,FFFF,ffff 444,GGG,ggg,HHHH,hhhh ↓ 取り込んだリスト例 A | B | C | D | E ──┼──┼──┼──┼── 111 |AAA |aaa |BBBB|bbbb ──┼──┼──┼──┼── 222 |CCC |ccc |DDDD|dddd ──┼──┼──┼──┼── 333 |EEE |eee | | ──┼──┼──┼──┼── |FFFF|ffff | | ──┼──┼──┼──┼── 444 |GGG |ggg |HHHH|hhhh 当然の結果なのですが、これを例えばeeeの後ろの改行だけを削除して、333~ffffまで一レコードとして読み込ませたいのです。が、 最後の改行と途中の改行の区別をどうつけさせればいいのか、どの様にしたらいいのか見当がつきません。 とりえあず、 ・先頭(A列)には必ず数字が入る ・カンマの数(レコード数?)は固定 ・CSV中の余分な改行が入る時と入らない時がある このあたりが判定の手がかりになると思いますが、厚かましいお願いで恐縮ですが、ヒントになる様なコードをご教授いただけますでしょうか。 何分初心者なもので、情報不足な点ありましたらご指摘下さい。 よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- mt2008
- ベストアンサー率52% (885/1701)
Excelでやるより、そのCSVファイルをTeraPad等のテキストエディタで改行+「,」を「,」に置換してからExcelで開いた方が手っ取り早いように思います。 それじゃ駄目?
- end-u
- ベストアンサー率79% (496/625)
回答番号:No.3 です。失礼しました。orz >あるシステムが吐き出すCSVを >元のCSV例 >: >333,EEE,eee >,FFFF,ffff セル内改行と限らないから 333,EEE,"eee[改行コード]",FFFF,ffff とダブルクォートで囲まれてるわけじゃないんですね。 ひょっとして[改行コード]も vbLf か vbCrLf かで区別されてるかも判らない? すみません、勘違いしました。 取り敢えず私のレスは無視しておいてください。 #修行のタビに出ます...orz
- end-u
- ベストアンサー率79% (496/625)
データ量が膨大で、CSVファイルを開くのに時間がかかるという状況以外は Openメソッドで普通に開いてコピー処理したほうが簡単です。 開く時間を短縮したいという事であれば、事前にセル内改行を取り除く方法や、 Line Input読込み時に都度チェックする方法などあります。 前者の事例は ■EXCELにcsv形式の外部データを取り込む際にカンマ区切りで取り込も... http://okwave.jp/qa/q5972724.html?order=asc #状況的にはOpenメソッドで充分な案件だったと反省...orz 後者は 『 CSVRead SplitCsv 』 をキーワードにgoogle検索すると ■ダブルクォートのCSVを読み込むには? http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200807/08070010.txt などhitします。参考にしてみてください。
- imogasi
- ベストアンサー率27% (4737/17069)
これでうまく行くかどうかデータの規則性の情況に拠るが Line Inputで1行分を変数に読み込む。 s殿変数に対し、カンマでSplit関数を使い配列に分ける。 要素数が、決まりの5個より少なければ、次のレコードも読んでつなげてみる。 6個以上になる場合があるようだと絶望。か何かルールを設定(6個以上を無視やセルに設定して人間が目視チェックなど) 無いとして、5個の場合は5列のセルにバリアント変数のデータを代入。 1レコードの中のカンマの数を数えることと同様のことをやっている。 Split利用は 例えば Sub test01() a = "aa,sdf,gh,j,k" s = Split(a, ",") Range("A1:E1") = s End Sub のRange("A1:E1") = s が(1行で)できることがメリット。
- bin-chan
- ベストアンサー率33% (1403/4213)
CSVを読むのは、テキストファイルとしてOPENしておいて、LINE INPUTですかね? LINE INPUTで読み取った際に受け取る変数を「次工程」にまわす前に、カンマの数を数える。 ・カンマの数が一致するなら、現在の読み取り結果を「次工程」にまわす ・カンマの数が不足するなら、さらにCSV次行を読み、初回の読み取り結果と連結して、カンマの数を数えるところに戻る。 ・カンマの数がオーバーするなら、データ異常で打ち切る。