2012-01-19 12 views
16

Sto creando un codice in cui posso fare clic su un singolo pulsante e aggiornerà i set di query che ho su quel foglio.Excel vba refresh wait

Ora, il mio problema è che ho più codice dopo il nuovo che copia alcune informazioni, ma questo codice viene eseguito subito dopo l'aggiornamento è stato avviato e le informazioni non sono state ancora sostituite.

Desidero creare un periodo di attesa per il completamento dell'aggiornamento e quindi il resto del codice può continuare.

Non voglio aspettare solo per 5 secondi, ma per il periodo rinfrescante, in modo che io non sto aspettando troppo a lungo o troppo corto, a seconda della velocità di Internet, ecc

Come posso fare questo?

Edit:

codice semplice:

ActiveWorkbook.RefreshAll 

Qui ho bisogno il ritardo o il codice in attesa finché tutta la rinfrescante è finito ... Poi

MsgBox("The Refreshing is Completed!") 

Qualcosa in quel direzione. Ma non può dire il msgbox prima che sia effettivamente finito .... A volte, a seconda della velocità di internet, l'aggiornamento richiede meno tempo o più, quindi voglio che sia una variabile del tempo di aggiornamento effettivo.

+2

Si sta utilizzando 'querytable.refresh false' per specificare un non-aggiornamento in background? –

+0

fino ad ora solo ActiveWorkbook.RefreshTuttavia ma ho bisogno di un ciclo da controllare al termine dell'aggiornamento. Quello è come ho immaginato – dave123

+1

Si può essere in grado di farlo da rinfrescanti singolarmente' 'per i = 1 a ActiveWorkbook.querytables.count: ActiveWorkbook.querytables (i) .Refresh falso: next' –

risposta

9

Nell'intervallo di dati esterni Proprietà della query Web è presente una casella di controllo che dice qualcosa come "Abilita aggiornamento in background" che è necessario deselezionare per ottenere l'effetto desiderato.

Date un'occhiata in fondo a questa pagina: http://www.mrexcel.com/tip103.shtml per le immagini

Edit:

Qui ci sono due macro che mostrano l'effetto desiderato:

Sub AddWebquery() 
    With ActiveSheet.QueryTables.Add(Connection:= _ 
     "URL;http://de.selfhtml.org/html/tabellen/anzeige/table_tr_th_td.htm", _ 
     Destination:=Range("$A$1")) 
     .Name = "table_tr_th_td" 
     .BackgroundQuery = False 
     .RefreshStyle = xlInsertDeleteCells 
     .WebSelectionType = xlSpecifiedTables 
     .WebFormatting = xlWebFormattingNone 
     .WebTables = "1" 
     .Refresh BackgroundQuery:=False 
    End With 
End Sub 

Sub TestRefreshing() 
    Range("A1").Clear 
    ActiveWorkbook.RefreshAll 
    Debug.Print "Test: " & Range("A1").Value 
End Sub 

Esegui AddWebquery per aggiungere la query , quindi eseguire TestRefreshing per testare l'effetto. È possibile modificare la riga .BackgroundQuery = False a True per ottenere il risultato errato.

TestPage con 10 secondi di sonno:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>SO-Test</title> 
    </head> 
    <body> 
     <?php 
     sleep(10); 
     ?> 
     <table border="1"> 
      <thead> 
       <tr><th>1</th></tr> 
      </thead> 
      <tbody> 
       <tr><td>2</td></tr> 
      </tbody> 
     </table> 
    </body> 
</html> 
+0

questo non mi permette di aggiornare con VBA e aspettare che finisca rinfrescante – dave123

+0

sì lo fa. L'ho appena testato. Modificato in Proprietà e chiamato RefreshAll con Debug.Print subito dopo. Restituisce sempre il valore desiderato, mai vuoto valore – DKSan

+0

Ciò non consente ancora un periodo di attesa prima dell'esecuzione del codice successivo. Se aggiungo MsgBox ("terminato l'aggiornamento") dopo il Debug.Print ... allora il MsgBox appare prima che l'aggiornamento sia completato. – dave123

6

Ho appena avuto un problema simile, e abbiamo risolto dal seguente:

