CSVファイルをADOで扱う連載の27回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org
CSVファイルと一緒にできたもの
前回はADOを使ってCSVファイルを作るコードの解説でした。そしその際にschema.iniというファイルが一緒にできたのでした。
今回は、このschema.iniをご紹介しようと思います。
schema.iniって何だ?
その前に今までのおさらいです。CSVファイルを開く際に、ADOではCSVファイルをテーブル、つまりデータベースの中の表として扱います。CSVファイルのあるフォルダーがデータベースとなります。前回CREATE TABLEを使って新しいCSVファイル(テーブル)を作って、その際に各フィールドのデータ型を指定しました。
CSVファイルはテキストデータなのでデータ型を記録する方法がありません。そこで各CSVファイルのフィールドのデータ型をschema.iniに記録しているのです。ADOはその後のファイルアクセスの際に、フィールドのデータ型をschema.iniに記録してある内容で取り扱います。
それでは具体的な例を見てみましょう。前回作成したファイル(Test.csv)とschema.iniを使ってデータを追加してみます。
データを追加してみる
Test.csvとschema.iniが配置してあるフォルダーに操作するExcelファイルも配置します。例によってMicrosoft ActiveX Data Objects 2.8 Libraryを参照設定しておいてください。標準モジュールを作成して以下を入力しましょう。データを追加するプロシージャです。
Public Function AddCsvData(folderName As String, fileName As String, fieldLst() As Variant, recordData() As Variant) On Error GoTo ErrorHandler 'データベースを接続します Dim adoCn As New ADODB.Connection adoCn.Provider = "Microsoft.ACE.OLEDB.12.0" adoCn.Properties("Extended Properties") = "Text;HDR=Yes;FMT=Delimited" adoCn.Open folderName & "\" 'データを追加します Dim adoRs As New ADODB.Recordset adoRs.Open "[" & fileName & "]", adoCn, adOpenKeyset, adLockOptimistic Dim i As Long For i = 0 To UBound(recordData()) adoRs.AddNew fieldLst, recordData(i) Next adoRs.Update adoRs.Close adoCn.Close ErrorHandler: If Err.Number <> 0 Then MsgBox "データベース接続に失敗しました " & Err.Number End Function
実際にデータを追加してみましょう。以下を入力して実行してみてください。上のAddCsvDataを使ってデータを追加します。
Public Sub AddDataTest() Dim folderName As String Dim fileName As String Dim fieldList() As Variant Dim recordData() As Variant folderName = ThisWorkbook.Path fileName = "Test.csv" fieldList = Array("日付", "品名", "価格") recordData = Array(Now, "バナナ", 100) AddCsvData folderName, fileName, fieldList, recordData End Sub
実行した後にTest.csvを確認すると・・・以下の様にデータが追加されてます。
"日付","品名","価格" 2022/02/07 20:42:09,"バナナ",100
品名の項目はダブルクォーテーションで括られていますが、他の項目は括られていません。schema.iniで指定した内容が影響しているようです。
それではschema.iniがない場合はどうなるのでしょうか?試しにTest.csvに追加したデータを削除して保存してからschema.iniを削除して、再度AddDataTestを実行してみましょう。結果は以下の様になりました。
"日付","品名","価格" "2022/02/07 20:55:23","バナナ","100"
すべてのデータがダブルクォーテーションで括られています。文字列型として扱われているようですね。
次回もschema.ini
いかがでしょうか。schema.ini、奥が深そうです。次回も引き続き追求していこうと思います。お楽しみに!! hirocom777.hatenadiary.org CSVファイルをADOで扱う連載記事はコチラからどうぞ