如何从Excel VBA用户窗体显示SQL语法错误

我想问一些帮助,这里是上下文:我正在使用连接到我的SQL Server的Excel工作簿,所以用户可以使用它来使用一些macros+button进行一些查询。

他问我是否可以在Excel和SQL Server之间创build一个接口,就像使用DBMS一样,显示一个用户表单来input查询,如果出现语法错误,它会显示给你)。

这是我的问题:我已经成功创build了界面,但是我不能显示语法错误。 它只显示消息:“运行时错误”1004“SQL语法错误”。

如果你正在使用DBMS,可以显示正确的消息吗?


为了更容易理解,这是我的代码:

Function Query(SQL As String) On Error GoTo Err_handler With ActiveSheet.QueryTables.Add(Connection:= _ "ODBC;DSN=mydb;Description=test;UID=test;PWD=test;APP=Microsoft Office 2003;WSID=test123" _ , Destination:=Range("A1")) .CommandText = (SQL) .Name = "test" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .Refresh BackgroundQuery:=False End With Exit Function Err_handler: MsgBox Err.Number & " - " & Err.Description End Function 

提前致谢!

你需要使用像ActiveX Data Objects库( ADODB )的东西,所以你可以得到特定的连接信息。 因此,在运行代码时,SQL将在ADO对象上引发错误,但是Err对象将包含从数据库冒泡的SQL特定的错误信息。

您需要在VBA项目中添加对ActiveX Data ObjectsReference 。 一旦你做完了,然后试试这个:

 Function MyQuery(SQL As String) Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset On Error GoTo Err_handler 'DB Connection Object Set cn = New ADODB.Connection cn.Open "DSN=mydb;Description=test;UID=test;PWD=test;APP=Microsoft Office 2003;WSID=test123" 'SQL Command Object Set cmd = New ADODB.Command cmd.ActiveConnection = cn cmd.CommandType = adCmdText cmd.CommandText = SQL 'Recordset Object to contain results Set rs = cmd.Execute With ActiveSheet.QueryTables.Add(Connection:=rs, Destination:=Range("A1")) .Name = "test" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .Refresh BackgroundQuery:=False End With MyQueryx: 'Clean up - close connections and destroy objects If Not rs Is Nothing Then If rs.State = ADODB.adStateOpen Then rs.Close End If Set rs = Nothing End If If Not cmd Is Nothing Then Set cmd.ActiveConnection = Nothing Set cmd = Nothing End If If Not cn Is Nothing Then If cn.State = ADODB.adStateOpen Then cn.Close End If Set cn = Nothing End If Exit Function Err_handler: MsgBox Err.Number & " - " & Err.Description 'Goto to the function exit to clean up GoTo MyQueryx End Function