Excel VBAでオブジェクト指向プログラミング(DAO編)
■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]ボタンを押下。
②オブジェクト変数の定義
プログラムの宣言部でオブジェクト変数を定義。
- Dim dbe As Object
③インスタンスの生成
プログラムの処理部でインスタンスを生成。
- Set dbe = New dao.DBEngine
- 'ここにDAOを使用した処理を記述
- Set dbe = Nothing
(参考)「Set dbe = New dao.DBEngine」の部分を「Set dbe = CreateObject(“DAO.DBEngine.120")」と記述すれば、ステップ①(ライブラリの参照設定)は不要です。
■DAOの使用方法
DAOでデータベースをオープンし、レコードを読み出す処理について、詳細な手順を説明します。
データベースのオープン
DBEngineオブジェクトのOpenDatabaseメソッドを実行し、Databaseオブジェクトを作成します。
- dbe.OpenDatabase(Name, [Options], [ReadOnly], [Connect])
引数として指定できる項目は下表の通りですが、指定必須の引数はNameだけです。
引数 | 説明 |
---|---|
Name | データベースのパス |
Options | True:排他モード/False:共有モード(既定値) |
ReadOnly | True:読み取り専用)/False:読み取り/書き込み(既定値) |
Connect | パスワードなどさまざまな接続情報を指定 |
レコードの読み出し
DatabaseオブジェクトのOpenRecordsetメソッドを実行し、Recordsetオブジェクトを作成します。
- 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 氏名=’○□ △☆’』といった形式です。
- Dim sht, dbe, db, rs As Object
- Dim i As Integer
- Private Sub Sample1()
- Set sht = ActiveSheet
- Set dbe = New dao.DBEngine
- Set db = dbe.OpenDatabase(“C:\work\住所録.mdb")
- For i = 1 To sht.Cells(sht.Rows.Count, 1).End(xlUp).Row
- Set rs = db.OpenRecordset(“SELECT 氏名,郵便番号,住所 from 住所録 WHERE 氏名='" & sht.Cells(1, 1) & “'")
- If rs.EOF = False Then
- sht.Cells(1, 2) = rs.Fields(“郵便番号")
- sht.Cells(1, 3) = rs.Fields(“住所")
- End If
- Next i
- Set rs = Nothing
- db.Close
- Set db = Nothing
- Set dbe = Nothing
- End Sub
Accessデータベースから全レコードを読み出し
単純にAccessの住所録を全件読み出し、Excelシートに出力するツールです。
行番号8でDatabaseオブジェクトのOpenRecordsetメソッドにSQLを指定し、全レコードを読み出しています。
行番号9はExcelの機能で、RangeオブジェクトのCopyFromRecordsetメソッドを使用しています。
- Dim sht, dbe, db, rs As Object
- Dim i As Integer
- Private Sub Sample2()
- Set sht = ActiveSheet
- Set dbe = New dao.DBEngine
- Set db = dbe.OpenDatabase(“C:\work\住所録.mdb")
- Set rs = db.OpenRecordset(“SELECT 氏名,郵便番号,住所 from 住所録")
- sht.Cells(1, 1).CopyFromRecordset rs
- Set rs = Nothing
- db.Close
- Set db = Nothing
- Set dbe = Nothing
- End Sub
Accessデータベースのテーブル名およびフィールド名を読み出し
Accessデータベースのテーブル名とフィールド名を一覧にしてExcelシートに出力するツールです。
行番号9でDatabaseオブジェクトのTableDefsプロパティでTableDefsコレクションを取得し、行番号10でTableDefオブジェクトのNameプロパティでテーブル名を取得しています。
また、行番号11でTableDefオブジェクトのFieldsプロパティでFieldsコレクションを取得し、行番号12でFieldオブジェクトのNameプロパティでフィールド名を取得しています。
- Dim sht, dbe, db, t, f As Object
- Dim i As Integer
- Private Sub Sample3()
- Set sht = ActiveSheet
- Set dbe = New dao.DBEngine
- Set db = dbe.OpenDatabase(“C:\work\住所録.mdb")
- i = 1
- For Each t In db.TableDefs
- sht.Cells(i, 1) = t.Name
- For Each f In t.Fields
- sht.Cells(i, 2) = f.Name
- i = i + 1
- Next f
- Next t
- db.Close
- Set db = Nothing
- Set dbe = Nothing
- End Sub
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ
ディスカッション
コメント一覧
まだ、コメントがありません