PR

【Access VBA】DAOを使ったデータの読み取り・書き込み

Access
記事内に広告を含む場合があります。

AccessのVBAにて、テーブル内のデータの読み取り・書き込みを行うには、「DAO」と「ADO」という2つの方法があります。
ここでは、「そもそもDAO・ADOとは何か?」ということを説明したうえで、「DAO」(Data Access Objects)を使った方法をご説明いたします。

AccessのVBAを書籍でコツコツ学習したい方はこちら

そもそも「DAO」「ADO」とは何か?

DAOとADOは、いずれもデータベースへ接続・操作する方式のことで、元々は以下のような目的で作られました。

DAOData Access Objects の略Accessで使用されるデータベースに特化した手段
ADOActiveX 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のレコードが削除されました。

AccessのVBAを書籍でコツコツ学習したい方はこちら
VBAをガッツリ学べるスクールはこちら

コメント

タイトルとURLをコピーしました