VBA Actualiser des requetes

Bonour à tous,

Je souhaiterais avoir votre aide afin de mettre en place un bouton d'actualisation sur une feuille afin de :

1 : actualiser une requete A sur le fichier A

2 : ouvrir un fichier B dont le chemin est défini par le gestionnaire de noms (le code que j'ai tenté d'écrire n'en tient pas compte mais ce serai mieux de l'ultiliser),

actualiser la requete présnete sur ce fichier (il n'yen a qu'une) et fermer le fichier en sauvegardant celui ci,

3 : actualiser une requete B sur le fichier A et un TCD nomme C

Le code qui ne fonctionne pas car bien mal écrit est le suivant :

Sub Actualiser()

Application.CutCopyMode = False

Sheets("A").Range("A2").ListObject.QueryTable.Refresh BackgroundQuery:=False

    With Workbooks.Open(ThisWorkbook.Path & "\A\S\T\H\Historique.xlsx")
        With ActiveSheet("Historique").Range("A2").ListObject.QueryTable.Refresh BackgroundQuery:=False
        End With
        .Save True
        .Close True
    End With

Sheets("B").Range("A2").ListObject.QueryTable.Refresh BackgroundQuery:=False

End Sub

J’ai un peu peur également du temps de traitement de l'actualisation des requêtes qui pourrait faussé l'actualisation du TCD,

Merci d'avance pour votre aide,

Cordialement,

BOnjour

Pour que VBA attende la fin de l’actualisation il suffit dans les propriétés de la requête de désactiver l'actualisation en arrière plan...

Bonsoir 78Chris,

Merci pour votre retour, oui je l'ai lu de votre part entre autre lors de sujets sur ce forum,

Ma question sur ce sujet est de savoir si je désactive cette propriété, elle le sera toujours?,

dans le sens ou l'administrateur réseau peut il réactiver cette propriété pour tout le réseau ou le fait que je le désactive ne peut pas être remis en cause uniquement par une action manuelle?,

Dois je faire désactiver cette option sur toutes les requêtes du fichier ou uniquement celle que j’actualise?,

Je ne sais pas si je suis clair !

Merci d'avance,

Cordialement,

RE

On agit manuellement ou par VBA pour changer la propriété de la requête.

Je ne pense pas que administrateur puisse changer cela de l’extérieur.

Si le requête est liée à d'autres requêtes il faut le faire sur la chaîne de la 1ère à celle résultant.

Bonsoir78Chris,

Merci pour ces infos, je vais donc modifier pour chaque requête cette propriété,

Cordialement,

Bosnoir à tous,

Je cherche bien sûr de mon côté en parcourant le forum, j'en suis arrivé à modifier le code comme ceci :

Sub Actualiser()

Application.CutCopyMode = False

Range("Tableau_1").ListObject.QueryTable.Refresh BackgroundQuery:=False

    With Workbooks.Open(ThisWorkbook.Path & "\H\H.xlsx")
                    .Range("Tableau2").ListObject.QueryTable.Refresh BackgroundQuery:=False
                    .Close savechanges:=True

    End With

Range("Tableau_3").ListObject.QueryTable.Refresh BackgroundQuery:=False

End Sub

Le hic c'est qu'il bloque à la ligne

.Range("Tableau2").ListObject.QueryTable.Refresh BackgroundQuery:=False

avec l'alerte suivante : "erreur d'exécution 438 propriété ou méthode non gérée"

C'est étrange car je peux manuellement actauliser le tableau 2 résultant d'une requête,

Auriez vous une idée?,

Le code vous semble t-il correctement écrit?,

Merci d'avance,
Cordialement,

Bonsoir,

Un TS (donc le résultat de la requête) n'a pas besoin d'être référencé.

Enlève le point devant Range

PS, pense à donner un nom significatif à tes requêtes, "Tableau2" fait un peu "bof"...

Bonne soirée

Edit, tu peux également déterminer dans les propriétés de la requête une actualisation à l'ouverture du fichier, en décochant la màj en arrière plan, puis un Sauver/Fermer comme tu l'as fait

Bonsoir Cousinhub,

Qu'entends tu par :

Un TS (donc le résultat de la requête) n'a pas besoin d'être référencé.

?,

Oui la c'est pour l'exemple, mes requêtes ont des noms significatifs,

Edit bien vu , effectivement on peut à l'ouverture d'un fichier actualiser la requête !!!

le code serait ainsi, qu'en pensez vous?:

Sub Actualiser()

Application.CutCopyMode = False

Range("Tableau_1").ListObject.QueryTable.Refresh BackgroundQuery:=False

    With Workbooks.Open(ThisWorkbook.Path & "\H\H.xlsx")
                    .Close savechanges:=True

    End With

Range("Tableau_2").ListObject.QueryTable.Refresh BackgroundQuery:=False

End Sub

Cordialement,

Merci d'avance,

Bonsoir,

Je pense que tu as eu le temps de tester, depuis hier soir...

ça fonctionne?

Perso, dans les différentes requêtes que j'effectue au sein de l'organisme où je "sévis", c'est la syntaxe que j'utilise

Bonne soirée

Bonjour,

Oui tout fonctionne, merci pour votre aide,

Cordialement,

Bonjour à tous,

Je me suis rendu compte que l'actualisation ne se fait pas, en effet j'ai activé l'option de rafraichissement de la requete à louverture du fichier B.

La partie de la macro comme ceci

    With Workbooks.Open(ThisWorkbook.Path & "\H\H.xlsx")
                    .Close savechanges:=True

ne fonctionne pas, on a 'impression que l'actualisation n'a pas eu le temps de se faire avant la fermeture du fichier,

Par contre, si on écrit :

    With Workbooks.Open(ThisWorkbook.Path & "\H\H.xlsx")
                    Range("Tableau2").ListObject.QueryTable.Refresh BackgroundQuery:=False
                    .Close savechanges:=True

la requête du fichier B est bien actualisé,

Comment faire pour que la première option fonctionne?, je peux me contenter d'appliquer le deuxième mais j'aimerais en savoir plus?,

Merci d'avance,

Cordialement,

Hello,

Je me suis un peu fourvoyé dans ma réponse...

J'utilise en effet le .Refresh False après l'ouverture du fichier, puis Save/Close

Désolé

Bon dimanche

Bonjour Cousinhub,

Merci pour votre retour,

Cordialement,

Rechercher des sujets similaires à "vba actualiser requetes"