2017-07-31 11 views
0

以下のコードを実行すると、私の人生の間、オートメーションエラーが発生します。理由はわかりません。誰か光を当てることはできますか?Excel VBA - レンジベースのSQLからデータを取得 - オートメーションエラー

デバッグを使用すると、以下の点が強調表示されます。

rs.Open SQLStr, cn 

私は以降の列A行3の値オフに基づいてSQL DBからデータを取得する使命を帯びてきた

にいくつかの参照を見ました。 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 =" Select * from vw_WorksOrderであるべきだと思います。ITEMNO = '"&ItemNumber&"' "' – Zac

+0

どのように単純で、その問題は解決しました!それを見つけられない私の愚か者!しかし、データは引っ張られていないので、一部の頭部を傷つけることに戻る-_- –

+0

我々はすべてそれをやった。:)データの問題の場合、何も返されない場合、クエリが何かを返すことを確認するために、excel vbaの外部でクエリを実行します。そうでなければ、あなたの問題はクエリです。これが役に立ちますようにお願いします。 – Zac

答えて

0

@Zacで問題が解決する引用符の誤った使用を指摘するように、パラメータの業界のベストプラクティスを採用することにより、全く引用符や変数の連結を使用していないことを検討してください。 ADOは、Command 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 
関連する問題