For i = 1 To ActiveWorkbook.Connections.Count 
    ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery = False 
    'MsgBox ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery 
Next 

ActiveWorkbook.RefreshAll 

come non siamo in grado di assicurarsi che tutte le connessioni backgroundQuery proprietà siano definitivamente false prima di chiamare l'aggiornamento.

-1

Se si desidera che il copione sia attivo in vba, è necessario utilizzare il sonno. Ma a volte il sonno non funziona in Excel vba.

http://99students.com/macro-sleep-vba/

Invece di provare che con

Application.Wait (Now + TimeValue("0:01:00"))

codice di esempio

Sub Setting_Sleep_Without_Sleep_Function() 
MsgBox Now 
Application.Wait DateAdd("s", 10, Now) 
MsgBox Now 
End Sub 
0

'Da [email protected] 2014/08/11 ' Ecco un semplice versione che ti permetterà di avere il controllo completo. 'Invece di usare RefreshAll, crea la seguente subroutine: ' Chiama la routine dal tuo VBA Excl ovunque tu voglia eseguirla, 'e nient'altro accade fino a quando non viene eseguito. "Un altro vantaggio è che non aggiorna alcuna tabella Pivot, quindi non interferiscono, " e se si dispone di pivot che si basano sui dati aggiornati, è possibile eseguire un aggiornamento simile per i pivot dopo l'aggiornamento della query è completato.

sub RefreshQueries() 
    dim ws as worksheet 
    dim qt as QueryTable 
    For each ws in thisworkbook.worksheets 
     For each qt in ws.querytables 
      qt.refresh 
     next qt 
    next ws 
end sub 
7

stavo lavorando con un modello di PowerPivot, e volevo Aggiornare i dati prima che ho salvato e chiuso il modello. Tuttavia, Excel ha appena chiuso il modello prima del completamento dell'aggiornamento e il modello ha ripreso l'aggiornamento all'apertura.

aggiungendo la seguente riga a destra dopo il metodo RefreshAll, ha fatto il trucco:

ThisWorkbook.RefreshAll 
Application.CalculateUntilAsyncQueriesDone 

Spero che funzioni anche per te.

Assicurati di disattivare gli eventi per velocizzare le cose.

Nota che sto utilizzando Excel 2010, non sono sicuro che questo metodo sia disponibile nelle versioni precedenti.

+0

Questo è ottimo e funziona davvero. Grazie –

+0

Sei il benvenuto. Sono contento di poterti aiutare. –

0

Un altro modo per andare sarebbe utilizzare il comando Workbooks.Open per caricare l'URL come cartella di lavoro separata.

Questo ti dà pieno accesso ai dati dalla richiesta web subito dopo la chiamata. Inoltre, Excel mostra una barra di avanzamento mentre carica, invece di bloccarsi come con una query Web.

Vedere la mia risposta su questa questione: How can I post-process the data from an Excel web query when the query is complete?

Il compromesso di questo approccio è che devi gestire l'elaborazione dei dati si ottiene indietro da soli - Excel non metterlo in una determinata destinazione per voi.

Abbiamo finito per percorrere questa strada dopo aver provato qualcosa di molto simile a quello che sembra aver fatto.

0
ActiveWorkbook.RefreshAll 
     Do While Application.CalculationState <> xlDone 
      DoEvents 
     Loop 

So che è una vecchia domanda, ma questo ha funzionato per me. Funziona anche per l'attesa mentre le formule vengono calcolate.

+0

non ha funzionato per me –

+0

hai attivato la cartella di lavoro prima? (So ​​che è una domanda sciocca, ma il numero di volte in cui il mio codice non ha funzionato perché ho dimenticato di fare qualcosa di semplice è irreale). MyWorkbook.Activate Then .RefreshAll – DDuffy

+1

Sì, certo. 'Application.CalculateUntilAsyncQueriesDone' ha risolto il problema alla fine. –

1

Togliere il segno "Abilita aggiornamento in background" nel Dati -> Connessione -> Proprietà

Questo disabiliterà di aggiornamento in background e attendere per l'aggiornamento per il completamento.

enter image description here