2014-12-08 5 views
1

상황엑셀 VBA - 새로 고침 선택 쿼리/연결

내가 5 Workbook connections는 MS Access 데이터베이스에서 해당 쿼리 데이터를 설정할 수 있고, 내가 이름 qry_1, qry_2 그들에게 준, ..., qry_5

나는 테이블에 나열된 이러한 쿼리 이름의 선택이 워크 시트에 qry_Table를 불렀다 :

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

및 나는

나는 모든 쿼리를 통합 문서와 모두 새로 고침을 반복하지만 난 수없는 것 수 string

질문으로 각 쿼리 이름을 얻기 위해 테이블을 통해 루프 (.listObjects 사용) 할 수 있습니다 표에 나열된 검색어 (예 : qry_1, qry_4qry_5) 만 선택하고 새로 고치는 방법을 알아 봅니다.

나는 .Connection 문자열을 정의 할 수 있도록 set 쿼리 개체를 사용하고 싶습니다.

이것이 가능합니까?

노트

내가 사용할 수있는 테이블 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

+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

그러나, 그것은 여전히 ​​나에게 질의 객체를'set'시키지 않는다. – tospig