GEN MUTO'S HOMEPAGE  エクセル大事典  エクセルVBAを極める

エクセルExcel大事典 エクセル大事典TOPページへ
 ■ エクセルVBAを極める−VBAスーパーテクニック
  CSVファイルに接続してみよう!
 
■ データオブジェクトを使用してCSVデータを取得しよう

ここではActiveXデータオブジェクト(ADO)とMicrosoftJetOLE DB4.0プロバイダを使用した、CSVファイルからのデータ取得について解説します。

FileSystemObjectの操作 や VBAステートメントでファイル操作 にて、テキストファイルの内容を読み取る方法を解説しました。
しかし、ただテキストファイルの内容を読み取り、ワークシート上に展開したいだけなら、今回解説するADOオブジェクトを使用した、データ取得のほうがより簡単に行えます。

それでは早速、ADOを使用したCSVファイルの読み取りについて解説していきましょう。
なおADOを使用するには、VBEの参照設定(ツール>参照設定)で「Microsoft ActiveX Data ObjectX.X Library」にチェックを入れる必要があります。

MicrosoftJetOLE DB4.0プロバイダを使用したCSVファイルへの接続

Sub test()
  Dim CN As ADODB.Connection
  Dim RS As ADODB.Recordset

  Set CN = New ADODB.Connection

  CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=C:\;" & _
          "Extended Properties='Text;HDR=NO'"

  Set RS = CN.Execute("SELECT * FROM sample.csv")

  Do Until RS.EOF
    Debug.Print RS.Fields(0); RS.Fields(1); RS.Fields(2)
    RS.MoveNext
  Loop

  Set RS = Nothing
  Set CN = Nothing
End Sub
 
この例では、Cドライブのルートフォルダにある、"sample.csv"ファイルに接続、レコードセットを取得してイミディエイトウィンドウに、フィールド1〜3を出力します。(CSVファイルのフィールド数が3以上あるものとします)

"Extended Properties='Text;HDR=NO'" HDRをNOに指定したとき、CSVファイルの1行目をデータとして認識します。HDRをYESに指定したとき、CSVファイルの1行目はフィールド名として認識します。

"Data Source=C:\;" はCSVファイルが存在するフォルダ名を指定します。この場合、Cドライブのルートフォルダになります。"Data Source=C:\;" は"Data Source=C:;" と記述しても同様に動作します。

"SELECT * FROM sample.csv" このSQLで、"sample.csv" のすべてのレコードを選択します。"sample.csv"は"sample#csv" と記述しても同様に動作します。

このサンプルコードは、次のように書き換えても同様に動作します。

Sub test()
  Dim CN As ADODB.Connection
  Dim RS As ADODB.Recordset

  Set CN = New ADODB.Connection
  CN.Provider = "Microsoft.Jet.OLEDB.4.0"
  CN.Properties("Extended Properties") = "Text;HDR=NO"
  CN.ConnectionString = "C:\"
  CN.Open

  Set RS = CN.Execute("SELECT * FROM sample.csv")

  Do Until RS.EOF
    Debug.Print RS.Fields(0); RS.Fields(1); RS.Fields(2)
    RS.MoveNext
  Loop

  Set RS = Nothing
  Set CN = Nothing
End Sub

"Text;HDR=NO" を"Text;HDR=YES" にして、"SELECT * FROM sample.csv" を"SELECT * FROM sample.csv WHERE [フィールド名] = フィールドの値" にすると、フィールド名を使った抽出ができます。この場合、CSVファイルの1行目がフィールド名となります。

"Text;HDR=NO" の場合、"SELECT * FROM sample.csv WHERE [sample#csv].F1 = フィールドの値" このように抽出するフィールドを指定します。この例では、sample.csvの1列目をWHERE句の抽出条件として指定しています。

取得したレコードセットを、ワークシート上に展開するには、RangeオブジェクトのCopyFromRecordsetメソッドを利用します。

Set RS = CN.Execute("SELECT * FROM sample.csv")
Range("A1").CopyFromRecordset RS

