ExcelVBAを使ったCSVデータの読込-ADO編-

VBA
スポンサーリンク

ADO(ActiveX Data Objects)とSQLを使ったCSVファイルの読込の基本方法について紹介します。

スポンサーリンク
スポンサーリンク

全体の流れ

フォルダに格納されているCSVデータをExcelファイルに読み込みます。
フォルダへの接続とファイルのデータの読込にADOを使用します。

スポンサーリンク

詳細

「CSVデータ」フォルダの中に「くだもの」「やさい」「文房具」のCSVファイルがあります。

フォルダの中身

CSVファイルには簡単な表(テーブル)があります。以下は文房具.csvの内容です。

文房具.csv

上記のようなCSVファイルのデータをSQLで読み込んで、集計して、Excelファイルの「OUTPUT」シートに出力します。

出力先シート

実際に操作したい方はこちら→サンプルデータ

スポンサーリンク

コード全体

Dim adCon As New ADODB.Connection
Dim adrs As New ADODB.Recordset

Sub メイン()
    
    Dim Filepath As String
    Dim Fldname As String
    Dim Filename As String
    
    With Application.FileDialog(msoFileDialogFilePicker)
        If .Show = True Then
             Filepath = .SelectedItems(1)'ファイル(ファイルパス)を選択
             Fldname = Left(Filepath, Len(Filepath) - Len(Dir(Filepath)))'ファイルパスからフォルダ名を変数に格納
             Filename = Dir(Filepath)'ファイルパスからフィル名だけを変数に格納
        Else
             Exit Sub
        End If
    End With

    Call ADO接続(Filename, Fldname)
        
End Sub

Sub ADO接続(ByVal Filename As String, ByVal Fldname As String)
    
    Dim Excelversion As String
    Dim sqlStr As String
    Dim i As Integer
     
    'フォルダへの接続設定
    adCon.provider = "Microsoft.ACE.OLEDB.12.0"
    adCon.Properties("Extended Properties") = "Text;HDR=Tes"
    adCon.Open Fldname
    
    'CSV用SQL文の記載
    sqlStr = "SELECT 商品,単価*個数 AS 合計 FROM " & Filename
    adrs.CursorLocation = adUseClient
    adrs.Open sqlStr, adCon
         
    Sheets("OUTPUT").Select
    Sheets("OUTPUT").Cells.Clear
    
  'ヘッダーをシートに表示
    For i = 0 To adrs.Fields.Count - 1
        Sheets("OUTPUT").Cells(1, i + 1) = adrs.Fields(i).Name
    Next i

    'Recordsetオブジェクトで読み込んだデータを表示
    Sheets("OUTPUT").Range("A2").CopyFromRecordset adrs
    MsgBox "取込完了", vbOKOnly
    
    adCon.Close
    Set adrs = Nothing
    Set adCon = Nothing
    
End Sub

コードを解説していきます。

スポンサーリンク

ADO(ActiveX Data Objects)

Dim adCon As New ADODB.Connection 
Dim adrs As New ADODB.Recordset

ADOはデータベースに接続するためのライブラリです。

ADOを使うことでCSVだけではなく、データベースサーバー、Access、Excelにアクセスすることができます。

大まかには以下の2点です。

  • ADODB.Connectionでデータベースに接続します。
  • ADODB.Recordsetでデータベースの中のテーブル(表)に接続します。

例えば、ADODB.Connectionでデータベースサーバー自体に接続して、ADODB.Recordsetでサーバー内の特定テーブル(表)に接続するという形です。
しかし、今回はサーバーには接続しません。あくまでローカルディスク内のCSVファイルです。

そのような場合には、以下のようになります。

  • ADODB.ConnectionでCSVファイルが入っているフォルダに接続します。
  • ADODB.Recordsetでフォルダ内のCSVファイルに接続します。

参照設定

ADOを使うためには、事前に参照設定が必要です。
VBEにて「ツール」「参照設定」をチェック
「Microsoft ActiveX Data Object 2.8Library」にチェックを入れて「OK」をクリック

参照設定を行ったうえで、以下のコードでオブジェクトを生成します。

Dim adCon As New ADODB.Connection
Dim adrs As New ADODB.Recordset

スポンサーリンク

ファイル選択

 Dim Filepath As String
 Dim Fldname As String
 Dim Filename As String  
    With Application.FileDialog(msoFileDialogFilePicker)
        If .Show = True Then
             Filepath = .SelectedItems(1)
             Fldname = Left(Filepath, Len(Filepath) - Len(Dir(Filepath)))
             Filename = Dir(Filepath)
        Else
             Exit Sub
        End If
    End With

こちらでは、読み込むためのCSVファイルをファイルダイアログオブジェクトを使って選択します。

VBAファイルを開く方法まとめ②
Application内のFileDialogオブジェクトについて、プロパティ、メソッドの活用方法をコードを使って紹介しています。

