Access FAQ

Access VBAでSQLを実行する方法|RunSQL・DAO.Executeの実務的な使い分け

Accessを業務で使っていると、VBAからSQLを実行する場面は必ず出てきます。
データの一括更新、取込処理、ボタン操作による登録や削除など、VBAとSQLの組み合わせはAccess開発の中核とも言えます。

一方で、

  • とりあえず動くコードを書いたまま放置されている
  • RunSQLとDAO.Executeの違いを意識せず使っている
  • 将来の改修やバージョンアップ時に手が付けられなくなる

といったケースも少なくありません。

この記事では、Access VBAでSQLを実行する代表的な方法を整理したうえで、
実務でどちらを選ぶべきか、なぜそう判断すべきかを、運用・保守の視点から解説します。

Access VBAでSQLを実行するとはどういうことか

AccessでSQLを「VBAから実行する」場面とは

Accessでは、SQLは通常「クエリ」として保存して使います。
しかし、業務システムでは次のような場面で VBAから直接SQLを実行することが多くなります。

  • フォームのボタンを押したときにデータを更新する
  • 条件に応じてSQLの内容を動的に変えたい
  • 大量データを一括でINSERT / UPDATE / DELETEしたい
  • 定期処理や疑似バッチ処理を行いたい

こうした場面では、
「保存クエリを実行する」よりも
VBA内でSQLを組み立てて実行する方が都合が良いケースが増えていきます。

保存クエリとVBA直書きSQLの違い

保存クエリは、

  • 目で見て確認しやすい
  • Access初心者にも分かりやすい

というメリットがあります。

一方で、

  • 条件分岐が増える
  • 処理パターンが増える
  • 業務が複雑化する

といった状況になると、
VBA直書きSQLの方が管理しやすいケースも出てきます。

問題は、「便利だから」という理由だけでVBA直書きSQLが増え、
実装方針が整理されないままシステムが成長してしまうことです。

Access VBAでSQLを実行する代表的な方法

Access VBAからSQLを実行する方法はいくつかありますが、
実務でよく使われるのは次の2つです。

DoCmd.RunSQLとは

DoCmd.RunSQL は、
Accessが用意している アクションクエリ実行用のメソッドです。

DoCmd.RunSQL "UPDATE テーブル名 SET フィールド = 値"

主な特徴は以下の通りです。

  • INSERT / UPDATE / DELETE などのアクションクエリ向き
  • 実行時に「○件更新しました」というメッセージが出る
  • DoCmd.SetWarnings False でメッセージ抑制が必要

Accessを触り始めた頃に、最初に覚える人も多い方法でしょう。

DAO.Executeとは

DAO.Execute は、
DAO(Data Access Objects)を使ってSQLを実行する方法です。

CurrentDb.Execute "UPDATE テーブル名 SET フィールド = 値", dbFailOnError

こちらは、より業務向け・システム向けの実装になります。

  • メッセージ表示が出ない
  • エラー制御が明確
  • トランザクション処理と相性が良い

一見すると少し難しそうに見えますが、
安定運用を考えると避けて通れない方法でもあります。

RunSQLとDAO.Executeの違いを整理する

機能・挙動の違い

両者の違いを、実務目線で整理すると次のようになります。

観点RunSQLDAO.Execute
メッセージ表示出る(抑制が必要)出ない
エラー制御曖昧になりやすい明確
トランザクション扱いにくい扱いやすい
小規模処理向いている可能
業務システム

「動く」と「安全に運用できる」は別

RunSQLは「簡単に動く」反面、
処理の結果や失敗をどう扱うかが曖昧になりがちです。

テスト環境では問題なくても、

  • データ量が増えた
  • 同時操作が増えた
  • 想定外の値が入った

といった場面で、
原因が追えないエラーに変わることがあります。

実務ではどちらを使うべきか?判断基準

RunSQLが向いているケース

RunSQLが必ずしも悪いわけではありません。
次のようなケースでは、RunSQLでも問題ないことがあります。

  • 単発のデータ更新
  • 操作する人が限定されている
  • 影響範囲が小さい処理
  • 将来的な拡張予定がない

いわば「道具として軽く使う」場面です。

DAO.Executeを選ぶべきケース

一方で、次のようなケースでは DAO.Executeを選ぶべきです。

  • 一括更新・大量データ処理
  • バッチ処理・自動処理
  • 将来的に改修・拡張が想定される
  • トラブル時に原因追跡が必要

特に、業務システムとして長く使われるAccessでは、
DAO.Executeを前提に設計しておく方が安全です。

実務でよくある失敗パターン

RunSQLのままシステムが肥大化する

最初は小さなシステムだったものが、

  • 業務追加
  • 担当者変更
  • 処理件数増加

といった理由で成長し、
RunSQLだらけのブラックボックスになるケースは珍しくありません。

結果として、

  • 誰も全体を把握できない
  • 修正が怖くて触れない
  • 改修コストが跳ね上がる

という状態に陥ります。

エラーが出ても原因が追えないSQL実装

On Error Resume Next と RunSQL の組み合わせは、
一見便利ですが非常に危険です。

  • エラーが起きても気づかない
  • データ不整合が静かに蓄積される
  • 後から原因を追えない

「止まらない」ことと「正しく動いている」ことは別です。

将来のバージョンアップ・改修を見据えた考え方

Access延命と限界の境目

Accessは非常に優秀なツールですが、
使い方を間違えると限界が一気に表面化します。

SQL実装の考え方は、
そのまま以下に影響します。

  • Accessの分割運用
  • SQL Serverへの移行
  • Webシステム化

SQL実装が移行難易度を左右する

DAO.Executeを前提に整理されたSQLは、

  • 移行時に読みやすい
  • 処理単位が明確
  • 改修範囲を特定しやすい

一方、場当たり的に書かれたRunSQLは、
移行時に最もコストがかかる要因になりがちです。

まとめ|Access VBAでSQLを実行するなら「今後」を考える

Access VBAでSQLを実行する方法として、

  • RunSQLは「手軽な道具」
  • DAO.Executeは「業務向けの道具」

と考えると分かりやすいでしょう。

重要なのは、
今動くかどうかではなく、今後どう使われるかです。

Accessは「とりあえず作れる」からこそ、
後から設計の差が大きく出ます。

システムキューブの「Accessの移行変換、mdb・adpのバージョンアップ」について

システム開発・ホームページ制作会社|株式会社システムキューブ