
下記は、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」のまま取得することって出来ないのでしょうか?
No.2ベストアンサー
- 回答日時:
schema.ini ファイル(データ型定義)を作ってやれば安心かと。
http://www.ken3.org/cgi-bin/test/test102-1.asp
http://www.geocities.co.jp/SiliconValley/4805/vb …
PS.
CopyFromRecordset についても調べると、吉かも?
CopyFromRecordset は知りませんでした。これ良いですね。schema.ini ファイルについても、勉強してみます。
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以上だと途中で切り捨てられるハズ)
余計なおせっかいかもしれませんが一応。
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")
のところのパスは適当ですので、実際に合わせて変更してください。
ありがとうございます。こういう普通のCSVの読み込み方は、一応知ってたのですが、新たにADOでの読み込み方も勉強してたところです。色々と試してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
CSV出力して、MS/EXCELで開くと...
-
VBAでの下記のプログラムについ...
-
エクセルのデータから別のエク...
-
CSVの行数を取得したい
-
【ExcelVBA】UTF-8の文字コード...
-
CSV形式での保存時に”文字列...
-
バッチでCSVを処理する時、空の...
-
COBOL85でのCSVファ...
-
【エクセル マクロ】読み込ん...
-
特定文字を入ってるCSVの特定の...
-
マクロから出力されるcsvのダブ...
-
VBA 毎日取得するデータを反映...
-
エクセルのプロパティーでセキ...
-
エクセルvbaでdocuworksprinter...
-
エクセルで複数のコメントのサ...
-
ExcelのVBAでフォルダ指定がで...
-
vbsでファイルやフォルダのコピ...
-
動かなくなってしまった古いVBA...
-
xcopyコマンドの進行状況を表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
バッチでCSVを処理する時、空の...
-
csvファイルでの日付設定「yyyy...
-
【C#】パス名で無効な文字
-
CSV出力して、MS/EXCELで開くと...
-
VBAでcsvファイルを読み込んで...
-
複数のcsvファイルをフォルダご...
-
CSV形式での保存時に”文字列...
-
【エクセルVBA】お願いします。...
-
csvファイル 項目数取得
-
エクセルVBA 大容量CSVファイル...
-
csvファイルのデータの一部を取...
-
複数のcsvファイルをExcelに一...
-
【エクセル マクロ】読み込ん...
-
マクロから出力されるcsvのダブ...
-
CSVファイルの項目行を削除...
-
データ解析ソフトRでのファイル...
-
csvファイルを列数ごとに分割す...
-
複数のCSVファイルのAccessテー...
-
Windowsのバッチファイルについ...
おすすめ情報