Excel VBAでオブジェクト指向プログラミング(DAO編)

2024-01-05

■Data Access Objects(DAO)とは

Data Access Objects(DAO)はMicrosoftから提供されている、データベースへのアクセスに特化したオブジェクトで、元々はAccessのデータベースにアクセスするためのオブジェクトとして開発されたものです。
⇒詳細はMicrosoftのサイト(Data Access Objects(DAO))を参照して下さい。

Office2000に搭載されていたDAO 3.6以降はアップグレードされていませんので、新たにプログラムを作成される場合は、ActiveX Data Objects(ADO)を使用した方が良いと思います。
⇒ADOの詳細については、Excel VBAでオブジェクト指向プログラミング(ADO編)を参照して下さい。

DAOのオブジェクト

DAOに含まれるオブジェクトは下表の通りです。
⇒下表では各オブジェクトの階層構造(依存関係)のみを表し、説明は煩雑になるため、割愛しました。

DBEngineオブジェクト
Errorsコレクション
Errorオブジェクト
Propertiesコレクション
Propertyオブジェクト
Workspacesコレクション
Workspaceオブジェクト
Connectionsコレクション
Connectionオブジェクト
QueryDefsコレクション
QueryDefオブジェクト
Fieldsコレクション
Fieldオブジェクト
Parametersコレクション
Parameterオブジェクト
Propertiesコレクション
Propertyオブジェクト
Recordsetsコレクション
Recordsetオブジェクト
Fieldsコレクション
Fieldオブジェクト
Propertiesコレクション
Propertyオブジェクト
Databasesコレクション
Databaseオブジェクト
Containersコレクション
Containerオブジェクト
Documentsコレクション
Documentオブジェクト
Propertiesコレクション
Propertyオブジェクト
Propertiesコレクション
Propertyオブジェクト
QueryDefsコレクション
QueryDefオブジェクト
Fieldsコレクション
Fieldオブジェクト
Parametersコレクション
Parameterオブジェクト
Propertiesコレクション
Propertyオブジェクト
Recordsetsコレクション
Recordsetオブジェクト
Fieldsコレクション
Fieldオブジェクト
Propertiesコレクション
Propertyオブジェクト
Relationsコレクション
Relationオブジェクト
Fieldsコレクション
Fieldオブジェクト
Propertiesコレクション
Propertyオブジェクト
TableDefsコレクション
TableDefオブジェクト
Fieldsコレクション
Fieldオブジェクト
Indexesコレクション
Indexオブジェクト
Propertiesコレクション
Propertyオブジェクト
Groupsコレクション
Groupオブジェクト
Propertiesコレクション
Propertyオブジェクト
Usersコレクション
Userオブジェクト
Propertiesコレクション
Propertyオブジェクト
Propertiesコレクション
Propertyオブジェクト
Usersコレクション
Userオブジェクト
Groupsコレクション
Groupオブジェクト
Propertiesコレクション
Propertyオブジェクト

■DAOを使用するための事前準備

DAOを使用するための事前準備は、以下の3ステップです。
⇒オブジェクトを使用するための事前準備とオブジェクトブラウザによる調査方法については、Excel VBAでオブジェクト指向プログラミング(事前準備編)を参照して下さい。

①ライブラリの参照設定
Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、参照設定ダイアログでMicrosoft DAO 3.6 Object Libraryのチェックボックスにチェックを入れ、[OK]ボタンを押下。

②オブジェクト変数の定義
プログラムの宣言部でオブジェクト変数を定義。

  1. Dim dbe As Object

③インスタンスの生成
プログラムの処理部でインスタンスを生成。

  1. Set dbe = New dao.DBEngine
  2. 'ここにDAOを使用した処理を記述
  3. Set dbe = Nothing

(参考)「Set dbe = New dao.DBEngine」の部分を「Set dbe = CreateObject(“DAO.DBEngine.120")」と記述すれば、ステップ①(ライブラリの参照設定)は不要です。

■DAOの使用方法

DAOでデータベースをオープンし、レコードを読み出す処理について、詳細な手順を説明します。

データベースのオープン

DBEngineオブジェクトのOpenDatabaseメソッドを実行し、Databaseオブジェクトを作成します。

  1. dbe.OpenDatabase(Name, [Options], [ReadOnly], [Connect])

引数として指定できる項目は下表の通りですが、指定必須の引数はNameだけです。

引数 説明
Name データベースのパス
Options True:排他モード/False:共有モード(既定値)
ReadOnly True:読み取り専用)/False:読み取り/書き込み(既定値)
Connect パスワードなどさまざまな接続情報を指定

