はじめに
Access VBA + ADOでSQL文を実行していると、SQL文や引数は正しいはずなのに、GoTo ErrH: に飛んでしまう現象に遭遇することがあります。
本記事では、その原因とチェックポイントを解説します。
よくある状況
mySQL = "select * from m_Name" rs.Open mySQL, g_con, adOpenStatic, adLockReadOnly, adCmdText
SQLも引数も正しいのに、rs.Openの行でGoTo ErrHに飛ぶ…
チェックポイント一覧
1. 本当にエラーが起きている行はどこ?
' この行ではなく… mySQL = "select * from m_Name" ' ↓ 実際はこっち rs.Open mySQL, g_con, adOpenStatic, adLockReadOnly, adCmdText
多くの場合、Recordset.Openの実行時です。
2. エラー内容を確認するコードを入れよう
On Error GoTo ErrH
rs.Open mySQL, g_con, adOpenStatic, adLockReadOnly, adCmdText
Exit Sub
ErrH:
MsgBox "エラー番号: " & Err.Number & vbCrLf & "内容: " & Err.Description
3. SQL文の構文は本当に接続先DBに適している?
| DB種類 | 日付リテラルの書き方 |
|---|---|
| Access(Jet/ACE) | #2025/06/10# |
| SQL Server | ‘2025-06-10’ |
| Oracle | TO_DATE(‘2025/06/10’, ‘YYYY/MM/DD’) |
- ROW_NUMBER() OVER(…) → Oracle/SQL ServerではOK、AccessではNG
- IIF(…) → AccessではOKだが、他DBではCASEに書き換え必要
4. SQL文をDBツールで「手動実行」して検証する
- SQL Server: SSMS
- Oracle: SQL Developer, A5:SQL Mk-2
- MySQL/PostgreSQL: DBeaverなど
5. SQL文を簡略化して切り分ける
SELECT * FROM T_商品 WHERE 個体番号 = '112C 23034' SELECT A.*, B.商品名 FROM T_商品 A JOIN M_商品 B ON A.商品ID = B.商品ID WHERE A.個体番号 = '112C 23034'
よくあるエラーと原因
| エラーメッセージ例 | 原因 |
|---|---|
| ORA-00907: missing right parenthesis | Oracle構文エラー |
| Syntax error in FROM clause | Access独自構文の混入 |
| Invalid column name ‘列名’ | 列名の誤字や存在しない列 |
| Cannot convert value to date | 日付の書式が不正 |
| Permission denied | 権限がない |
まとめ
- エラー内容をMsgBoxで確認
- DBで直接手動実行して再現
- SQL文を一部ずつ試す
ADOエラー診断テンプレート
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
On Error GoTo ErrHandler
rs.Open mySQL, g_con, adOpenStatic, adLockReadOnly, adCmdText
Set rs = Nothing
Exit Sub
ErrHandler:
MsgBox "エラー発生!" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"説明: " & Err.Description & vbCrLf & _
"SQL: " & vbCrLf & mySQL
VBA + ADOで「SQLも引数も完璧なはずなのにエラー」は起こりがちですが、切り分け手順で必ず原因は特定できます。