先述の通り、ADODB.Connectionでまずはフォルダに接続します。つまりフォルダパスが必要になります。選択したファイルパスからフォルダパスのみを変数Fldnameに格納します。そのためのコードが以下になります。

Fldname = Left(Filepath, Len(Filepath) - Len(Dir(Filepath)))

そして、ADODB.Recordsetでファイルに接続します。ADODB.Recordsetでファイルに接続する場合はファイルパスではなくファイル名だけが必要になります。よって、ファイルパスではなくファイル名だけを変数Filenameに格納します。そのためのコードが以下になります。

Filename = Dir(Filepath)

※Dir関数を使うことで、ファイル名を返してくれます。下図の通り

それぞれの変数の格納状況
スポンサーリンク

フォルダ接続(ADODB.Connection)

 Call ADO接続(Filename, Fldname)

Callステートメントで、ADO接続プロシージャにファイル名(変数:Filename)とフォルダパス(変数:Fldname)を渡します。

adCon.provider = "Microsoft.ACE.OLEDB.12.0"
adCon.Properties("Extended Properties") = "Text;HDR=Yes"
adCon.Open Fldname

ADODB.Connectionのプロパティ、メソッドを使って上記3行で対象フォルダの接続を確立します。

providerプロパティ

.provider=でOfficeのバージョンに合わせて次のように指定します。

Microsoft.ACE.OLEDB.4.0Office2003以前
Microsoft.ACE.OLEDB.12.0Office2007以降
バージョン

Propertiesコレクション

Propertiesコレクションにて.Properties(“Extended Properties”)で拡張プロパティの指定を行います。
CSVファイルの場合:Text
先頭行をヘッダーとして扱う場合:HDR=Yes

Openメソッド

Openメソッドでフォルダパスを指定して接続と実行を行います。

スポンサーリンク

SQL

sqlStr = "SELECT 商品,単価*個数 AS 合計 FROM " & Filename

変数sqlStrにSQLコードを格納します。(商品名カラムと合計カラム(単価×個数)の集計表)
※SQLコードの解説は割愛

スポンサーリンク

データの読み込み(ADODB.Recordset)

ここまででADODB.Connectionで対象フォルダに接続しました。

今度はADODB.Recordsetでデータベースを読み込みます。

adrs.CursorLocation = adUseClient
adrs.Open sqlStr, adCon

adrsのCursorLocationプロパティをadUseClientに設定します。
adUseClient:クライアント側カーソル
adrs.Open sqlStr, adConでSQL(データベース)を読み込みます。

Fieldsコレクション

For i = 0 To adrs.Fields.Count - 1
        Sheets("OUTPUT").Cells(1, i + 1) = adrs.Fields(i).Name
Next i

Recordsetオブジェクト(変数:adrs)のFieldsコレクションでヘッダーの情報を取得できます。
ForNextステートメント配列を使ってOUTPUTシートに表示させます。

マクロVBAのFor文で作るパズル(演習)
ForNextステートメンとIfThenステートメントを使ってパズルを作成する方法について紹介しています。Excelダウンロードファイルを使ってブログ記事を読み進めながら一緒に作成することができます。
Sheets("OUTPUT").Range("A2").CopyFromRecordset adrs

CopyFromRecordsetメソッド

CopyFromRecordsetメソッドを使って、Recordsetオブジェクトで読み込んだデータを表示します。

スポンサーリンク

Closeメソッド

adCon.Close
    Set adrs = Nothing
    Set adCon = Nothing

Connectionオブジェクトを閉じます。

Recordsetオブジェクトも閉じられます。そして、オブジェクト変数の値を Nothing に設定して開放します。

【参考書籍】


CSVファイル読み込みで学ぶExcel VBA ADO入門 技術の泉シリーズ

筆者オススメのVBAテキストはこちら↓

ExcelVBA学習のおすすめの本5選
筆者オススメの「これは秀逸!」「これは1冊持っとくべき」と思えるExcelVBAの本を紹介しています。ExcelVBAの書籍選びで、どれを選んでよいか迷っておられる方に参考にしていただきたいです。
スポンサーリンク

まとめ

  1. ADODB.Connectionでフォルダに接続(フォルダパスを指定)
  2. ADODB.Recordsetでデータベースを読込(ファイル名を指定、SQL活用)
  3. ADOを使う場合は参照設定が必要

ADOとSQLを活用したデータベースの読込の基本的な方法について解説しました。

次回は応用編としてフォルダ内の複数ファイルの結合について紹介します。

ExcelVBAを使ったCSVデータの読込-複数テーブル結合編-
ADO(ActiveX Data Objects)とSQLを使ったCSVファイルの読込とテーブル結合の基本方法について紹介しています。

 

コメント

タイトルとURLをコピーしました