プロが教えるわが家の防犯対策術!

下記は、Excel VBAでADOを使って、CSVデータを取り出すソースです。ソースは、とあるサイトからほぼ丸写しです。

Sub main()
  Const DRIVER As String = "DRIVER={Microsoft Text Driver (*.txt; *.csv)};DBQ="
  Const PROVIDER As String = "Provider=MSDASQL;Extended Properties="""
  Dim cn As New ADODB.Connection
  Dim rs As New ADODB.Recordset
  Dim idx As Integer
  Dim strSQL As String

  cn.ConnectionString = PROVIDER & DRIVER & "C:\"""
  cn.Open

  '全件数取得
  strSQL = "SELECT * FROM Sample.csv"

  'CSVファイルの内容を取得
  Set rs = cn.Execute(strSQL)

  rs.MoveFirst

  Do Until rs.EOF
    For idx = 0 To rs.Fields.Count - 1
      Debug.Print rs.Fields(idx).Value '←ここ
    Next idx
    rs.MoveNext
  Loop

  Set rs = Nothing
  cn.Close
  Set cn = Nothing
End Sub


ここで、「'←ここ」と示した行のrs.Fields(idx).Valueって、実際には「001」と書かれた値は、ダブルクォーテーションでも入ってない限りは「1」と変換されちゃいますよね?これをちゃんと、実際の値「001」のまま取得することって出来ないのでしょうか?

A 回答 (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以上だと途中で切り捨てられるハズ)
余計なおせっかいかもしれませんが一応。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/12 23:12

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

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

お礼日時:2013/06/12 23:12

schema.ini ファイル(データ型定義)を作ってやれば安心かと。


http://www.ken3.org/cgi-bin/test/test102-1.asp

http://www.geocities.co.jp/SiliconValley/4805/vb …

PS.
CopyFromRecordset についても調べると、吉かも?
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/12 23:10

桁数が決まっているなら、


    Debug.Print Format(rs.Fields(idx).Value, "000") '←ここ
が一番早いですよ。

コードを見る限り、行も列も関係なく読んでるようですし。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/11 05:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!