Codice da eseguire quando ActiveWorkbook.connections ("x"). L'aggiornamento è finito
-
12-11-2019 - |
Domanda
Seleziona i dati dalla sorgente esterna
Ho una connessione dati che pensiti ai dati utilizzando a select
Interrogazione da SQL-Server in un foglio Excel usando il codice VBA come questo:
With ActiveWorkbook.Connections("x"). _
OLEDBConnection
.BackgroundQuery = True
.CommandText = Array( _
"SELECT ... FROM ...
...
ActiveWorkbook.Connections("x").Refresh
Anche la tabella dei perni collegati ai dati importati
Tuttavia, per quanto posso dire ActiveWorkbook.Connections("x").Refresh
Esegui asinchonius e voglio eseguire il codice che viene eseguito dopo che l'aggiornamento è terminato, in modo da poter eseguire questo codice:
Private Sub UpdatePivot()
Dim PV As PivotItem
For Each PV In ActiveSheet.PivotTables("PT1").PivotFields("PN").PivotItems
If PV.Name <> "(blank)" Then
PV.Visible = True
Else
PV.Visible = False
End If
Next
End Sub
ma solo quando i dati vengono letti in
Come faccio a sapere quando l'aggiornamento è finito di ottenere tutti i dati?
Cosa devo fare solo per gestire il UpdatePivot
sub dopo l'aggiornamento è completo senza ricorrere a sleep
trucchi.
PS A volte la query è veloce (<1 sec), a volte è lenta (> 30 sec) a seconda dei dati esatti che sto selezionando, il che è dinamico.
Soluzione
Non è una soluzione geniale, ma potresti fare ActiveWorkbook.Connections("x").Refresh
eseguire in modo sincrono mediante impostazione
.BackgroundQuery = False
Un'altra soluzione più complessa sarebbe quella di pollicare lo stato della connessione controllando il .Refreshing
Proprietà all'interno di un costrutto di loop.
Altri suggerimenti
.BackgroundQuery = False
non garantirà l'esecuzione sincrona dopo l'aggiornamento dei dati.
Provalo da solo creando una semplice query e nella subroutine di Worksheet_Change Aggiungi codice per selezionare alcune celle. Spesso posso ottenere 2 comandi da sparare prima che appaia il cerchio di attesa/timeout.
Quindi non posso determinare se la query ha restituito i dati giusti. Ho provato a impostare una cella di riferimento sul valore di una colonna di query centrale e ho verificato che i due siano uguali - purtroppo il Worksheet_Change
L'evento si accende due volte dopo l'aggiornamento dei dati!
Questo mi sta facendo impazzire. Devo solo andare a stampare un grafico dopo l'aggiornamento della query riuscita.