Attendez L'ActiveWorkbook.Finitions rafraîchissantes-VBA

j'ai un sous-marin qui appelle ActiveWorkbook.Rafraîchir pour apporter de nouvelles données à partir d'une source XML, puis effectue de multiples modifications à elle. Le problème est que la commande de Rafraîchall n'est pas assez longue pour être terminée, de sorte que les sous-commandes et les fonctions suivantes ne s'exécutent pas correctement, ce qui fait que les lignes répétées ne sont pas correctement effacées.

j'ai essayé d'utiliser l'Application .Attendre et le Sleep fonction, mais ils semblent mettre en pause le processus de rafraîchissement aussi. Je veux simplement que le reste du code attende la fin du processus de rafraîchissement avant d'exécuter le reste du code.

des idées sur la façon de mettre en œuvre ceci? Pour l'instant, je n'ai pu y remédier qu'en ne faisant pas appel à RefreshAll, ce qui me donne l'idée d'implémenter un second flux à exécuter ensuite, mais ce n'est pas une bonne solution.

s'il vous plaît faites-moi savoir si tout cela n'était pas claire. Merci

EDIT J'ai donc essayé quelques suggestions parmi les postes ci-dessous, et c'est ce que j'ai pu trouver. Faire une " macro d'enregistrement "et ensuite décocher la" rafraîchissement D'arrière-plan Enable " dans les propriétés de la table n'a rien donné. J'ai fait un rafraîchissement aussi bien après. C'est le résultat de la macro enregistrée:

With ActiveWorkbook.Connections("XMLTable")
        .Name = "XMLTable"
        .Description = ""
End With
ActiveWorkbook.Connections("XMLTable").refresh

La classe ActiveWorkbook.Raccordements n'a pas une option BackgroundQuery pour que je puisse la mettre à False. Des idées?

Juste pour être clair. Il s'agit d'un fichier XML hébergé sur un site Web que Excel va et importe dans une table. J'appelle ensuite ces données un pivot et d'autres choses. Le but ici est de permettre au processus d'importation du site web à la table de finir avant d'exécuter toute autre commande. Merci

EDIT2: Après un peu plus recherche, j'ai trouvé cette page: http://www.mrexcel.com/forum/excel-questions/564959-execute-code-after-data-connection-refresh-finished.html Il semble qu'un type de connexion XML n'ait pas de booléen BackgroundQuery . Cette option n'est disponible que pour les connexions ODBC et OLEDB, qui sont respectivement des types xlConnectionTypeODBC et xlConnectionTypeOLEDB. La connexion XML que j'utilise est de type xlConnectionTypeXMLMAP qui ne avoir une option BackgroundQuery . Quelqu'un a une idée sur l'endroit où aller à partir d'ici? La seule solution que j'ai à l'esprit maintenant est de faire deux boutons macro séparés sur la feuille excel, un pour rafraîchir et un pour la modification des données, mais je préfère garder cette option jusqu'à la fin.

25
demandé sur Community 2014-02-28 04:20:15

10 réponses

, Comme a commenté:

'~~> your code here before refresh

Activeworkbook.RefreshAll
DoEvents

'~~> rest of your code here after refresh

ce que DoEvents fait est comme permettre momentanément à Windows de prendre une pause de Macro pour traiter tous les événements en suspens avant de revenir à la macro.

Ainsi, lorsque vous Rafraîchissez votre classeur et mettez DoEvents après, il ne reprendra pas la macro jusqu'à ce que le rafraîchissement soit terminé.

17
répondu L42 2014-02-28 07:13:42

j'ai eu le même problème, cependant DoEvents ne m'a pas aidé car mes connexions de données avaient background-refresh activé. Au lieu de cela, en utilisant Wayne G. Dunn 'S réponse comme un point de départ, j'ai créé la solution suivante, qui fonctionne très bien pour moi;

Sub Refresh_All_Data_Connections()

    For Each objConnection In ThisWorkbook.Connections
        'Get current background-refresh value
        bBackground = objConnection.OLEDBConnection.BackgroundQuery

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

        'Refresh this connection
        objConnection.Refresh

        'Set background-refresh value back to original value
        objConnection.OLEDBConnection.BackgroundQuery = bBackground
    Next

    MsgBox "Finished refreshing all data connections"

End Sub

la MsgBox est pour le test seulement et peut être supprimé une fois que vous êtes heureux le code attend.

aussi, je préfère ThisWorkbook à ActiveWorkbook comme je sais qu'il va cibler le classeur où le code réside, en cas de changement de focus. Neuf fois sur dix, cela n'a pas d'importance, mais j'aime à errer sur le côté de la prudence.

