【VBA】CSV読み込みまとめ

用途

【Open For Input】
・一番簡素で早くしたいとき
・行数を把握できるとき ※配列の要素数を事前に設定必要のため
文字コードSJISのとき
・カンマ区切りのとき
・値の途中にカンマがないとき、または"囲みのとき 例."あ,い"はOK、'あ,い'はNG
・配列に保持したいとき

【ADO】
・RecordSetに保持したいとき
SJIS以外のとき(schema.iniを使用)
・カンマ区切り以外のとき(schema.iniを使用)
・Select文使いたいとき(読み込み時)
・Filter/Sort使いたいとき(読み込み後)
・外部ファイルで読み込み設定を管理したいとき
・値の途中にカンマがないとき、または"囲みのとき 例."あ,い"はOK、'あ,い'はNG

【QueryTable】
CSVの内容をセルにそのまま貼り付けたいとき
SJIS以外のとき
・カンマ区切り以外のとき
・値の途中にカンマがあるとき 例. "あ,い"、'あ,い'もOK

OpenForInput

Type typPerson
    id As String
    name As String
    age As String
End Type

Sub Test()
    Dim arry(20) As typPerson  'CSVの行数を指定
    Dim i As Long: i = 0
    Dim fullPath As String
    
    fullPath = "C:\Users\user\Desktop\新しいフォルダー (2)\加藤.csv"
    
    Open fullPath For Input As #1

    Do Until EOF(1)
        Input #1, _
            arry(i).id, _
            arry(i).name, _
            arry(i).age
        i = i + 1
    Loop
    Close #1
End Sub

ADO

schema.iniを使用しない場合

SJISのみ
データ形式が自動で判定される ※"囲みの場合は文字列(memo)判定
・"囲みじゃない場合は使わないほうがいいかも…数値の前ゼロ消える

Sub Test()
    Dim rs As New ADODB.Recordset
    Dim cn As New ADODB.Connection
    Dim path As String
    Dim fileName As String
    
    path = "C:\Users\user\Desktop\新しいフォルダー (2)"
    fileName = "加藤.csv"
    
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    cn.Properties("Extended Properties") = "Text;HDR=Yes"   'HDR…1行目がヘッダーか
    cn.Open path
    
    rs.Open fileName, cn, Options:=adCmdTableDirect
    
    '1件ずつ処理
    Do While Not rs.EOF
        Debug.Print rs("id") & ", " & rs("name") & ", " & rs("age")
        rs.MoveNext
    Loop
    
    'セルに貼り付け
    rs.MoveFirst
    Sheets(1).Range("A1").CopyFromRecordset rs
End Sub
schema.iniを使用する場合

・iniファイルはCSVと同じフォルダに入れる ※自動で読み込まれる
SJIS以外可能
データ形式選べる

Sub Test()
    Dim rs As New ADODB.Recordset
    Dim cn As New ADODB.Connection
    Dim path As String
    Dim fileName As String
    
    path = "C:\Users\user\Desktop\新しいフォルダー (2)"
    fileName = "加藤.csv"
    
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    cn.Properties("Extended Properties") = "Text;HDR=Yes"   'HDR…1行目がヘッダーか iniファイルが優先
    cn.Open path
        
    rs.Open fileName, cn, Options:=adCmdTableDirect
    
    'select文を使用する場合
'    Dim sql As String
'    sql = "select * from 加藤.csv where id = '1'"
'    rs.Open sql, cn
    
    '1件ずつ処理
    Do While Not rs.EOF
        Debug.Print rs("id") & ", " & rs("name") & ", " & rs("age")
        rs.MoveNext
    Loop
    
    'セルに貼り付け
    rs.MoveFirst
    Sheets(1).Range("A1").CopyFromRecordset rs
End Sub

schema.ini

;■CSVファイル名
[加藤.csv]
;■区切り文字
;カンマ区切り
Format=CSVDelimited
;タブ区切り
;Format=TabDelimited
;固定長
;Format=FixedLength
;■文字コード
;SJIS
CharacterSet=932
;UTF-8
;CharacterSet=65001
;■ヘッダー有無 trueでヘッダーあり
ColNameHeader=true
;■データ形式の自動判定文字数
MaxScanRows=12
;■データ形式の手動設定(優先)
Col1=id Long
Col2=name Text
Col3=age Memo

;※固定値の場合
Col1=id Long 5
Col2=name Text 10
Col3=age Memo 5

;備考
;Text=文字列 255文字まで
;Memo=文字列 65,536?文字まで

;※複数入力可能
;■CSVファイル名
[加藤2.csv]
省略...