中身と仕組みの説明(CSVファイルをADOで扱う②)


CSVファイルをADOで扱う連載の2回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

CSV_ReaderADOの解説

 前回は、CSVファイルをADOで扱う事ができるという事をお話ししたうえで、CSVファイルを簡単にExcelシート上に表示するツール"CSV_ReaderADO***.xlsm"をご紹介しました。使ってみた感じはいかがでしょうか?今回はこのツールの解説をしたいと思います。ツールは以下からダウンロードして下さい。

01_ADOでCSVを扱う.zip - Google ドライブ

f:id:HiroCom777:20210209203433j:plain

ツールの解説

 前回もお話しした通り、このツールにはあらかじめADO(ADODB.Connectionオブジェクト)が組み込まれています。現在Excelで使用できるADOは複数あるのですが、ここではMicrosoft ActiveX Data Objects 2.8 Libraryを参照設定して使用します。VBEの画面からメニューのツール⇒参照設定で選択して設定してください。また、記述されているコードは起動時の操作画面で表示される”ファイル指定”ボタンのクリック時に実行されるプロシージャが1つ。標準モジュールにファンクションプロシージャが1つだけです。シンプルですね。それではコードの説明です。

”ファイル指定”ボタンのクリック時の処理

 まずは、ボタンのクリック時の処理です。以下にコードを示します。

Private Sub cmdFile_Click()
Dim fileName As String
Dim folderName As String
Dim outputBook As Workbook
Dim workRange As Range
  '読込ファイルの指定
  fileName = Application.GetOpenFilename("CSVファイル,*.csv")
  If fileName = "False" Then Exit Sub
  'データベースフォルダーの指定
  folderName = Left$(fileName, Len(fileName) - Len(Dir$(fileName)))
  '読込内容を新規ブックに出力
  Set outputBook = Workbooks.Add
  outputBook.Activate
  ReadCsvDataBase folderName, "SELECT * FROM [" & Dir$(fileName) & "]", outputBook.ActiveSheet.Range("A1")
  'セルのエラーチェックマーク消去
  For Each workRange In outputBook.ActiveSheet.UsedRange
    workRange.Errors(xlNumberAsText).Ignore = True
  Next
  'シート名を設定
  outputBook.ActiveSheet.Name = Replace$(UCase(Dir$(fileName)), ".CSV", "")
End Sub

 コードの大体の流れは、

  • ファイルオープンのコモンダイアログでCSVファイルを指定。
  • 新規のExcelブックを開いて出力先とする。
  • ReadCsvDataBaseプロシージャを使ってCSVファイルを読み込み表示。
  • 出力先ブックを修正(セルのエラーチェックマーク消去、シート名を拡張子なしのファイル名に設定)

となります。ReadCsvDataBaseプロシージャは標準モジュールに記述されています。これ以外はシンプルな処理ですね。

標準モジュールの処理

 標準モジュールに記述してあるプロシージャも1つだけ。上記で説明したReadCsvDataBaseプロシージャです。ReadCsvDataBaseプロシージャは引数としてCSVファイル、SQLコマンド、表示先のRange(左上原点)を指定すると、指定された条件でCSVファイルの内容を出力先に出力します。以下にコードを示します。

Public Function ReadCsvDataBase(folderName As String, sqlCmd As String, originRange As Range) As Long
On Error GoTo ErrorHandler

  'データベースを接続します
  Dim adoCn As Object
  Set adoCn = CreateObject("ADODB.Connection")
  adoCn.Provider = "Microsoft.ACE.OLEDB.12.0"
  adoCn.Properties("Extended Properties") = "Text;HDR=Yes;FMT=Delimited"
  adoCn.Open = folderName
  'レコードセットを開きます
  Dim adoRs As Object
  Set adoRs = CreateObject("ADODB.Recordset")
  adoRs.CursorLocation = adUseClient
  adoRs.Open sqlCmd, adoCn
  
  'フィールドリストを表示します
  Dim adoField As ADODB.Field
  Dim i As Long: i = 0
  For Each adoField In adoRs.Fields
    originRange.Offset(0, i).Value = adoField.Name
    i = i + 1
  Next
  'データを表示します
  originRange.Offset(1, 0).CopyFromRecordset adoRs
  ReadCsvDataBase = adoRs.RecordCount
  adoRs.Close
  adoCn.Close
ErrorHandler:
  If Err.Number <> 0 Then MsgBox "データベース接続に失敗しました " & Err.Number
End Function

 コードの大体の流れは、

  • CSVファイルにデータベース接続する。
  • 接続したデータベースからSQLコマンドを指定してレコードセットを開く。
  • データベースからフィールド名リストを取得して表示。
  • CSVファイルのデータ内容を取得して表示。
  • 取得したレコード数を返す。

となります。そう、ReadCsvDataBaseはファンクションプロシージャですので値を返します。取得したレコード数を返します。

ADOを使用したデータベースの接続、データアクセスについてなのですが、ここでは詳しく述べません。また、SQLコマンドはデータベースを制御するためのコマンドについても、詳しい説明は避けます。今回は、すべてのデータを取得する設定になっていると思ってください。

ここを詳しく説明していくと、少し話がそれてしまってつまらなくなってしまいそうだからです。両方とも、別に機会を設けて詳しく説明していきたいと思います。

CSVファイルの仕様

いかがでしたでしょうか。使用している技術に関してはともかく、シンプルなコードで構成されていることはわかっていただけたと思います。次回は、意図しないデータ変換を防ぐCSVファイルの仕様についてご説明したいと思います。お楽しみに!!

hirocom777.hatenadiary.org CSVファイルをADOで扱う連載記事はコチラからどうぞ