EDIT: Juste vu ton edit sur l'utilisation d'un xlConnectionTypeXMLMAP connexion qui n'ont pas de BackgroundQuery option, désolé. Je laisse ce qui précède pour quiconque (comme moi) à la recherche d'un moyen pour rafraîchir les types de connexion Oldb.

37
répondu Valiante 2017-05-23 12:10:33

avertissement: le code ci-dessous aurait causé quelques accidents! À utiliser avec précaution.

selon cette réponse dans Excel 2010 et au-dessus CalculateUntilAsyncQueriesDone arrête les macros jusqu'à ce que rafraîchissement est fait

ThisWorkbook.RefreshAll

Application.CalculateUntilAsyncQueriesDone

6
répondu robotik 2018-01-25 16:11:27

Si @Wayne G. Dunn a donné dans le code. Voici l'endroit où vous ne voulez pas coder. Et décochez pour désactiver le rafraîchissement de l'arrière-plan.

enter image description here

5
répondu subro 2016-06-23 12:45:11

vous devez désactiver" background refresh " pour toutes les requêtes. Si background refresh est activé, Excel fonctionne à l'avance pendant que le refresh se produit et que vous avez des problèmes.

Données > Connexions > Propriétés > désélectionnez l'option activer l'actualisation en arrière-plan

3
répondu tim.s 2016-08-18 00:14:13

Voici une solution trouvée à http://www.mrexcel.com/forum/excel-questions/510011-fails-activeworkbook-refreshall-backgroundquery-%3Dfalse.html :

ont soit toutes les propriétés de fond de pivotcaches définies à False, ou boucle à travers toutes les clés pivotantes du classeur:

Code:
    For Each pc In ActiveWorkbook.PivotCaches
       pc.BackgroundQuery = False
       pc.Refresh
    Next 

cela laissera toutes les propriétés de backgroundquery de pivotcaches comme fausses. Vous pouvez conserver les réglages de chacun avec:

Code:

For Each pc In ActiveWorkbook.PivotCaches
  originalBGStatus = pc.BackgroundQuery
  pc.BackgroundQuery = False
  pc.Refresh
  pc.BackgroundQuery = originalBGStatus
Next
1
répondu Wayne G. Dunn 2014-02-28 04:01:26

ce n'est peut-être pas idéal, mais essayez d'utiliser" Application.OnTime " de suspendre l'exécution du code restant jusqu'à ce que suffisamment de temps se soit écoulé pour s'assurer que tous les processus de rafraîchissement sont terminés.

que se passe-t-il si la dernière table de votre liste de rafraîchissement était une fausse table composée uniquement d'un drapeau pour indiquer que le rafraîchissement est complet? Ce tableau serait supprimé au début de la procédure, puis, en utilisant "Application.À l'heure," un sous-marin tournait toutes les 15 secondes environ pour vérifier pour voir si la fausse table avait été peuplée. Si elle est remplie, cesser l'Application".OnTime" checker et procéder avec le reste de votre procédure.

un peu bancal, mais ça devrait marcher.

1
répondu Scott 2015-07-22 14:55:53

Essayez ce qui suit:

ActiveSheet.Calculer

Je l'utilise dans une feuille de travail dans laquelle le bouton de commande change les valeurs d'un ensemble de données. Sur chaque clic, excel exécute cette commande et le graphique est mis à jour immédiatement.

0
répondu rwb 2015-03-19 13:22:41

j'avais ce même problème, et j'ai essayé toutes les solutions ci-dessus sans succès. Finalement résolu le problème en supprimant la requête entière et en en créant une nouvelle. Il avait exactement les mêmes paramètres que celui qui ne fonctionnait pas (littéralement la même définition de requête que j'ai simplement copiée l'ancienne). Je ne sais pas pourquoi cela a résolu le problème, mais il l'a fait. Espérons que cela aide quelqu'un.

0
répondu Jennifer 2015-09-02 22:49:16

si vous n'êtes pas marié à L'utilisation D'Excel Web Query, vous pouvez essayer d'ouvrir L'URL comme un cahier d'exercices séparé à la place. Suivre cette route vous permet de travailler sur les données résultantes une fois que la requête web est terminée, tout comme si vous désactiviez "Enable background refresh."

ce qui est bien, C'est Qu'Excel affiche une barre de progression pendant la requête, au lieu de simplement geler / afficher un message de chargement dans la cellule de destination.

Voir ma réponse sur ce question: Comment puis-je post-traiter les données d'une requête Web Excel lorsque la requête est complète?

le compromis de cette approche est que vous devez gérer le traitement des données que vous récupérez vous - même-Excel ne le mettra pas dans une destination donnée pour vous.

nous avons fini par suivre cette route après avoir essayé quelque chose qui ressemble à ce que vous semblez avoir fait.

0
répondu mcw0933 2017-05-23 10:31:31