VBA - Refresh Query

Bonjour,

En VBA j'ai trouvé comment Refresh ma data query (requête de donnée). En revanche la suite e mon code s'exécute avant même que la query est fini de s'actualiser.

Est-ce que vous savez comment je peux récupérer l'info que c'est actualisé / plus de requête en cours ?

Merci beaucoup

Bonsoir,

On peut configurer les requêtes pour les dérouler en arrière-plan, ou non.

En se positionnant dans la requête, ruban "données" :

image image

Si on valide, la requête s'effectue en arrière-plan, ou pas.

En vba, cela se traduit ainsi :

Sub m_a_j()
Range("Nom_Requete").ListObject.QueryTable.Refresh False
End Sub

Lien

Bonne soirée

Bonsoir,

Merci pour ton retour,

J'ai peut être loupé quelque chose mais le fait de désactiver l'actualisation en arrière plan ne va pas m'indiquer quand est-ce que l'actualisation sera fini dans mon VBA.

Bonne soirée

Re-,

Non, mais rien ne va se passer tant que l'actualisation ne sera pas terminé. Le code sera "gelé"

Merci beaucoup !

Est ce que je peux lancer le code en arrière plan, faire mes trucs sur mon excel. Puis avoir un autre VBA qui s'exécute automatiquement ?

Un peu comme un event workbook.openworkbook

Bonjour à tous,

Si la query est liée à un tableau listobject dans le classeur, vous pouvez capturer l'event QueryTable.AfterRefresh event (Excel) | Microsoft Learn pour lancer une macro une fois la requête rafraichie.


Mais attention, votre demande :

Est ce que je peux lancer le code en arrière plan, faire mes trucs sur mon excel. Puis avoir un autre VBA qui s'exécute automatiquement ?

Est en pleine contradiction avec votre question précédente : si vous désactivez le rafraichissement en arrière-plan, alors par définition le code qui a lancé le refresh attendra la fin du refresh et donc bloquera Excel…

Bien définir votre workflow avant de se lancer dans des codes.

Bonjour,
Une piste !
L'actualisation en arrière-plan doit être activée.
Le tableau ne doit pas être en ligne 1.
Cdlt.

Option Explicit
Dim WithEvents QT As QueryTable

Private Function initQT() As Boolean
    On Error Resume Next
    If QT Is Nothing Then Set QT = Me.ListObjects("TableName").QueryTable
    initQT = Err.Number = 0 And Not QT Is Nothing
    On Error GoTo 0
End Function

Private Sub QT_AfterRefresh(ByVal Success As Boolean)
     With QT.ListObject.HeaderRowRange       
        .Cells(0, 1) = "Mis à jour le " & Format(Now, "dddd d mmmm yyyy à h\hmm\mss\s")
     End With
End Sub

Private Sub QT_BeforeRefresh(Cancel As Boolean)
    QT.ListObject.HeaderRowRange.Cells(0, 1) = "Connexion en cours ..."
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Or Intersect(Target, Me.Range("TableName[Value]")) Is Nothing Then Exit Sub
    If initQT Then QT.Refresh 
End Sub

Merci beaucoup

J'ai toujours pensé peut être à tord que declarer des objets était souvent overkill/source de bug. Est-ce obligatoire dans mon cas ?

Est ce que levent Worksheet_Change peut ralentir mon fichier ? Surtout avec l'appel de fonctions

Je ne vois pas pourquoi ce serait source de bug... ?

Dans votre cas ça me semble obligatoire oui. Quant à l'event, si bien géré comme l'a fait Jean-Eric (early exit), il n'y a pas d'impact de performances notable.

Merci beaucoup, je mets comme résolu !

Juste un a priori car j'avais repris un vieux VBA d'un collègue avec plein de bug et j'avais découvert la déclaration d'objets qui mon sens n'avais aucune VA.

Bonjour,
Merci de clore le sujet définitivement.
Cdlt.

Rechercher des sujets similaires à "vba refresh query"