Rafraichir en VBA une requête powerquery ET le tableau croisé dynamique (TCD) lié

La solution - si vous avez compris le titre ! :- ), sinon j'explique tout dans la vidéo ci-dessous.

1/ Clic droit sur la requête et décocher "Activer l'actualisation en arrière-plan"

2/ Cliquer sur le bouton "Actualiser Tout" ou bien ajouter un code VBA rafraichissant tout :

1
2
3
Sub RefreshWorkbook()
ActiveWorkbook.RefreshAll
End Sub

Et voici la vidéo expliquant le problème et sa solution

PS : une alternative à cette situation est de connecter le TCD directement à PowerQuery, sans passer par une table intermédiaire.

Remplacez SI(ESTNA(...) par SI.NON.DISP()

SI.NON.DISPO fait partie de la série de fonctions SI.

Elle permet de tester si le premier argument de la fonction retourne une valeur d'erreur #N/A, et le deuxième argument renvoie la valeur si c'est le cas.

Cette fonction est plus rapide à écrire que SI(ESTNA()), et je pense, plus rapide à exécuter.

C'est aussi l'occasion de revoir ces deux posts qui expliquent comment ajouter un raccourci de saisie pour remplacer iiii par :

=SI.NON.DISP(INDEX(Table_des_Résultat;EQUIV(Valeur_Cherchée_en_Colonne;Colonne_de_Recherche;0);EQUIV(Valeur_Cherchée_en_Ligne;Ligne_de_Recherche;0));Valeur_si_erreur)

Pour l'ajouter directement en VBA (faire un double clic pour tout sélectionner):

1
Application.AutoCorrect.AddReplacement "iiii", "=SI.NON.DISP(INDEX(Table_des_Résultat;EQUIV(Valeur_Cherchée_en_Colonne;Colonne_de_Recherche;0);EQUIV(Valeur_Cherchée_en_Ligne;Ligne_de_Recherche;0));Valeur_si_erreur)"

Vous pouvez coller le code dans la fenêtre exécution (dans VBE, Ctrl+g, coller le code et appuyer sur entrée) ou bien le mettre dans une macro. Ensuite, en tapant iiii [espace], vous aurez tout de suite la formule. Il ne reste plus qu'à double-cliquer sur les différents arguments et sélectionner la zone qui vous intéresse.