CSVファイルをADOで扱う連載の2回目です。前回の記事はこちらになります。
CSV_ReaderADOの解説
前回は、CSVファイルをADOで扱う事ができるという事をお話ししたうえで、CSVファイルを簡単にExcelシート上に表示するツール"CSV_ReaderADO***.xlsm"をご紹介しました。使ってみた感じはいかがでしょうか?今回はこのツールの解説をしたいと思います。ツールは以下からダウンロードして下さい。
01_ADOでCSVを扱う.zip - Google ドライブ
ツールの解説
前回もお話しした通り、このツールにはあらかじめ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ファイルの仕様についてご説明したいと思います。お楽しみに!!