2017-09-27 51 views
0

J'ai une feuille de calcul avec 4 feuilles de travail, chacune connectée à une requête d'alimentation qui se connecte à une base de données OLEDB et exécute un select pour importer des données dans le classeur. J'essaye d'automatiser l'actualisation des requêtes.Les tables Power Query ne téléchargent pas les données avant l'exécution de VBA

Je VBA dans le classeur qui
- désactive l'actualisation de fond,
- court Workbook.RefreshAll,
- remet à zéro l'actualisation de fond vrai (comme je l'ai besoin de cela pour le logiciel d'automatisation pour être en mesure de l'exécuter en premier lieu) et
- puis attend 30 secondes pour laisser au logiciel d'automatisation un peu de temps avant de commencer à enregistrer le classeur.

Tout le logiciel appelle la macro dans le classeur, puis enregistre l'exécution suivante.

Les requêtes s'exécutent correctement l'une après l'autre et je peux dire que les données dans les tables ont été rafraîchies. La confirmation de requête d'alimentation indiquant que les lignes ont été téléchargées se produit une fois l'exécution de VBA terminée, de sorte que le logiciel d'automatisation l'enregistre avant que cela ne soit fait et Excel signale que le téléchargement a échoué. Ce n'est pas un problème quand tout fonctionne, mais nous ne saurons pas quand le téléchargement a vraiment échoué, à moins que j'ajoute une sorte de comparaison de nombre de lignes qui est vraiment une solution de contournement plutôt qu'une solution réelle.

J'ai essayé de créer deux sous-classeurs dans le classeur, un pour faire le rafraîchissement puis un autre qui appelle le premier sub et attend 30 secondes, j'espérais que le téléchargement se terminerait après l'exécution du premier sous- n'arrive pas. J'ai essayé d'actualiser une connexion à la fois au lieu d'utiliser RefreshAll, essayé d'actualiser les tables de requête de puissance réelles au lieu des connexions et j'ai essayé d'actualiser avec la requête de fond définie sur true, puis de boucler jusqu'à ce que l'actualisation soit terminée. étape à travers elle, mais se bloque si vous exécutez simplement la VBA dans son intégralité).

J'ai également essayé d'enregistrer la feuille de calcul à la fin de la VBA, mais elle attend toujours jusqu'à ce que l'enregistrement soit terminé pour mettre à jour le statut de requête d'alimentation.

Mon dernier VBA:

Sub Workbook_RefreshAll() 

Application.DisplayAlerts = False 

For Each objConnection In ThisWorkbook.Connections 

    'Temporarily disable background-refresh 
    objConnection.OLEDBConnection.BackgroundQuery = False 
    objConnection.OLEDBConnection.MaintainConnection = False 

Next 

ActiveWorkbook.RefreshAll 

For Each objConnection In ThisWorkbook.Connections 

    'Re-enable background-refresh 
    objConnection.OLEDBConnection.BackgroundQuery = True 
    objConnection.OLEDBConnection.MaintainConnection = True 

Next 

newHour = Hour(Now()) 
newMinute = Minute(Now()) 
newSecond = Second(Now()) + 30 
waitTime = TimeSerial(newHour, newMinute, newSecond) 

Application.Wait waitTime 

End Sub 

(je ne me souviens pas si le paramètre que je connexion maintenir effectivement aidé en essayant de forcer la connexion à abandonner après chaque rafraîchissement, mais il fonctionne donc n'ont pas pris . it out)

Répondre

0

au lieu de Application.Wait les opérations suivantes:

Do until now() >= waittime 
    DoEvents 
Loop 
+0

J'ai essayé quelques variations de DoEvents, mais il ne semble pas traiter la charge. Je ai essayé cela pour être sûr cependant et malheureusement ne fonctionne toujours pas, essayé de le déplacer directement après le rafraîchissement, mais toujours pas de joie. Ce qui est amusant, c'est que si je mets une pause dans le code ou que je la franchis, la charge se terminera, c'est comme si le code devait s'arrêter physiquement avant de mettre à jour le statut de la charge. –