この記事でできること
Access VBAでDAO(Data Access Objects)を使用してSQLを実行する方法を解説します。テーブルの作成(DDL)やデータの追加・更新・削除(DML)には Execute メソッドを使い、データの取得(SELECT)には OpenRecordset メソッドを使う基本的なサンプルコードと手順を確認できます。
前提条件
- Microsoft Access がインストールされている環境
- VBAの基本的な操作方法(VBEの標準モジュールにコードを貼り付けて実行できること)についての基礎知識
サンプルコード
以下のVBAコードを標準モジュールに貼り付けて実行してください。トランザクション処理を用いて、テーブル作成からデータ操作、SELECTによるイミディエイトウィンドウへの出力までの一連の流れを安全に実行します。
Public Sub ACCESSでSQLを使うサンプル()
Dim wrk As DAO.Workspace
Dim dbs As DAO.Database
Dim rs As DAO.Recordset
Set wrk = DBEngine(0)
Set dbs = CurrentDb
On Error GoTo trans_Err
' トランザクションの開始
wrk.BeginTrans
' データ定義言語(DDL)・データ操作言語(DML)は Execute を使用する
dbs.Execute "CREATE TABLE テスト(番号 INT, 名前 CHAR(10), 誕生日 DATE);", dbFailOnError
dbs.Execute "INSERT INTO テスト(番号, 名前, 誕生日) VALUES (1, '山田太郎', #2016/1/21#);", dbFailOnError
dbs.Execute "INSERT INTO テスト(番号, 名前, 誕生日) VALUES (2, '山田花子', #2016/2/21#);", dbFailOnError
dbs.Execute "INSERT INTO テスト(番号, 名前, 誕生日) VALUES (2, '山田チーズ', #2016/3/21#);", dbFailOnError
dbs.Execute "UPDATE テスト SET 名前 = '山田太郎次郎' WHERE 番号 = 1;", dbFailOnError
dbs.Execute "DELETE FROM テスト WHERE 番号 = 2;", dbFailOnError
' データ操作言語(DML)のSELECTは OpenRecordset を使用する
Set rs = dbs.OpenRecordset("SELECT * FROM テスト;")
Do Until rs.EOF
Debug.Print rs(0); " / "; rs(1); " / "; rs(2)
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
' テスト用テーブルの削除(必要に応じてコメントアウトを解除)
' dbs.Execute "DROP TABLE テスト;", dbFailOnError
' トランザクションのコミット
wrk.CommitTrans dbForceOSFlush
trans_Exit:
' クリーンアップ
If Not rs Is Nothing Then rs.Close
Set dbs = Nothing
Set wrk = Nothing
Exit Sub
trans_Err:
' エラー時のロールバック
Debug.Print "エラー発生: " & DAO.Errors(0).Description
wrk.Rollback
Resume trans_Exit
End Sub
コードの要点と使い分け
- Execute メソッド:
CREATE TABLEやINSERT,UPDATE,DELETEなど、レコードを返す必要のないSQL文(DDLおよびDML)を実行します。 - OpenRecordset メソッド:
SELECTクエリなど、結果セットを取得する必要がある場合に使用します。 - トランザクション (BeginTrans / CommitTrans / Rollback): まとまった処理の途中でエラーが発生した場合に安全にロールバックできるようにしています。
期待される出力結果
上記のコードを実行し、イミディエイトウィンドウ(Ctrl + G)を確認すると、以下のような結果が出力されます。
1 / 山田太郎 / 2016/01/21
トラブルシューティングと注意点
- すでに同名の「テスト」テーブルが存在する場合は
CREATE TABLEでエラーが発生するため、事前にテーブルを削除するか別名を指定してください。 - AccessのSQL(Jet/ACE SQL)では、日付リテラルを
#(シャープ)で囲む必要があります。
この記事の更新履歴
この記事は、生成AIを活用した自動レビュー・更新フローにより内容を見直し、必要な修正を反映しています。
2026年9月27日
- 変更未定義だったRecordset変数(rs)の宣言を追加し、コードブロック形式で正しく表示されるように修正しました。
- 追加この記事でできること、前提条件、DDL/DMLの使い分けに関する解説、および期待される出力結果を追加しました。
