2017-07-31 101 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