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が発行できる。
有用な方法かもしれないので、記録しておきました。