VB 6.0には、データフォームウィザード、Data Environmentデザイナといった、データベースに関するツール類が豊富に用意されているが、残念ながらOffice付属のVBE(Visual Basic Editor)にはこういった機能はない。このため、VBAからADOを使うためには、自動化されていないぶん、それなりの知識が必要となってくる。知識といってもある程度“お約束事”ではあるので、まずはExcelからAccessのデータベースにアクセスするサンプルを見てみることにしよう。
本サンプルでは、Officeをインストールした際に、インストールディレクトリ配下に展開される、「¥Office¥Samples¥Northwind.mdb」というサンプルデータベースを使用する。コマンドボタンを押した時に、社員テーブルを読み込み、1列目にフリガナ、2列目に氏名を表示するだけの簡単なプログラムである(図2)。社員テーブルの概要を図3に示す。要はこのテーブルからフリガナと名前を抜き出して表示するという、実にシンプルな作業だ。図4にこのプログラムの作成手順を説明しているので参考にしてほしい。
図2:Excel上のコマンドボタンを押すと、セルにデータが読み込まれる |
![]() |
図3:Northwind.mdbの社員データベーステーブル |
![]() |
図4:サンプルプログラムの作成手順 | ||||||||||
![]()
|
Excelのシートの、コントロールツールボックスのデザインモードを解除するとコマンドボタンが押せるようになる。ではさっそく、コマンドボタンを押してみよう。図2のようになっただろうか? このサンプルはとても簡単だが、これだけで十分ADOを使ったプログラムとして成立している。では実際の内容について細かく見てゆくことにしよう。
表1:ADOのオブジェクト | |
オブジェクト | 機能 |
Connection | データソースとの接続に関するオブジェクト |
CommandSQL | ステートメントを組み込んでいるオブジェクト |
ParameterSQL | ステートメントのパラメータを組み込んでいるオブジェクト |
Recordset | データの移動と操作などを行なうオブジェクト |
FieldRecordset | オブジェクトの列を組み込んでいるオブジェクト |
Error | 接続で発生したエラーを組み込んでいるオブジェクト |
PropertyADO | オブジェクトの特徴を組み込んでいるオブジェクト |
表2:ADOのコレクション | |
コレクション | 機能 |
Errors | 接続で生じた単一の失敗の応答として発生する、すべてのErrorオブジェクト |
ParametersCommand | オブジェクトに関連づけられている、すべてのParameterオブジェクト |
FieldsRecordset | オブジェクトに関連づけられている、すべてのFieldオブジェクト |
Properties | Connection、Command、Recordset、Fieldの各オブジェクトに関連づけられている、すべてのPropertyオブジェクト |
これらの関係は図5を参照されたい。
図5:ADOオブジェクトの関係図 |
![]() |
基本的に必要なオブジェクトは、Connection、Command、Recordsetの3つである。実際のプログラムの流れとしては、
リスト1:サンプルプログラム |
![]() |
図6:サンプルプログラムの作成手順 | ||||||||||
![]()
|
では、作成したDataLinkファイルを用いてデータベースに接続するように、プログラムを修正してみよう。変更する場所は、リスト1のdbcn.Openの部分である。
元のプログラム |
' OLE DBプロバイダを指定して、データソースを開く
' ここではプロバイダは、「Microsoft.Jet.OLEDB.4.0」
' データソースはAccess 2000のサンプルデータベースである
'「Northwind.mdb」を使用
dbcn.Open "Provider=Microsoft.Jet.OLEDB.4.0;
DataSource=C:¥ProgramFiles¥MicrosoftOffice
¥Office¥Samples¥Northwind.mdb"
修正したプログラム |
' OLE DBプロバイダを指定して、データソースを開く
dbcn.Open "File Name = C:¥テスト.UDL;"
随分スッキリすることが、おわかりいただけるだろう。またこの方法ならば、Jetがバージョンアップしたとしても、UDLファイルを変更するだけで、プログラムを書きかえる必要がないので非常に合理的だ。