VBA Actualisation des requêtes

Bonjour à tous,

Je tente de mettre le code suivant en place :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("t_Excel_[Exemple]")) Is Nothing Then
        Range("t_Excel").ListObject.QueryTable.Refresh BackgroundQuery:=False
    End If
End Sub

mais la requête tourne et ne s'arrête pas, avec un échap je recois ce message d'erreur :

La méthode 'Refresh' de l'objet'_QueryTable' a échoué

Merci d'avance pour votre aide,

Cordialement,

Bonjour,
A tester !...
Cdlt.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("t_Excel_[Exemple]")) Is Nothing Then
        On Error GoTo errHandler
        Application.EnableEvents = False
        Range("t_Excel").ListObject.QueryTable.Refresh BackgroundQuery:=False
    End If

exitHandler:
    Application.EnableEvents = True
    Exit Sub
errHandler:
    MsgBox "Erreur : " & Err.Number & Chr(10) & Err.Description
    Resume exitHandler
End Sub

Bonjour,

A mon avis vous entrez dans une boucle sans fin en faisant comme ça :

  • La macro lance la requete > la requete actualise le tableau > la macro se relance > etc.

Ajoutez Application.EnableEvents = False en début de Sub et Application.EnableEvents = True en fin de Sub pour éviter que la macro s'auto-relance.

EDIT : salut @Jean-Eric, on s'est croisés

Re,
Pour le fun 😊
Le tableau structuré ne commence pas en ligne 1 !...

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("t_Excel").QueryTable
    initQT = Err.Number = 0 And Not QT Is Nothing
    On Error GoTo 0
End Function

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

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

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Or Intersect(Target, Me.Range("t_Excel_[Exemple]")) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    If initQT Then QT.Refresh BackgroundQuery:=False
    Application.EnableEvents = True
End Sub

Bonsoir à tous,

Merci pour vos retours, la gestion des évènements était la source de ce message d'erreur,

Mon code est donc comme ceci :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("t_Excel[Exemple]")) Is Nothing Then
        Application.EnableEvents = False
        Range("t_Excel").ListObject.QueryTable.Refresh BackgroundQuery:=False
        Application.EnableEvents = True
    End If
End Sub

Merci Jean Eric pour votre dernier code, mais pourriez vous me précisé l'intérêt de celui-ci, qui fonctionne parfaitement mais qui est plus long?

Merci d'avance,

Cordialement,

Re,
Les plus :
On vérifie l'existance de l'objet QueryTable.
On affiche un message (dans une cellule) avant le refresh et après le refresh (connexion en cours et horodatage de la mise à jour).
Complétement inutile ?
Cdlt.

Bonjour Jean Eric,

Non pas du tout inutile, juste pour moi mieux comprendre le code proposé,

Cordialement,

Rechercher des sujets similaires à "vba actualisation requetes"