【VBA + ADO】SQL文は正しいのにエラー「GoToErrに飛ぶ原因」とその確認ポイント解説

はじめに

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

関連記事

ADOで「Editが見つかりません」エラーの原因と正しい書き方を徹底解説

【VBA小技】F3キーに独自機能を割り当てるには?Excelでファンクションキーをカスタマイズ