2013-02-26 50 views
0

我試圖使用Excel查詢MS Access(2007-2010)數據庫並將查詢打印到我的電子表格。獲取Excel VBA MS Access查詢來追加或顯示數組查詢?

以下代碼僅將字段標題打印到指定的單元格中,而不在選定的字段中打印其他數據。我哪裏錯了?提示等歡迎。

 Option Explicit 

    ' Add reference to Microsoft ActiveX Data Objects Lib 

    Public Sub main(): On Error GoTo Err_handler 

     Dim cn As ADODB.Connection 
     Set cn = New ADODB.Connection 


    'open DB connection 

     cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Databaselocation 
     cn.Open 

     Dim rs As ADODB.Recordset 
     Set rs = New ADODB.Recordset 

     'Query Stuff 

     rs.ActiveConnection = cn 
     rs.Open "SQL Query here;" 



    'does something 
     Dim fld As ADODB.Field 
     Dim rng As Range 
     Set rng = [a2] 

     For Each fld In rs.Fields 
      rng.Value = fld.Name 
      Set rng = rng.Offset(0, 2) 
     Next fld 

     Set rng = rng.Offset(2, -rs.Fields.Count) 
     rng.CopyFromRecordset rs 



    ' closes db connection 

     rs.Close 
     cn.Close 
     Set rs = Nothing 
     Set cn = Nothing 

     Exit Sub 

     Err_handler: 
      MsgBox Err.Description 

     End Sub 
+0

第一條評論:在'Set rng = rng.Offset(0,2)'這一行中,您是否每次打印某個值時都要跳過兩列?第二:CopyFromRecordset「might」只有在工作表處於活動狀態時纔有效 - 如果添加WorkSheet.Activate行,會發生什麼情況?當然,我假設您已確認您的查詢返回有效數據... – Floris 2013-02-26 22:59:10

+0

是的,查詢返回MS訪問中的有效數據。它將返回一個包含字段名稱和一行數據的列。當前的代碼將字段名打印到指定的單元格(A2)。當我將偏移量設置爲(0,0)時,出錯。我希望它只打印查詢中的列。 – Troyd 2013-02-26 23:07:30

回答

0

因爲rng.CopyFromRecordset方法將輸出記錄集並沒有間隔,所以您希望在顯示列名時不跳過一列,而不是兩列。

Set rng = rng.Offset(0, 1) 

我測試你的代碼,它不與變革而努力。

+0

隨着你的改變,它仍然像之前描述的那樣工作。它只打印列名稱。你是否說你可以讓它在列中打印值?不只是列名。 – Troyd 2013-02-27 15:42:11

+0

是的,我得到列名下的數據。 – 2013-02-27 15:46:59

+0

令人沮喪,我會嘗試一些不同的查詢,並將mabye粘貼到新的電子表格中。如果你不介意我問,你在VBA中啓用了哪些引用? – Troyd 2013-02-27 16:50:41

0

您還必須在rs(ADODB.Recordset)對象的行中循環。使用MoveNext方法移至下一行。

+0

使用此鏈接http://msdn.microsoft.com/en-us/library/office/bb243114(v=office.12).aspx我在「rng.CopyFromRecordset rs」之後放置了一行rs.movenext代碼行。它沒有工作,我是否解釋你/文章錯了? – Troyd 2013-02-26 23:14:40

+0

From http://msdn.microsoft.com/en-us/library/office/ff839240.aspx:「將ADO或DAO Recordset對象的內容複製到工作表上,從指定範圍的左上角開始。如果Recordset對象包含其中包含OLE對象的字段,則此方法失敗「可能是問題嗎?什麼數據被返回? – Floris 2013-02-26 23:21:15

+0

可能地,返回的數據是列標題或字段名稱。目前的代碼打印到預期的單元格,但我需要的行數據而不是標題:)我需要一個不同的解析方法嗎? – Troyd 2013-02-26 23:24:58