Je crée un code sur lequel je peux cliquer sur un seul bouton pour actualiser les tables de requête que j'ai sur cette feuille.
Maintenant, mon problème est que j'ai plus de code après la mise à jour qui copie une partie de l'information, mais ce code est exécuté juste après le début de l'actualisation et l'information n'a pas encore été remplacée.
Je souhaite créer une période d'attente pour l'actualisation, puis le reste du code peut continuer.
Je ne veux pas seulement attendre 5 secondes, mais pendant la période de rafraîchissement, pour ne pas attendre trop longtemps ni trop court, cela dépend de la vitesse de l'Internet, etc.
Comment puis-je faire ceci?
Modifier:
Code simple:
ActiveWorkbook.RefreshAll
Ici, j’ai besoin du délai ou du code d’attente jusqu’à ce que tout le rafraîchissement soit terminé ...
MsgBox("The Refreshing is Completed!")
Quelque chose dans cette direction. Mais il ne peut pas dire que la msgbox avant qu'elle soit terminée ... Parfois, en fonction de la vitesse de l'Internet, l'actualisation prend plus ou moins longtemps. Je souhaite donc que ce soit une variable du temps d'actualisation réel.
Dans les propriétés de la plage de données externes de votre requête Web, vous avez une case à cocher disant "Activer l'actualisation en arrière-plan" que vous devez décocher pour obtenir l'effet souhaité.
Regardez au bas de cette page: http://www.mrexcel.com/tip103.shtml pour les images
Modifier:
Voici deux macros qui montrent l'effet souhaité:
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
Exécutez AddWebquery pour ajouter la requête, puis exécutez TestRefreshing pour tester l'effet. Vous pouvez modifier la ligne .BackgroundQuery = False
en True
pour obtenir un résultat incorrect.
Testpage avec 10 secondes de sommeil:
<!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>
Je viens d'avoir un problème similaire, et nous l'avons résolu comme suit:
For i = 1 To ActiveWorkbook.Connections.Count
ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery = False
'MsgBox ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery
Next
ActiveWorkbook.RefreshAll
De cette manière, nous pouvons nous assurer que toutes les propriétés de la connexion backgroundQuery
sont bien false
avant d'appeler l'actualisation.
Je travaillais avec un modèle PowerPivot et je voulais actualiser les données avant de sauvegarder et de fermer le modèle. Cependant, Excel vient de fermer le modèle avant la fin de l'actualisation et le rafraîchissement du modèle a repris à l'ouverture.
L'ajout de la ligne suivante juste après la méthode RefreshAll a joué le jeu suivant:
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
J'espère que cela fonctionne pour vous aussi.
Assurez-vous de désactiver les événements pour accélérer les choses.
Notez que j'utilise Excel 2010, je ne suis pas sûr si cette méthode est disponible dans les versions antérieures.
Une autre solution consiste à utiliser la commande Workbooks.Open pour charger l’URL en tant que classeur séparé.
Cela vous donne un accès complet aux données de la requête Web dès que l'appel est terminé. De plus, Excel affiche une barre de progression pendant le chargement, au lieu de se figer comme avec une requête Web.
Voir ma réponse à cette question: Comment puis-je post-traiter les données d'une requête Web Excel lorsque la requête est terminée?
Le compromis de cette approche est que vous devez gérer vous-même le traitement des données que vous récupérez - Excel ne les placera pas dans une destination donnée.
Nous avons fini par emprunter cette voie après avoir essayé quelque chose d'assez similaire à ce que vous semblez avoir fait.
'De [email protected] 2014-08-11 ' Voici une version simple qui vous permettra de contrôler… ... 'Au lieu d'utiliser RefreshAll, créez le sous-programme suivant: ' Appelez la routine à partir de votre VBA Excl où que vous vouliez l'exécuter, 'et rien d'autre ne se passe jusqu'à ce que ce soit fait…'. Un autre avantage est qu'il ne rafraîchit pas les tables Pivot, elles n'interfèrent pas, et si vous avez des pivots qui reposent sur les données actualisées, vous pouvez exécuter une actualisation similaire '. pour vos pivots après l’actualisation de la requête.
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
ActiveWorkbook.RefreshAll
Do While Application.CalculationState <> xlDone
DoEvents
Loop
Je sais que c’est une vieille question, mais cela a fonctionné pour moi . Cela fonctionne également pour attendre pendant que les formules calculent.
Essayez cette approche:
With Selection.ListObject.QueryTable
.BackgroundQuery = False
.Refresh
End With
Lorsque vous l'exprimez de la manière suivante, BackgroundQuery = False ne semble pas modifier la propriété BackgroundQuery en False.
Selection.ListObject.QueryTable.Refresh BackgroundQuery = False ' doesn't work