2009-07-13 122 views
23

我複製從MSDN的VBA代碼片段,顯示我如何抓住從一個SQL查詢到Excel工作表的結果(Excel 2007中):訪問SQL數據庫在Excel的VBA

Sub GetDataFromADO() 

    'Declare variables' 
     Set objMyConn = New ADODB.Connection 
     Set objMyCmd = New ADODB.Command 
     Set objMyRecordset = New ADODB.Recordset 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;" 
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     Set objMyCmd.ActiveConnection = objMyConn 
     objMyCmd.CommandText = "select * from myTable" 
     objMyCmd.CommandType = adCmdText 
     objMyCmd.Execute 

    'Open Recordset' 
     Set objMyRecordset.ActiveConnection = objMyConn 
     objMyRecordset.Open objMyCmd 

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

End Sub 

我已經加入微軟ActiveX Data Objects 2.1 Library作爲參考。這個數據庫是可以訪問的。

現在,當我運行這個子程序,它有一個錯誤:

運行時錯誤3704:當對象被關閉的操作是不允許的。

的聲明:

ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

任何想法,爲什麼?

謝謝。

+0

幫助!我有同樣的錯誤,但下面的解決方案沒有幫助:http://stackoverflow.com/questions/1682717/vba-adodb-run-time-error-3704 – Steven 2009-11-05 23:17:56

回答

20

我已將初始目錄添加到連接字符串。我也放棄了ADODB.Command語法,只是簡單地創建自己的SQL語句並打開該變量的記錄集。

希望這會有所幫助。

Sub GetDataFromADO() 
    'Declare variables' 
     Set objMyConn = New ADODB.Connection 
     Set objMyRecordset = New ADODB.Recordset 
     Dim strSQL As String 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDatabase;User ID=abc;Password=abc;" 
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     strSQL = "select * from myTable" 

    'Open Recordset' 
     Set objMyRecordset.ActiveConnection = objMyConn 
     objMyRecordset.Open strSQL    

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

End Sub 
+2

它爲我工作,謝謝,記得添加對Microsoft ActiveX Data Objects 2.1的引用,我添加了2.6版本。你也不需要在最後關閉連接嗎?像objMyRecordset.Close? – 2015-01-15 14:18:41

0

這是一個正確的連接字符串?
SQL Server實例位於何處?

您將需要驗證您是否能夠使用上面指定的連接字符串與SQL Server相關聯。

編輯:看看記錄集的狀態屬性,看看它是否打開?
另外,在打開記錄集之前,將CursorLocation屬性更改爲adUseClient。

1

我坐在電腦上,沒有任何相關的軟件,但從內存中看,代碼看起來不對。您正在執行該命令,但丟棄objMyCommand.Execute返回的RecordSet

我會怎麼做:

Set objMyRecordset = objMyCommand.Execute 

...然後失去了 「開放式記錄」 的一部分。

15

更改建議:

  • 不要調用Command對象的Execute方法;
  • 將Recordset對象的Source屬性設置爲您的Command對象;
  • 調用不帶參數的Recordset對象的Open方法;
  • 在調用CopyFromRecordset;時刪除Recordset對象周圍的括號;
  • 其實聲明變量:)

修改後的代碼:

Sub GetDataFromADO() 

    'Declare variables' 
     Dim objMyConn As ADODB.Connection 
     Dim objMyCmd As ADODB.Command 
     Dim objMyRecordset As ADODB.Recordset 

     Set objMyConn = New ADODB.Connection 
     Set objMyCmd = New ADODB.Command 
     Set objMyRecordset = New ADODB.Recordset 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;"  
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     Set objMyCmd.ActiveConnection = objMyConn 
     objMyCmd.CommandText = "select * from mytable" 
     objMyCmd.CommandType = adCmdText 

    'Open Recordset' 
     Set objMyRecordset.Source = objMyCmd 
     objMyRecordset.Open 

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset objMyRecordset 

End Sub 
+0

+1用於刪除括號。不必要的括號與對象引用相結合似乎會導致奇怪的VBA錯誤 – barrowc 2009-07-13 23:14:11

0

添加set nocount on到存儲過程的開始(如果你的SQL服務器上)。我剛剛在自己的工作中解決了這個問題,它是由中間結果引起的,如"1203 Rows Affected",正在加載到我試圖使用的Recordset中。

0

@firedrawndagger:列出字段名稱/列表頭遍歷記錄字段集合並插入名稱:

Dim myRS as ADODB.Recordset 
Dim fld as Field 
Dim strFieldName as String 

For Each fld in myRS.Fields 
    Activesheet.Selection = fld.Name 
    [Some code that moves to next column] 
Next