VBA中DoCmd.RunSQL执行INSERT语句的语法错误排查
问题与解决方案
问题描述
已解决“SQL语句末尾缺少分号”的错误,但仍反复出现语法错误。确认字段列表与SELECT值列表顺序一致,怀疑是空格缺失等问题,排查数小时未找到原因。同时不确定VBA执行SQL时引用窗体数值型控件的写法,Tbl_MasterPartsListAccess_ID是自动编号字段,不清楚数值型字段的引用语法。
原代码
DoCmd.RunSQL " INSERT INTO [Tbl_PartCreationLog] " & _ " (Part_Number, Customer_Name, Ship_To_Location, Unit_of_Measure, Operation1, Operation2, Operation3, Operation4, Operation5, Operation6, Operation7, " & _ " Operation8, Operation9, Operation10, Operation11, Operation12, Operation13, Operation14, Raw_Material, RIP_Width, BD_FTG_Factor, RIP_Scrap_Rate, Resaw_Passes, " & _ " Yield_Cut , Grade, QTR, Substrate, Substrate_Thickness, Substrate_Width, Substrate_Length, Optimal_RIP_Size, Required_RIP_Size, Off_Fall, Cuts_Per_Sheet, " & _ " Thickness, Width, Length, Size_Description, Moulder_Number, Number_Of_Passes, Mould_Scrap_Rate, Wrap_Number1, Wrap_Color1, Wrap_Slit1, Wrap_Number2, " & _ " Wrap_Color2, Wrap_Slit2, Wrap_Number3, Wrap_Color3, Wrap_Slit3, Foil_Number1, Foil_Color1, Foil_Slit1, Foil1_Number_Slits, Foil_Number2, Foil_Color2, " & _ " Foil_Slit2, Foil2_Number_Slits, Foil_Number3, Foil_Color3, Foil_Slit3, Foil3_Number_Slits, Foil_Number4, Foil_Color4, Foil_Slit4, Foil4_Number_Slits, " & _ " Finish_Number, Step1, Step2, Step3, Step4, Step5, Step6, Step7, Step8, Step9, Step10, Drawing_Number, ECN_Number, Customer_Part_Number, Part_Type, Quote, " & _ " Lumber_Notes, Moulder_Notes, [Wrap/Foil_Notes], Paint_Notes, Assembly_Notes, Package_Notes, Is_Active, Access_ID) " & _ " " & _ " SELECT Part_Number, Customer_Name, Ship_To_Location, Unit_of_Measure, Operation1, Operation2, Operation3, Operation4, Operation5, Operation6, Operation7, " & _ " Operation8, Operation9, Operation10, Operation11, Operation12, Operation13, Operation14, Raw_Material, RIP_Width, BD_FTG_Factor, RIP_Scrap_Rate, Resaw_Passes, " & _ " Yield_Cut , Grade, QTR, Substrate, Substrate_Thickness, Substrate_Width, Substrate_Length, Optimal_RIP_Size, Required_RIP_Size, Off_Fall, Cuts_Per_Sheet, " & _ " Thickness, Width, Length, Size_Description, Moulder_Number, Number_Of_Passes, Mould_Scrap_Rate, Wrap_Number1, Wrap_Color1, Wrap_Slit1, Wrap_Number2, " & _ " Wrap_Color2, Wrap_Slit2, Wrap_Number3, Wrap_Color3, Wrap_Slit3, Foil_Number1, Foil_Color1, Foil_Slit1, Foil1_Number_Slits, Foil_Number2, Foil_Color2, " & _ " Foil_Slit2, Foil2_Number_Slits, Foil_Number3, Foil_Color3, Foil_Slit3, Foil3_Number_Slits, Foil_Number4, Foil_Color4, Foil_Slit4, Foil4_Number_Slits, " & _ " Finish_Number, Step1, Step2, Step3, Step4, Step5, Step6, Step7, Step8, Step9, Step10, Drawing_Number, ECN_Number, Customer_Part_Number, Part_Type, Quote, " & _ " Lumber_Notes, Moulder_Notes, [Wrap/Foil_Notes], Paint_Notes, Assembly_Notes, Package_Notes, Is_Active, Access_ID " & _ " " & _ " FROM Qry_PartCreation " & _ " " & _ " WHERE Access_ID = " & Me.Tbl_MasterPartsListAccess_ID & _ " ; "
修复要点
- 空格与语法规范:原代码中
Yield_Cut , Grade存在多余空格,虽不致命但易引发潜在问题,需删除字段间多余空格;同时去掉无意义的空字符串拼接("" & _),避免空格混乱。 - 数值型控件引用:自动编号为数值类型,直接拼接控件值即可,无需加引号。为防止控件空值导致语法错误,用
Nz函数处理,确保空值时返回有效数值(如Nz(Me.Tbl_MasterPartsListAccess_ID, 0))。 - 调试技巧:将SQL赋值给字符串变量,通过
Debug.Print strSQL输出到VBA立即窗口,复制输出的SQL到Access查询设计视图中运行,可快速定位语法错误(如字段拼写错误、空格缺失)。
修复后代码
Dim strSQL As String strSQL = "INSERT INTO [Tbl_PartCreationLog] " & _ "(Part_Number, Customer_Name, Ship_To_Location, Unit_of_Measure, Operation1, Operation2, Operation3, Operation4, Operation5, Operation6, Operation7, " & _ "Operation8, Operation9, Operation10, Operation11, Operation12, Operation13, Operation14, Raw_Material, RIP_Width, BD_FTG_Factor, RIP_Scrap_Rate, Resaw_Passes, " & _ "Yield_Cut, Grade, QTR, Substrate, Substrate_Thickness, Substrate_Width, Substrate_Length, Optimal_RIP_Size, Required_RIP_Size, Off_Fall, Cuts_Per_Sheet, " & _ "Thickness, Width, Length, Size_Description, Moulder_Number, Number_Of_Passes, Mould_Scrap_Rate, Wrap_Number1, Wrap_Color1, Wrap_Slit1, Wrap_Number2, " & _ "Wrap_Color2, Wrap_Slit2, Wrap_Number3, Wrap_Color3, Wrap_Slit3, Foil_Number1, Foil_Color1, Foil_Slit1, Foil1_Number_Slits, Foil_Number2, Foil_Color2, " & _ "Foil_Slit2, Foil2_Number_Slits, Foil_Number3, Foil_Color3, Foil_Slit3, Foil3_Number_Slits, Foil_Number4, Foil_Color4, Foil_Slit4, Foil4_Number_Slits, " & _ "Finish_Number, Step1, Step2, Step3, Step4, Step5, Step6, Step7, Step8, Step9, Step10, Drawing_Number, ECN_Number, Customer_Part_Number, Part_Type, Quote, " & _ "Lumber_Notes, Moulder_Notes, [Wrap/Foil_Notes], Paint_Notes, Assembly_Notes, Package_Notes, Is_Active, Access_ID) " & _ "SELECT Part_Number, Customer_Name, Ship_To_Location, Unit_of_Measure, Operation1, Operation2, Operation3, Operation4, Operation5, Operation6, Operation7, " & _ "Operation8, Operation9, Operation10, Operation11, Operation12, Operation13, Operation14, Raw_Material, RIP_Width, BD_FTG_Factor, RIP_Scrap_Rate, Resaw_Passes, " & _ "Yield_Cut, Grade, QTR, Substrate, Substrate_Thickness, Substrate_Width, Substrate_Length, Optimal_RIP_Size, Required_RIP_Size, Off_Fall, Cuts_Per_Sheet, " & _ "Thickness, Width, Length, Size_Description, Moulder_Number, Number_Of_Passes, Mould_Scrap_Rate, Wrap_Number1, Wrap_Color1, Wrap_Slit1, Wrap_Number2, " & _ "Wrap_Color2, Wrap_Slit2, Wrap_Number3, Wrap_Color3, Wrap_Slit3, Foil_Number1, Foil_Color1, Foil_Slit1, Foil1_Number_Slits, Foil_Number2, Foil_Color2, " & _ "Foil_Slit2, Foil2_Number_Slits, Foil_Number3, Foil_Color3, Foil_Slit3, Foil3_Number_Slits, Foil_Number4, Foil_Color4, Foil_Slit4, Foil4_Number_Slits, " & _ "Finish_Number, Step1, Step2, Step3, Step4, Step5, Step6, Step7, Step8, Step9, Step10, Drawing_Number, ECN_Number, Customer_Part_Number, Part_Type, Quote, " & _ "Lumber_Notes, Moulder_Notes, [Wrap/Foil_Notes], Paint_Notes, Assembly_Notes, Package_Notes, Is_Active, Access_ID " & _ "FROM Qry_PartCreation " & _ "WHERE Access_ID = " & Nz(Me.Tbl_MasterPartsListAccess_ID, 0) & ";" ' 调试用:输出SQL到立即窗口,复制到Access查询中测试 Debug.Print strSQL DoCmd.RunSQL strSQL
内容的提问来源于stack exchange,提问作者Zrhoden
相关产品推荐
相关产品推荐

