はじめに
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も引数も完璧なはずなのにエラー」は起こりがちですが、切り分け手順で必ず原因は特定できます。