2017-07-31 77 views
0

当运行下面的代码时,我不断收到一个自动化错误,对于我的生活我无法弄清楚原因。任何人都可以点亮一下吗?Excel VBA - 从基于范围的SQL中获取数据 - 自动化错误

当我使用调试它突出显示下面;

rs.Open SQLStr, cn 

我看到一些引用

我已责成得到在A列第3行起基于离值从SQL数据库的数据。的Excel工作表的

实施例:

ITEM | QTY TO PICK | QTY ON ORDER | Column 2 | Column 3 etc 

PART 1 |  5  | <Data will be populated here> 

PART 2 |  12  | <Data will be populated here> 

该代码通过一个命令按钮运行。

从SQL中提取的数据将从C3开始填充。

Private Sub CommandButton2_Click() 

' Create a connection object. 
Dim cn As ADODB.Connection 
Set cn = New ADODB.Connection 

' Provide the connection string. 
Dim strConn As String 

'Use the SQL Server OLE DB Provider. 
strConn = "Provider=SQLOLEDB;" 

'Connect to the Pubs database on the local server. 
strConn = strConn & "server=<server name>;INITIAL CATALOG=<DB Name>;" 

'Use an integrated login. 
strConn = strConn & " INTEGRATED SECURITY=sspi;" 

'Now open the connection. 
cn.Open strConn 

' 
' 

ActiveSheet.Range("C3:G10000").Clear ' clear out existing data 
Dim ItemNumber As String 

ItemNumber = Range("A3").Value 

' Create a recordset object. 
Dim rs As ADODB.Recordset 
Set rs = New ADODB.Recordset 

SQLStr = "Select * from vw_WorksOrder WHERE ITEMNO = " & ItemNumber & "" 

rs.Open SQLStr, cn 

' Copy the records into cell A1 on Sheet1. 
Sheet4.Range("C3").CopyFromRecordset rs 

' Tidy up 

rs.Close 
cn.Close 
Set rs = Nothing 
Set cn = Nothing 
+2

不要以为你的SQL格式正确。我认为它应该是'SQLStr =“选择*从vw_WorksOrder WHERE ITEMNO ='”&ItemNumber&“'”' – Zac

+0

这很简单,这就解决了这个问题!愚蠢的我没有发现它!但是,数据没有得到通过,所以回到一些头部划伤-_- –

+0

我们都已经做到了:)。对于数据问题,如果不返回任何内容,请在excel vba之外运行查询以确认查询正在返回某些内容。如果没有,那么你的问题是查询。希望这会有所帮助 – Zac

回答

0

由于@Zac指出,不正确的使用引号的,它解决的问题,可以考虑不使用引号或可变的串联都采用参数化的行业最佳实践。 ADO可以使用其命令CreateParameter方法来参数化SQL调用。

参见下面的例子使用的设置,其中一个?在准备语句用作占位符,则参数将在后面所附的定义其名称,类型,方向的尺寸,

... 
Dim cmd As New ADODB.Command 

With cmd 
    .ActiveConnection = cn 
    .CommandText = "SELECT * FROM vw_WorksOrder WHERE ITEMNO = ?" 
    .CommandType = adCmdText 
    .Parameters.Append cmd.CreateParameter("itemparam", adVarChar, adParamInput, 255, ItemNumber) 
End With 

Dim rs As New ADODB.Recordset 
Set rst = cmd.Execute 
... 

此外,另一个行业最好的做法是错误和异常处理运行时错误,AutomationError没有对调试有用。无论错误与否,您都想释放所有Set对象。在VBA中,您可以使用On Error处理来相应地输出更多有用的消息并从内存中释放对象。

Private Sub CommandButton2_Click() 
On Error Goto ErrHandle 
    '...same code but without any Set obj = Nothing (since used in ExitHandle) 

ExitHandle: 
    Set rs = Nothing 
    Set cmd = Nothing 
    Set cn = Nothing 
    Exit Sub 

ErrHandle: 
    Msgbox Err.Number & " - " & Err.Description 
    Resume ExitHandle 

End Sub