2013-04-25 15 views
6

w moim ostatnim poście Auto refresh pivottables data in excel on first run, stwierdziliśmy, że na moim pierwszego wykonaniazapytań z zewnętrznego źródła danych jest odświeżony i trwa około 1 min wykonać. W drugim uruchomieniu tabele przestawne są aktualizowane.odświeżania zarówno zewnętrznego źródła danych oraz Tabele przestawne razem w wyznaczonym terminie

Czy istnieje rozwiązanie (kodu VBA), aby odświeżyć zarówno zewnętrznego źródła danych i tabele przestawne razem w wyznaczonym terminie (jeśli przypuszczać możemy ustawić timer) klikając command button?

+0

"Pierwsza rzecz pierwsza", co oznacza, że ​​powinieneś być pewien, że zapytanie zostanie odświeżone przed aktualizacją PT. w zależności od sposobu utworzenia zapytania możliwe jest kontrolowanie zdarzenia 'AfterRefresh' opisanego (lub podobnego) do [tego opisu] (http://msdn.microsoft.com/en-us/library/ff835922%28v=office.14 % 29.aspx) ... niż możesz odświeżyć się, upewniając się, że twoje dane są aktualne. –

+0

Moje dane są aktualizowane co noc. – user42995

+0

co z 'Application.OnTime'? –

Odpowiedz

17

W ustawieniach połączenia odznacz "Włącz odświeżanie w tle". Spowoduje to odświeżenie połączenia, gdy zostanie mu przekazane, a nie w tle, tak jak inne procesy.

Po wyłączeniu odświeżania tła procedura VBA będzie czekać na odświeżenie danych zewnętrznych przed przejściem do następnego wiersza kodu.

Następnie wystarczy zmodyfikować następujący kod:

ActiveWorkbook.Connections("CONNECTION_NAME").Refresh 
Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh 

Można również wyłączyć tło odświeżania w VBA:

ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False 
+0

Dziękuję, ustawiłem 'BackgroundQuery' na' false'. Rozwiązałem mój problem, który określiłem we wcześniejszym poście. Dziękuję bardzo za poświęcony cenny czas. – user42995

+0

Dziękuję, to jest przedstawienie i zwięzła odpowiedź !! Chcę również zaktualizować tabele przestawne bez odświeżania źródła danych i pomyślałem, że potrzebuję cudu. – fuadj

8

Użyłem powyższą odpowiedź, ale skorzystał z metody RefreshAll. Zmieniłem także to ustawienie, aby umożliwić wiele połączeń bez konieczności podawania nazw. Następnie podłączyłem to do przycisku w moim arkuszu kalkulacyjnym.

Sub Refresh() 

    Dim conn As Variant 

    For Each conn In ActiveWorkbook.Connections 
     conn.ODBCConnection.BackgroundQuery = False 
    Next conn 

    ActiveWorkbook.RefreshAll 
End Sub 
0

Auto Refresh skoroszyt na przykład co 5 sek. Zastosuj do modułu

Public Sub Refresh() 
'refresh 
ActiveWorkbook.RefreshAll 

alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss 
    Application.OnTime alertTime, "Refresh" 

End Sub 

Zastosuj do skoroszytu na Open

Private Sub Workbook_Open() 
alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss 
Application.OnTime alertTime, "Refresh" 
End Sub 

:)

4

myślę, że jest prostszy sposób, aby excel czekać aż odświeżania jest zrobione, bez konieczności ustawiania właściwości Background Query na False. Po co mieszać się z ludzkimi preferencjami?

Program Excel 2010 (i nowsze) ma tę metodę o nazwie CalculateUntilAsyncQueriesDone i wszystko, co musisz zrobić, wywołaj ją po wywołaniu metody RefreshAll. Excel czeka, aż obliczenia zostaną zakończone.

ThisWorkbook.RefreshAll 
Application.CalculateUntilAsyncQueriesDone 

Zazwyczaj umieszczam te rzeczy w jednym miejscu, aby wykonać pełną kalkulację bez przerywania, przed wysłaniem moich modeli do innych. Coś takiego:

ThisWorkbook.RefreshAll 
Application.CalculateUntilAsyncQueriesDone 
Application.CalculateFullRebuild 
Application.CalculateUntilAsyncQueriesDone 
Powiązane problemy