2014-12-08 158 views
1

形勢Excel的VBA - 刷新選定的查詢/連接

我有5 Workbook connections從MS Access數據庫的建立是查詢數據,我已經給了他們的名字qry_1qry_2,...,qry_5

我已經選擇在表中列出這些查詢名稱叫qry_Table在工作表:

Query Name 
---------- 
qry_1 
qry_4 
qry_5 

和我可以通過表圈(用.listObjects)來獲取每個查詢的名稱作爲string

問題

我,但我似乎可以通過所有的查詢工作簿中並刷新所有這些,循環不能以確定如何僅選擇和刷新表中列出的查詢,即qry_1,qry_4qry_5

我希望能夠set查詢對象,以便我也可以定義.Connection字符串。

這可能嗎?

注意

這裏的代碼顯示瞭如何獲得表qry_Table

dim wksControl As worksheet 
    dim objList As ListObject 

    set wksControl = worksheets("Control") 'the worksheet that contains 'qry_Table' 
    Set objList = wksControl.ListObjects("qry_Table") 

    With objList.ListColumns("Query Name").DataBodyRange 

     For i = 1 To .Rows.count    
      str = .Rows(i) 'query name to refresh 
      '***Required: Define the qry to refresh 
      Set qry = .QueryTable(str) '<~~ this code fails 
      'code to .Refresh BackgroundQuery:=False 

     Next i 
    End With 

以及刷新工作簿中的所有查詢的列Query Name每一行,我可以使用

'code for generic query connections 
    For Each objList In wks.ListObjects 
     If objList.SourceType = xlSrcQuery Then 'only refresh if it's the right query type 

      'ensure it's using the right connection/database as specified on the Control sheet 
      strConnection = "ODBC;DSN=MS Access Database;DBQ=" & Range("dbFilePath") & _ 
       Range("dbName") & ";DefaultDir=" & Range("dbFilePath") & _ 
        ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;" 

      With objList.QueryTable 
       .Connection = strConnection 
       .BackgroundQuery = False 
       .Refresh 
      End With 
      count = count + 1 
     End If 

    Next 
+0

您是否嘗試過簡單的'activeworkbook.connections(STR).refresh'? – Rory 2014-12-08 08:02:18

+0

我沒有想到這一點,是的它適用於刷新個人查詢。但是,我沒有在我的問題中明確表示,我希望能夠設置查詢的'.Connection'屬性。我相應地更新了我的問題。 – tospig 2014-12-08 22:58:18

+1

你的第2部分將需要:'用wks.Listobjects(str).QueryTable' – Rory 2014-12-09 11:49:20

回答

3

您需要通過名稱來指代ListObject,而不是連接,然後訪問其Querytable屬性:

With wks.Listobjects(str).QueryTable 
0

使用str = .Rows(i)您正在將整行的範圍分配給str,用str = .Cells(i,1).Value替換該行應該可以工作,因爲它將返回i行的第一列中的值。

+0

但是,這仍然不讓我「設置」一個查詢對象 – tospig 2014-12-08 22:54:00