CSV

ADOでCSVを操作する詳細

参照設定で
Microsoft ActiveX Data Objects Recordset 6.0 Library
をチェックして追加しておく。

処理名をGetCSVとして、そのCSVのパスを取得する処理はGetPathとして別にあるとする。
(パス名、ファイル名は適当です)

Public Sub GetPath
'targetPathという変数にフォルダパスを入れる
    Dim targetPath as string
'targetFileという変数にファイル名を入れる
    Dim targetFile as string
    targetPath="E:\CSVPATH"
    targetFile="testcsv.csv"
    Call GetCSV(targetPath,targetFile)
End Sub

GetCSVで直接パス名ファイル名を扱うより汎用化できるので、フォルダ名、ファイル名を引数で与える。

Public Sub GetCSV(strPath as string,strFile as string)
    Dim cn As ADODB.Connection  '接続
    Dim rs As ADODB.Recordset   'レコードセット
    Dim sql As String           ’SQL文字列
'
'接続をインスタンス化(実体化)
    Set cn = New ADODB.Connection
'レコードセットのインスタンス化
    Set rs = New ADODB.Recordset
'
'接続に必要なプロバイダ アクセスのACEでOK
    cn.Provider = "Microsoft.ACE.OLEDB.16.0"
'接続文字列には フォルダパス を指定
    cn.ConnectionString = strPath
'1行目がヘッダーであること、項目が区切られてること
    cn.Properties("Extended Properties") = "Text;HDR=Yes;FMT=Delimited"
    cn.Open '接続する
'SQL作成:FROM句で ファイル名 を指定。[]で囲む
    sql = "SELECT * FROM [" & strFile & "]"
'SQL発行結果をレコードセットに取得
    rs.Open sql, cn, adOpenForwardOnly, adLockReadOnly
'
    shCSV.Select 'Sheetを選択
'2行目以下をクリア(書式は残す)
    Range(Cells(2, 1), Cells(Rows.Count, Columns.Count)).ClearContents
'1列2行目を先頭にレコードセットの内容を貼り付ける
    shCSV.Range("A2").CopyFromRecordset rs
’
’後処理’(重要)
    rs.Close    'レコードセットを閉じる
    cn.Close    '接続を閉じる
    Set rs = Nothing    'レコードセットオブジェクトを消去
    Set cn = Nothing    '接続オブジェクトを消去
End Sub

当初、フォルダパスとファイル名の扱い方がわからず苦戦した。
コネクションでフォルダに接続し、その中のテーブルとしてCSVファイルを開いているイメージ。

開発時も、OneDrive上にコピーしたCSVを対象に処理していた。
誤って削除したときのために、CSVをセーブしていたが、そこがCDSystemつまり、実行フォルダだった。
ADOでCSVを読み込むために、フォルダのパスを引数として渡していたが、フォルダ指定が、Localでの初期実験時のThisWorkbook.Path となったままだった。

当初のCSVでの実行は成功するが、違うCSVを対象とすると失敗する。
当たり前。

だが、原因がわからず、無駄に時間をつかってしまった。

展開するエクセルの1行目に、予め適切な項目名を入れておくと、そのエクセルシート自体にSQLが発行できる。

有用な方法かもしれないので、記録しておきました。