AccessのVBAにて、直接SQLを実行する方法をご説明いたします。
AccessのVBAを書籍でコツコツ学習したい方はこちら
リンク
参照(SELECT)
以下のようなテーブル[社員マスタ]を、SELECT文で読み取る方法をご説明します。

結論としては、DAOまたはADOを使えば実行可能です。
以下の記事も合わせてご覧ください。
例1:普通に読み取る場合
以下の「CurrentDb.OpenRecordset」の引数で、テーブル名だけを指定しても同じ結果になりますが、SQL文も記述可能です。
'レコードセットオブジェクトを定義
Dim objRs1 As DAO.Recordset
'レコードセットにテーブル[社員マスタ]をセット
Set objRs1 = CurrentDb.OpenRecordset("SELECT * FROM 社員マスタ")
'レコードセットを全件読み込むまでループ
Do Until objRs1.EOF
'レコードセットを参照する処理
Debug.Print objRs1!社員番号 & "," & objRs1!氏名
'次のレコードに移動
objRs1.MoveNext
Loop
'最後にお作法として、オブジェクトを解放
objRs1.Close: Set objRs1 = Nothing
実行結果
101,テスト 一郎
102,テスト 次郎
103,テスト 三郎
204,テスト 史郎
205,テスト 吾郎
206,テスト 六郎
例2:抽出(WHERE句)・ソート(ORDER BY句)を行う場合
以下のように、「CurrentDb.OpenRecordset」の引数にWHERE句やORDER BY句を記述することも可能です。
※「CurrentDb.OpenRecordset」以外の箇所は、先ほどの「例1」と同様です。
Set objRs1 = CurrentDb.OpenRecordset("SELECT * FROM 社員マスタ WHERE 役職 = '主任' ORDER BY 生年月日 DESC")
実行結果
205,テスト 吾郎
204,テスト 史郎
更新系(INSERT, UPDATE, DELETE)
更新系のSQL文は、「DoCmd.RunSQL」で実行できます。
DAO・ADOの記事でご説明したサンプルのように、該当レコードが複数件存在しても、ループさせる必要がありませんので、簡単な処理では、以下の例のようにSQL文を直接実行したほうがシンプルにコーディングできます。
なお、「DoCmd.RunSQL」を実行する都度ワーニングが出ますので、「DoCmd.SetWarnings」でワーニングを非表示にすることを推奨します。
レコード追加(INSERT)の例
先ほどのテーブル[社員マスタ]に、レコードを1件追加してみます。
DoCmd.SetWarnings False 'ワーニングを非表示にする
DoCmd.RunSQL "INSERT INTO 社員マスタ(社員番号, 氏名, 生年月日) VALUES(207, 'テスト 七子', #2005/7/7#)"
DoCmd.SetWarnings True 'ワーニングを表示する状態に戻す
レコード追加(INSERT)の実行結果
社員番号「207」のレコードが追加されました。

レコード更新(UPDATE)の例
社員番号「204」の役職を、「係長」に更新してみます。
DoCmd.SetWarnings False 'ワーニングを非表示にする
DoCmd.RunSQL "UPDATE 社員マスタ SET 役職 = '係長' WHERE 社員番号 = 204"
DoCmd.SetWarnings True 'ワーニングを表示する状態に戻す
レコード更新(UPDATE)の実行結果
社員番号「204」の役職が「係長」に更新されました。

レコード削除(DELETE)の例
役職がNullのレコードを、削除してみます。
今度は該当データが複数件存在しますが、DAOやADOの時のようなループ処理は不要です。
DoCmd.SetWarnings False 'ワーニングを非表示にする
DoCmd.RunSQL "DELETE FROM 社員マスタ WHERE 役職 IS NULL"
DoCmd.SetWarnings True 'ワーニングを表示する状態に戻す
レコード削除(DELETE)の実行結果
役職がNullのレコードが削除されました。

AccessのVBAを書籍でコツコツ学習したい方はこちら
リンク
コメント