この場合、アクティブシートの"A1"セルより、レコードセットオブジェクト変数「RS」に取得されているレコードセットの内容を転記・複写します。

もちろん、繰り返し構文を利用してフィールドの値を1つづつセルに複写しても構いません。



MSDASQL(ODBC)プロバイダを使用したCSVファイルへの接続

ここまで、Jet(OLEDB)プロバイダによるCSVファイルへの接続を解説してきましたが、同様の処理は、MSDASQL(ODBC)プロバイダを利用しても行うことができます。

Sub test()
  Dim CN As String
  Dim RS As ADODB.Recordset

  Set RS = New ADODB.Recordset

  CN = "Provider=MSDASQL;" & _
      "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
      "DefaultDir=C:\;FirstRowHasNames=0;"

  RS.Open "SELECT * FROM sample.csv;", CN

  Do Until RS.EOF
    Debug.Print RS.Fields(0); RS.Fields(1); RS.Fields(2)
    RS.MoveNext
  Loop

  Set RS = Nothing
End Sub

この例では、今までと同様に、Cドライブのルートフォルダにある、"sample.csv"ファイルに接続、レコードセットを取得してイミディエイトウィンドウに、フィールド1〜3を出力します。

コネクションオブジェクト変数「CN」がただの文字型変数になっていることに注意してください。

HDR プロパティはMSDASQLプロバイダでは使用できません。代わりにFirstRowHasNamesを使用します。ただし、このFirstRowHasNamesプロパティはODBCドライバに渡されることはありません。これは、ODBCドライバのバグです。

[BUG] Excel ODBC ドライバ Disregards、FirstRowHasNames またはヘッダーの設定
http://support.microsoft.com/kb/288343/ja

リンク先では、Excel ODBCドライバについて記述されていますが、Text ODBCドライバでも同じ現象が発生します。
つまり、MSDASQLプロバイダを使用した接続では、必ずCSVファイルの1行目は列見出し(フィールド名)として扱われます。注意してください。


以上、ADOオブジェクトを利用したCSVファイルへの接続を解説してきました。

CSVファイルをレコードセットとして取得した場合、読み取り専用で開かれるためレコードの更新・追加・削除は行えません。

しかしCSVファイルを一気にワークシート上に展開したいとき、RangeオブジェクトのCopyFromRecordset メソッドが利用できるなど、非常に容易に行える手法で、応用範囲も広いです。覚えておいても、決して損ではないでしょう。
 

>> 次の話にすすむ


サイト内検索ができます

Microsoft Most Valuable Professional

Microsoft MVP Excel
武藤 玄 プロフィール
 

■■■ 執筆した書籍 ■■■
 

EXCEL VBA 業務自動化
 

Excel VBA を5日でマスターする本
 

仕事を速くする Excel VBA 入門
 

Excel VBAと業務改善のポイントがわかる本
 

Access VBA ベーシック スタンダード
 

Excel VBA アクションゲーム作成入門
 

■■■ 連載中の記事 ■■■
 

Excel VBAで業務改善!
 

実務で使うExcel VBA
 


TOPページ


■ エクセルVBA超入門

 ・9ステップで"Hello World!"
  からオブジェクト指向まで!
  1."Hello World!"を表示しよう
  2.基本はデータの入出力
  3.繰り返し処理
  4.シートで簡易データベース
  5.名前をつけよう
  6.構造化プログラムに挑戦
  7.構造体を使ってみよう
  8.フォームを使ってみよう
  9.オブジェクト指向に挑戦

