下記は、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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
CSVファイルの項目行を削除...
-
エクセルVBA 大容量CSVファイル...
-
マクロから出力されるcsvのダブ...
-
csvファイルでの日付設定「yyyy...
-
csvファイル 項目数取得
-
CSV形式での保存時に”文字列...
-
csvファイルを列数ごとに分割す...
-
複数のCSVファイルのAccessテー...
-
COBOL85でのCSVファ...
-
【C#】パス名で無効な文字
-
バッチでCSVを処理する時、空の...
-
VBAでcsvファイルを読み込んで...
-
VB6.0 CSVファイル読み込みに...
-
vb2010でCSVファイルを並び替え...
-
複数のcsvファイルをExcelに一...
-
エクセルのデータから別のエク...
-
特定文字を入ってるCSVの特定の...
-
CSV出力して、MS/EXCELで開くと...
-
wshでcsvファイルのソートを行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
バッチでCSVを処理する時、空の...
-
マクロから出力されるcsvのダブ...
-
csvファイル 項目数取得
-
csvファイルでの日付設定「yyyy...
-
複数のcsvファイルをExcelに一...
-
CSV形式での保存時に”文字列...
-
データ解析ソフトRでのファイル...
-
エクセルVBA 大容量CSVファイル...
-
【C#】パス名で無効な文字
-
csvファイルのデータの一部を取...
-
COBOLでCSVをインプットにして...
-
CSVファイルの項目行を削除...
-
csvファイルのデータの間引きを...
-
VBAでcsvファイルを読み込んで...
-
エクセル形式のファイルの読み込み
-
CSVファイル作成
-
COBOL85でのCSVファ...
-
VB6.0 CSVファイル読み込みに...
-
【エクセル マクロ】読み込ん...
おすすめ情報