web-dev-qa-db-fra.com

Excel vba rafraichir attendre

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. 

17
dave123

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>
9
DKSan

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.

7
RemarkLima

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.

7
Ejaz Ahmed

Décochez la case "Activer l'actualisation de l'arrière-plan" dans le fichier Données -> Connexion -> Propriétés

Cela désactivera l'actualisation en arrière-plan et attendra la fin de l'actualisation.

 enter image description here

1
Ashish Chandra

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.

0
mcw0933

'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
0
A.G.Johnson
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.

0
DDuffy

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
0
ggv