• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBA ADOでのCSV取込みについて)

Excel VBA ADOでのCSV取込みについて

このQ&Aのポイント
  • Excel VBAでADOを使ってCSVデータを取り出す方法について解説します
  • CSVファイルの内容を取得する際に、「001」と書かれた値が「1」と変換される問題について考察します
  • 実際の値「001」のまま取得する方法について検討します

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

schema.ini ファイル(データ型定義)を作ってやれば安心かと。 http://www.ken3.org/cgi-bin/test/test102-1.asp http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips118.htm PS. CopyFromRecordset についても調べると、吉かも?

absolute_space
質問者

お礼

CopyFromRecordset は知りませんでした。これ良いですね。schema.ini ファイルについても、勉強してみます。

その他の回答 (3)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.4

#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以上だと途中で切り捨てられるハズ) 余計なおせっかいかもしれませんが一応。

absolute_space
質問者

お礼

ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

このような場合は、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") のところのパスは適当ですので、実際に合わせて変更してください。

absolute_space
質問者

お礼

ありがとうございます。こういう普通のCSVの読み込み方は、一応知ってたのですが、新たにADOでの読み込み方も勉強してたところです。色々と試してみます。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

桁数が決まっているなら、     Debug.Print Format(rs.Fields(idx).Value, "000") '←ここ が一番早いですよ。 コードを見る限り、行も列も関係なく読んでるようですし。

absolute_space
質問者

お礼

すみませんが、桁数は特定できません。なので、CSV中の値をそのまま忠実に取ってくる方法が知りたいのです。

関連するQ&A