マイクロソフトデータベースアクセス(以下Access)は本当に意味が分からない事が多いです。
ココに注意
ちょっとしたことで数日間頭を悩ませるように事が良くあります。
今回も、簡単な更新するSQLをVBA内で動かそうとしたらエラーがでるのです。
簡単な更新SQLでハマる
クエリをSQLに変換して、VBA内に直接貼り付けてもエラーが起きることは普通です。
今回のエラーも、カンマやダブルコーテーションなどの違いからエラーが出ているという思い込みから時間が経過していきました。
フォームの値を、変数に変更して見たり、Dlookup関数を直接SQLに埋め込むような事はやめて変数にしてみたりと色々と工夫をしましたが、エラーから抜け出せません。
以下がエラーがでるコードです。
Sub input_login() Dim cn As New ADODB.Connection Dim cmd As ADODB.Command Dim SQL As String Dim schno As String Dim logu As String On Error GoTo ErrRtn schno = DLookup("auth_no", "dbo_login_user", "name='" & Me.user & "'") logu = Forms![login]![user] Set cn = CurrentProject.Connection Set cmd = New ADODB.Command cmd.ActiveConnection = cn cn.BeginTrans SQL = "UPDATE login SET user = '" & logu & "',auth_no = '" & schno & "' WHERE ID = 1" cmd.CommandText = SQL cmd.Execute cn.CommitTrans Set cmd = Nothing cn.Close: Set cn = Nothing ExitErrRtn: Exit Sub ErrRtn: MsgBox "ログインし直してください。エラー: " & Err.description cn.RollbackTrans Set cmd = Nothing cn.Close: Set cn = Nothing End End Sub
SQL = "UPDATE login SET user = '" & logu & "',auth_no = '" & schno & "' WHERE ID = 1"
上のSQLの部分でエラーが出ていると思い込んで様々な書き方を試してみましたがダメでした。
DoCmd.RunSQLにしたら問題なし
本当に簡単な更新SQLなのに3日間ほど悶々と時間が過ぎていきました。
そして、今日 DoCmd.RunSQL に行きつきました。
問題なく動いたコードが下記になります。
Sub input_login() Dim cn As New ADODB.Connection Dim SQL As String Dim schno As String Dim logu As String On Error GoTo ErrRtn schno = DLookup("auth_no", "dbo_login_user", "name='" & Me.user & "'") logu = Forms![login]![user] Set cn = CurrentProject.Connection cn.BeginTrans DoCmd.RunSQL "UPDATE login SET user = '" & logu & "',auth_no = '" & schno & "' WHERE ID = 1" cn.CommitTrans cn.Close: Set cn = Nothing ExitErrRtn: Exit Sub ErrRtn: MsgBox "ログインし直してください。エラー: " & Err.description cn.RollbackTrans cn.Close: Set cn = Nothing End End Sub
DoCmd.RunSQL "UPDATE login SET user = '" & logu & "',auth_no = '" & schno & "' WHERE ID = 1"
上のように、DoCmd.RunSQLを使ったら問題なくすんなりと動きました。
ココがダメ
この違いが自分には理解できません(´;ω;`)ウゥゥ
いつものやり方でダメならDoCmd.RunSQL
SQLをVBA内で動かす為には、定番のやり方しか頭にありませんでした。
https://pctips.jp/pc-soft/access-query-sql-vba20200401/
今回のこの件で非常に無駄な時間を使ったので、定番のやり方でダメな場合は、DoCmd.RunSQLを使ってVBA内でのSQLは動かした方がよいという事がわかりました。
残念な事に、今の自分では、この定番とDoCmd.RunSQLを使ってのやり方は何が違うのかが理解して無いってことです。
いずれは、SqlServerだけで全ての処理ができるようになるかと思うので、この問題も深く突き詰めることは止めておきます。