下記は、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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
csvファイル 項目数取得
-
csvファイルでの日付設定「yyyy...
-
カンマ区切りのCSVファイルから...
-
マクロから出力されるcsvのダブ...
-
データ解析ソフトRでのファイル...
-
C# datagridview csv 読込
-
特定ファイルの一括削除
-
CSVファイル作成
-
巨大なCSVの加工(指定列のみの...
-
csvファイルのデータの一部を取...
-
特定文字を入ってるCSVの特定の...
-
CSV形式での保存時に”文字列...
-
<csv>複数条件で検索・抽出し、...
-
PHP.laravelについて
-
Excelで作成した単語帳をp-stu...
-
エクセルマクロについて
-
【エクセル マクロ】読み込ん...
-
ExcelマクロにてCSV出力したデ...
-
VB6.0 CSVファイル読み込みに...
-
バッチでCSVを処理する時、空の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマ区切りのCSVファイルから...
-
CSV形式での保存時に”文字列...
-
複数のcsvファイルをExcelに一...
-
csvファイル 項目数取得
-
csvファイルでの日付設定「yyyy...
-
バッチでCSVを処理する時、空の...
-
マクロから出力されるcsvのダブ...
-
csvファイルを列数ごとに分割す...
-
エクセル形式のファイルの読み込み
-
csvファイルのデータの一部を取...
-
エクセルVBA 大容量CSVファイル...
-
CSVファイル作成
-
EXCEL|csvで保存→開くcsvを閉じる
-
CSVファイルの項目行を削除...
-
巨大なCSVの加工(指定列のみの...
-
データ解析ソフトRでのファイル...
-
VBAでCSVファイルのデータを集...
-
【ExcelVBA】UTF-8の文字コード...
-
【C#】パス名で無効な文字
-
特定文字を入ってるCSVの特定の...
おすすめ情報