Access VBAを開発していると、
- 大量データを一括更新したい
- レコードセット処理が遅い
- CSV取込後に一括変換したい
- 削除処理を高速化したい
- バッチ処理を効率化したい
という場面が頻繁にあります。
データの追加・更新・削除を行う場合はDAO RecordsetよりCurrentDb.Executeを優先的に検討するべきです。
実務では、
売上確定処理
CSV取込後の更新
履歴作成
在庫更新
バッチ処理
など、多くのシステムで利用されています。
Access VBA開発者なら必ず覚えておきたい重要機能です。
- CurrentDb.Executeとは
- なぜExecuteが重要なのか
- Executeを利用すると
- 基本構文
- 逆引き① データを更新したい
- 逆引き② 条件付き更新したい
- 逆引き③ データを追加したい
- 逆引き④ データを削除したい
- 逆引き⑤ テーブルを初期化したい
- RecordsAffectedで更新件数取得
- 実務活用例① CSV取込システム
- 実務活用例② 売上管理システム
- 実務活用例③ 顧客管理システム
- 実務活用例④ ログ管理
- 実務活用例⑤ 夜間バッチ処理
- DAO Recordsetとの比較
- dbFailOnErrorを利用する
- トランザクションと組み合わせる
- ベテラン開発者の定番コード
- Copilot活用術① UPDATE文作成
- Copilot活用術② SQLレビュー
- Copilot活用術③ 高速化相談
- Execute利用時の注意点
- CurrentDb.Executeが向いている処理
- 開発現場での利用頻度
- まとめ
CurrentDb.Executeとは
CurrentDb.Executeは、
SQLを直接実行
↓
高速処理
↓
結果反映
する機能です。
なぜExecuteが重要なのか
初心者がよく書くコードです。
Do Until rs.EOF
rs.Edit
rs!区分 = "A"
rs.Update
rs.MoveNext
Loop
1000件なら問題ありません。
しかし
10万件
50万件
100万件
になると非常に遅くなります。
Executeを利用すると
CurrentDb.Execute _
"UPDATE T_CUSTOMER " & _
"SET 区分='A'"
になります。
効果
高速
簡潔
保守しやすい
になります。
基本構文
CurrentDb.Execute strSQL
サンプル
CurrentDb.Execute _
"UPDATE T_CUSTOMER " & _
"SET 顧客区分='A'"
逆引き① データを更新したい
最も利用頻度が高い処理です。
CurrentDb.Execute _
"UPDATE T_CUSTOMER " & _
"SET 顧客区分='A'"
結果
全件更新
できます。
逆引き② 条件付き更新したい
実務向けです。
CurrentDb.Execute _
"UPDATE T_CUSTOMER " & _
"SET 顧客区分='A' " & _
"WHERE 売上金額 > 100000"
効果
対象データのみ更新できます。
逆引き③ データを追加したい
INSERT文です。
CurrentDb.Execute _
"INSERT INTO T_CUSTOMER " & _
"(顧客コード,顧客名) " & _
"VALUES " & _
"('C001','東京商事')"
効果
レコード追加できます。
逆引き④ データを削除したい
DELETE文です。
CurrentDb.Execute _
"DELETE FROM T_WORK"
注意
全件削除になります。
条件付きがおすすめです。
CurrentDb.Execute _
"DELETE FROM T_WORK " & _
"WHERE 更新日 < Date()-30"
逆引き⑤ テーブルを初期化したい
一時テーブル管理です。
CurrentDb.Execute _
"DELETE FROM T_IMPORT"
活用
CSV取込前
一時データ削除
です。
RecordsAffectedで更新件数取得
実務では非常によく利用します。
CurrentDb.Execute strSQL
件数確認
Debug.Print _
CurrentDb.RecordsAffected
結果
更新件数
取得できます。
実務活用例① CSV取込システム
取込後のデータ補正です。
例
電話番号整形
CurrentDb.Execute _
"UPDATE T_IMPORT " & _
"SET 電話番号 = " & _
"Replace([電話番号],'-','')"
効果
一括補正できます。
実務活用例② 売上管理システム
月次処理です。
CurrentDb.Execute _
"UPDATE T_SALES " & _
"SET 状態='確定' " & _
"WHERE 売上月='202609'"
効果
大量更新できます。
実務活用例③ 顧客管理システム
ランク更新です。
CurrentDb.Execute _
"UPDATE T_CUSTOMER " & _
"SET ランク='VIP' " & _
"WHERE 年間売上 > 1000000"
効果
自動判定できます。
実務活用例④ ログ管理
古い履歴削除です。
CurrentDb.Execute _
"DELETE FROM T_LOG " & _
"WHERE 実行日 < Date()-90"
効果
容量削減できます。
実務活用例⑤ 夜間バッチ処理
定期更新です。
集計
更新
履歴作成
に利用します。
DAO Recordsetとの比較
Recordset
rs.Edit
rs.Update
向いている処理
1件編集
画面連携
個別処理
Execute
CurrentDb.Execute
向いている処理
一括更新
大量処理
バッチ処理
開発現場の基本方針
検索
↓
Recordset
更新
↓
Execute
が多いです。
dbFailOnErrorを利用する
実務では必須です。
通常
CurrentDb.Execute strSQL
推奨
CurrentDb.Execute _
strSQL, _
dbFailOnError
メリット
エラー検出できます。
トランザクションと組み合わせる
重要な更新です。
DBEngine.BeginTrans
CurrentDb.Execute _
strSQL1
CurrentDb.Execute _
strSQL2
DBEngine.CommitTrans
エラー
DBEngine.Rollback
効果
データ整合性を守れます。
ベテラン開発者の定番コード
実務で最もよく見る形です。
On Error GoTo ErrHandler
CurrentDb.Execute _
strSQL, _
dbFailOnError
MsgBox _
CurrentDb.RecordsAffected & _
"件更新"
Exit Sub
ErrHandler:
MsgBox _
Err.Description
非常に利用頻度が高いです。
Copilot活用術① UPDATE文作成
Copilotへの依頼例です。
Access VBAです。
CurrentDb.Executeで
顧客ランクを更新する
コードを作成してください。
Copilot活用術② SQLレビュー
以下のExecute用SQLを
レビューしてください。
Copilot活用術③ 高速化相談
Recordset更新処理です。
Executeへ変更して
高速化してください。
Execute利用時の注意点
SELECT文には使えない
検索は
OpenRecordset
です。
WHERE句忘れ
危険です。
UPDATE
すると全件更新になります。
DELETE文に注意
誤削除防止を考えましょう。
dbFailOnError推奨
品質向上につながります。
CurrentDb.Executeが向いている処理
特に活躍するのは次の処理です。
- CSV取込後の補正
- ランク更新
- 在庫更新
- バッチ処理
- ログ削除
- 売上確定
- 履歴作成
開発現場での利用頻度
| 順位 | 用途 |
|---|---|
| 1位 | UPDATE |
| 2位 | DELETE |
| 3位 | INSERT |
| 4位 | バッチ処理 |
| 5位 | CSV取込補正 |
DAO開発では毎日のように利用します。
まとめ
CurrentDb.ExecuteはAccess VBAで高速なデータ更新を実現するための最重要機能の一つです。
特に
- UPDATE
- INSERT
- DELETE
- CSV取込
- バッチ処理
- 売上確定
などで大きな効果を発揮します。
初心者の方はまず次のコードを覚えましょう。
CurrentDb.Execute _
strSQL, _
dbFailOnError
これだけで実務システムの更新処理の大部分に対応できます。
Copilotと組み合わせることで、
- SQL作成
- コードレビュー
- 高速化検討
も効率良く行えるようになります。

コメント