■ エクセルVBA中級編

 ・VBAでいろんなテクニック
  変数・関数のスコープ
  引数の参照方法を明示
  配列の中身を一気に複写
  識別子がよいコードを作る
  データ定義型をもっと知ろう
  定数と列挙型を活用しよう
  エラー処理の重要性1
  エラー処理の重要性2
  いろいろな条件分岐
  いろいろな繰り返し処理
  演算子について知ろう
  文字列操作 連結 変換 置換
  文字列操作 検索 比較 書式
  日付操作関数を知ろう
  数値操作・評価・その他関数
  並び替えソートをマスター
  いろいろな検索をマスター
  VBEditorを使いこなそう
  マクロの記録を活用しよう1
  マクロの記録を活用しよう2
  VBAからVBEを操作しよう1
  VBAからVBEを操作しよう2
  VBAからVBEを操作しよう3
 ・ワークシートを使いこなす
  セルの参照をマスターしよう
  セルの選択をマスターしよう
  セルの操作をマスターしよう
  セルの書式設定をマスターしよう
  行・列の操作をマスターしよう
  シートの参照をマスターしよう
  シートの操作をマスターしよう
  ブックの操作をマスターしよう
  ウィンドウの操作をマスターしよう
  イベントプロシージャを活用しよう
  ワークシートを印刷しよう1
  ワークシートを印刷しよう2
  音声(読み上げ)機能を操作しよう
  グラフを操作しよう
 ・ユーザーフォームを使いこなす
  ユーザーフォームを使おう
  UserFormsオブジェクト
  Labelコントロール
  TextBoxコントロール
  ComboBoxコントロール
  ListBoxコントロール
  CheckBoxコントロール
  OptionButtonコントロール
  ToggleButtonコントロール
  CommandButtonコントロール
  ScrollBarコントロール
  SpinButtonコントロール
 ・VBA関数の一覧
  Aから始まる関数の一覧
  Cから始まる関数の一覧
  Dから始まる関数の一覧
  Eから始まる関数の一覧
  Fから始まる関数の一覧
  Gから始まる関数の一覧
 
■ エクセルVBAを極める
 VBAスーパーテクニック
 
 ・データベースへ接続してみよう!
  CSVファイルへの接続
  ワークシートへの接続
  mdbファイルへの接続
  SQL Serverへの接続
  ADOレコードセットの操作1
  ADOレコードセットの操作2
 ・ファイルを操作してみよう!
  FileSystemObjectの操作
  Drive File Folderの操作
  TextStream ダイアログ
  ステートメントでファイル操作1
  ステートメントでファイル操作2
 ・他アプリと連携してみよう!
  ActiveXオートメーションの操作
 ・ゲーム技でマクロを超える
  エクセルで音を鳴らす1
  エクセルで音を鳴らす2  
  スクリーン座標を取得
  様々なイベント取得
  リボンUIを制御しよう1
  リボンUIを制御しよう2
  シート上でアニメを動かそう
 
■ 一歩上行くエクセル
 基本操作の完全マスター!

 
 ・あなたはいったい
  エクセルで何をしたいのか?
  エクセルで業務効率化
  エクセル関数を使いこなす
  エクセルの便利技
  エクセルは最高の帳票ツール
 ・エクセル基本操作上級編!
  セル選択、コメント、シリアル値
  オート機能を使いこなそう!
  参照、条件付書式、入力規則
  関数をもっと理解しよう!
  配列数式を有効利用しよう!
  データの正規化をしよう!
  ショートカットキーを利用しよう1
  ショートカットキーを利用しよう2
  Office用アプリを作成しよう!
  PowerPivotとExcelで簡単BI!
 ・世間の誤ったエクセルの
  べからず集
  エクセルで文章を書くべからず
  エクセルで図形を描くべからず
  エクセルでシステムをつくるな
 
■ エクセル関連その他

 ・エクセルコミニュティにあなたも
  参加しませんか?
  Excel関連リンク・コミニュティ
 ・VBの理解がVBAをマスターする
  最短距離!
  VB関連の老舗・大家サイト
 ・エクセルExcel大事典掲示板
 ・プライバシーポリシー

2000アイテムを超えるラベルを販売
送料無料、即納対応の優良ショップ
今買っているラベルより確実に安い!
OAラベルの販売専科グラフトラベル




エクセルExcel大事典ははリンクフリーです エクセル大事典Excel大事典
お問い合わせはこちら gengengen@yahoo.co.jp

Copyright© Gen Muto 武藤 玄 All Rights Reserved,