- ベストアンサー
Excel VBA ADOでのCSV取込みについて
- Excel VBAでADOを使ってCSVデータを取り出す方法について解説します
- CSVファイルの内容を取得する際に、「001」と書かれた値が「1」と変換される問題について考察します
- 実際の値「001」のまま取得する方法について検討します
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
schema.ini ファイル(データ型定義)を作ってやれば安心かと。 http://www.ken3.org/cgi-bin/test/test102-1.asp http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips118.htm PS. CopyFromRecordset についても調べると、吉かも?
その他の回答 (3)
- nicotinism
- ベストアンサー率70% (1019/1452)
#2です。 Schema.ini と Copyfromrecordset で回答した訳。 レコードの値を直接、Cells(1,1)= rs.fields(idx) で代入しようとした場合に Cells(1,1)="001" や Cells(1,1)="1-1-1" と同様に、1、2001/1/1 などになってしまうのを 避けるためです。 Schema.ini で定義し、 Copyfromrecordset でコピペッタンすればデータ型は継承されます。 (Office2010では。ただし文字長が255以上だと途中で切り捨てられるハズ) 余計なおせっかいかもしれませんが一応。
お礼
ありがとうございました。
- piroin654
- ベストアンサー率75% (692/917)
このような場合は、ADODB.Streamを使うのが いいのでは、と思いますが。 たとえば、Textファイルでも、CSVファイルでも いいのですが、データが「""」でかこまれていない ファイルに、 1020,012,12,001 12,56,003,030 このようなデータが入っているとすると、 出力は、 1020 012 12 001 12 56 003 030 このようになればいいわけですね。以下のコードを 標準モジュールに貼り付け実行してみてください。 Sub test1() Dim ad As Object Dim strList As String Dim strSplit As Variant Dim i As Long Set ad = CreateObject("ADODB.Stream") 'このあたりの設定はWEBで検索してください。 ad.Type = 2 ad.Charset = "Shift-JIS" ad.Open ad.LoadFromFile = ("C:\test.csv") Do While Not ad.EOS '1行づつ読み込みます。 strList = ad.ReadText(-2) 'カンマのところで分割し、読み込みます。 strSplit = Split(strList, ",") '配列に読み込んだデータを吐き出します。 For i = LBound(strSplit) To UBound(strSplit) Debug.Print strSplit(i) Next i '次の行に行きます。 Loop 'オブジェクトを閉じ、破棄します。 ad.Close: Set ad = Nothing End Sub なお、 ad.LoadFromFile = ("C:\test.csv") のところのパスは適当ですので、実際に合わせて変更してください。
お礼
ありがとうございます。こういう普通のCSVの読み込み方は、一応知ってたのですが、新たにADOでの読み込み方も勉強してたところです。色々と試してみます。
- tsubuyuki
- ベストアンサー率45% (699/1545)
桁数が決まっているなら、 Debug.Print Format(rs.Fields(idx).Value, "000") '←ここ が一番早いですよ。 コードを見る限り、行も列も関係なく読んでるようですし。
お礼
すみませんが、桁数は特定できません。なので、CSV中の値をそのまま忠実に取ってくる方法が知りたいのです。
お礼
CopyFromRecordset は知りませんでした。これ良いですね。schema.ini ファイルについても、勉強してみます。