レコードの読み出し

DatabaseオブジェクトのOpenRecordsetメソッドを実行し、Recordsetオブジェクトを作成します。

  1. db.OpenRecordset(Name, [Type], [Options], [LockEdit])

引数として指定できる項目は下表の通りですが、指定必須の引数はNameだけです。

引数 説明
Name Recordsetの取得元(テーブル名、クエリ名、SQL)を指定
Type Recordsetオブジェクトの種類を指定
Options Recordsetオブジェクトの特性を指定
LockEdit レコードロックの種類を指定

Accessデータベースから検索条件と一致したレコードを読み出し

ExcelシートのA列に格納された氏名を基に、Accessの住所録を検索し、ExcelシートのB列に郵便番号、C列に住所をセットするツールです。

行番号9でDatabaseオブジェクトのOpenRecordsetメソッドにSQLを指定し、SELECT文のWHERE句で条件式を指定しています。
引用符が入れ子になっていてわかり難いですが、WHERE句の部分は『WHERE 氏名=’○□ △☆’』といった形式です。

  1. Dim sht, dbe, db, rs As Object
  2. Dim i As Integer
  3. Private Sub Sample1()
  4.     Set sht = ActiveSheet
  5.     Set dbe = New dao.DBEngine
  6.     Set db = dbe.OpenDatabase(“C:\work\住所録.mdb")
  7.     For i = 1 To sht.Cells(sht.Rows.Count, 1).End(xlUp).Row
  8.         Set rs = db.OpenRecordset(“SELECT 氏名,郵便番号,住所 from 住所録 WHERE 氏名='" & sht.Cells(1, 1) & “'")
  9.         If rs.EOF = False Then
  10.             sht.Cells(1, 2) = rs.Fields(“郵便番号")
  11.             sht.Cells(1, 3) = rs.Fields(“住所")
  12.         End If
  13.     Next i
  14.     Set rs = Nothing
  15.     db.Close
  16.     Set db = Nothing
  17.     Set dbe = Nothing
  18. End Sub

Accessデータベースから全レコードを読み出し

単純にAccessの住所録を全件読み出し、Excelシートに出力するツールです。

行番号8でDatabaseオブジェクトのOpenRecordsetメソッドにSQLを指定し、全レコードを読み出しています。
行番号9はExcelの機能で、RangeオブジェクトのCopyFromRecordsetメソッドを使用しています。

  1. Dim sht, dbe, db, rs As Object
  2. Dim i As Integer
  3. Private Sub Sample2()
  4.     Set sht = ActiveSheet
  5.     Set dbe = New dao.DBEngine
  6.     Set db = dbe.OpenDatabase(“C:\work\住所録.mdb")
  7.     Set rs = db.OpenRecordset(“SELECT 氏名,郵便番号,住所 from 住所録")
  8.     sht.Cells(1, 1).CopyFromRecordset rs
  9.     Set rs = Nothing
  10.     db.Close
  11.     Set db = Nothing
  12.     Set dbe = Nothing
  13. End Sub

Accessデータベースのテーブル名およびフィールド名を読み出し

Accessデータベースのテーブル名とフィールド名を一覧にしてExcelシートに出力するツールです。

行番号9でDatabaseオブジェクトのTableDefsプロパティでTableDefsコレクションを取得し、行番号10でTableDefオブジェクトのNameプロパティでテーブル名を取得しています。
また、行番号11でTableDefオブジェクトのFieldsプロパティでFieldsコレクションを取得し、行番号12でFieldオブジェクトのNameプロパティでフィールド名を取得しています。

  1. Dim sht, dbe, db, t, f As Object
  2. Dim i As Integer
  3. Private Sub Sample3()
  4.     Set sht = ActiveSheet
  5.     Set dbe = New dao.DBEngine
  6.     Set db = dbe.OpenDatabase(“C:\work\住所録.mdb")
  7.     i = 1
  8.     For Each t In db.TableDefs
  9.         sht.Cells(i, 1) = t.Name
  10.         For Each f In t.Fields
  11.             sht.Cells(i, 2) = f.Name
  12.             i = i + 1
  13.         Next f
  14.     Next t
  15.     db.Close
  16.     Set db = Nothing
  17.     Set dbe = Nothing
  18. End Sub

 

国本温子(著),緑川吉行(著),できるシリーズ編集部(著)
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ

大村あつし(著),古川順平(著)
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ

高橋宣成(著)
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