AccessのVBAにて、テーブル内のデータの読み取り・書き込みを行うには、「DAO」と「ADO」という2つの方法があります。
ここでは、「そもそもDAO・ADOとは何か?」ということを説明したうえで、「DAO」(Data Access Objects)を使った方法をご説明いたします。
そもそも「DAO」「ADO」とは何か?
DAOとADOは、いずれもデータベースへ接続・操作する方式のことで、元々は以下のような目的で作られました。
DAO | Data Access Objects の略 | Accessで使用されるデータベースに特化した手段 |
ADO | ActiveX Data Object の略 | Accessに限らず、各社の主要なデータベース (SQL ServerやMySQL等)でも幅広く使える接続手段 |
しかし、Accessにリンクテーブルを貼っていれば、DAOでもAccess以外のデータベース(SQL ServerやMySQL等)の操作は可能です。
DAOの方が構文がシンプルであり、今どきのパソコンであれば性能にも大差が無いため、以下のような使い分けで良いかと思います。
- 通常はDAOを使う
- 膨大なデータ量のSQL ServerやMySQL等を扱うような、性能がシビアに求められる場面ではADOを使う
DAOでの読み取り処理
以下のようなテーブル[社員マスタ]を、1件ずつ順に読み取るサンプルコードをご紹介します。

サンプルコード
説明をコメントとして記載しましたので、参考にして下さい。
'レコードセットオブジェクトを定義
Dim objRs1 As DAO.Recordset
'レコードセットにテーブル[社員マスタ]をセット
Set objRs1 = CurrentDb.OpenRecordset("社員マスタ")
'レコードセットを全件読み込むまでループ
Do Until objRs1.EOF
'レコードセットを参照する処理
Debug.Print objRs1!社員番号 & "," & objRs1!氏名
'次のレコードに移動
objRs1.MoveNext
Loop
'最後にお作法として、オブジェクトを解放
objRs1.Close: Set objRs1 = Nothing
実行結果
101,テスト 一郎
102,テスト 次郎
103,テスト 三郎
204,テスト 史郎
205,テスト 吾郎
206,テスト 六郎
補足
レコードセットにセットしている箇所ですが、以下の例のように、OpenRecordsetの引数にSQLのSELECT文やクエリ名を記述することもできます。
▼SQL文を記述する例
※フィールド[役職]はテキストフィールドなので、検索値をシングルクォーテーション「'」で括ります。
Set objRs1 = CurrentDb.OpenRecordset("select * from 社員マスタ where 役職 = '主任'")
▼クエリを記述する例
Set objRs1 = CurrentDb.OpenRecordset("クエリ1")
DAOでの書き込み(レコード追加)処理
先ほどのテーブル[社員マスタ]に、レコードを1件追加してみます。
サンプルコード
読み取りのサンプルと共通する箇所は、コメントを割愛しています。
Dim objRs1 As DAO.Recordset
Set objRs1 = CurrentDb.OpenRecordset("社員マスタ")
'レコードを1件追加する場合は「AddNew」を記述する
objRs1.AddNew
'追加するレコードの各フィールドに値を設定する
objRs1!社員番号 = 207
objRs1!氏名 = "テスト 七子"
objRs1!生年月日 = #7/7/2005#
'最後に「Update」を記述して編集内容を反映する
objRs1.Update
objRs1.Close: Set objRs1 = Nothing
実行結果
社員番号「207」のレコードが追加されました。

補足
各フィールドに値を設定する箇所ですが、以下の点にご注意下さい。
- テキストフィールドへの設定値はダブルクォーテーション「“」で囲む
- 日付フィールドへの設定値はシャープ「#」で囲む
下記の例では、Visual Basic Editorに「#2005/7/7#」のように入力すると、自動的に「#7/7/2005#」の形式に書き換わります。
objRs1!氏名 = "テスト 七子"
objRs1!生年月日 = #7/7/2005#
DAOでの書き込み(レコード更新)処理
社員番号「204」の役職を、「係長」に更新してみます。
サンプルコード
Dim objRs1 As DAO.Recordset
Set objRs1 = CurrentDb.OpenRecordset("select * from 社員マスタ where 社員番号 = 204")
'レコードを更新する場合は「Edit」を記述する
objRs1.Edit
'追加するレコードの各フィールドに値を設定する
objRs1!役職 = "係長"
'最後に「Update」を記述して編集内容を反映する
objRs1.Update
objRs1.Close: Set objRs1 = Nothing
実行結果
社員番号「204」の役職が「係長」に更新されました。

補足
今回は該当データが1件しか存在しないサンプルにした為、ループ処理をせずに単純に「objRs1.Edit」~「objRs1.Update」の部分を記述しましたが、該当データが複数件存在する可能性がある場合は、読み取り処理のサンプルコードのようなループ処理が必要です。
※次の削除処理のサンプルで、ループ処理を組み込んでみます。
DAOでのレコード削除処理
役職がNullのレコードを、削除してみます。
今度は該当データが複数件存在するサンプルとして、ループ処理を組み込んでみます。
サンプルコード
Dim objRs1 As DAO.Recordset
Set objRs1 = CurrentDb.OpenRecordset("select * from 社員マスタ where 役職 is null")
'レコードセットを全件読み込むまでループ
Do Until objRs1.EOF
'レコードを削除する場合は「Delete」を記述する
objRs1.Delete
'次のレコードに移動
objRs1.MoveNext
Loop
objRs1.Close: Set objRs1 = Nothing
実行結果
役職がNullのレコードが削除されました。

コメント