2014-12-08 2 views
1

СитуацияExcel VBA - Обновить выбранные запросы/соединения

У меня есть 5 Workbook connections установить, что данные запроса из базы данных MS Access, и я дал им имена qry_1, qry_2, ..., qry_5

у меня есть выбор из этих имен запросов, перечисленных в таблице называется qry_Table на листе:

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

и Я могу перебрать таблицы (используя .listObjects), чтобы получить имя каждого запроса как string

Вопрос

Я могу перебрать все запросы в книге и обновлять их все, но я не могу показаться, чтобы определить, как выбирать и обновлять только те запросы, перечисленные в таблице, а именно qry_1, qry_4 и qry_5.

Я хочу, чтобы иметь возможность set объекта запроса, чтобы я мог определить строку .Connection.

Возможно ли это?

Примечания

Этот код показывает, как я получаю каждую строку в столбце Query Name таблицы 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 

И для обновления всех запросов в книге я могу использовать

'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 (ул) .refresh'? – Rory

+0

Я не думал об этом, и да, это работало для обновления индивидуальных запросов. Однако то, что я не ясно объяснил в своем вопросе, состояло в том, что я хочу также установить свойство '.Connection' запроса. Я обновил свой вопрос. – tospig

+1

Ваша часть 2 должна быть: 'С wks.Listobjects (str) .QueryTable' – Rory

ответ

3

Вам необходимо обратиться к ListObject по имени, а не соединение, а затем получить доступ к его Querytable свойство:

With wks.Listobjects(str).QueryTable 
0

с помощью str = .Rows(i) вы назначаете диапазон всей строки на str, замена строки на str = .Cells(i,1).Value должна работать, так как она вернет значение в первом столбце строки i.

+0

Однако это все еще не позволяет мне «задавать» объект запроса – tospig