Mise à jour d'un TCD par macro

Bonjour le forum,

Je souhaiterai mettre à jour par macro deux tableaux croisés dynamiques en fonction de données qui sont rentrées tous les jours et qui viennent se rajouter, ligne par ligne, à la suite dans ma feuille "Journal_enregistrements".

J'utilise donc les commandes suivantes :

Sheets("TCD PI").Select
Range("A5").Select
ActiveSheet.PivotTables("TCD PI").PivotCache.Refresh
Range("P5").Select
ActiveSheet.PivotTables("TCD CHANTIERS PI").PivotCache.Refresh

Seulement, quand des lignes supplémentaires viennent se rajouter, après la saisie, dans ma feuille "Journal_enregistrements", le rafraichissement du TCD ne prend pas en compte les nouvelles données...

Est-ce qu'une bonne âme saurait me sortir de cette impasse ?

Merci d'avance.

Fabrice,

Bonjour

En ce qui me concerne, j'utilise ce code (dans la feuille du TCD)

Private Sub Worksheet_Activate()            
ThisWorkbook.RefreshAll            
End Sub        

Amicalement

Nad

Bonsoir le forum,

J'avoue que la solution du "RefreshAll" me tente plus car si cela fonctionne, j'aurai moins de boulot. Dans le cas contraire, j'essaierai de nommer mes zones et d'utiliser la fonction "décaler".

Je teste demain matin au boulot et vous tiens au courant...

Merci à tous les deux.

Fabrice,

Re-,

les deux réponses sont complémentaires, mais ne se substituent pas....

Le code fournit par Nad met à jour tes TCD...

Si la zone de donnée initiale est de A1 à K201, ce code n'ira pas chercher plus loin, il va mettre à jour ton TCD avec les données de A1 à K201.....

Il te faut absolument avoir une zone nommée dynamique....

Et ensuite, le code est bien plus rapide (note l'absence de .Select......)

Bonne soirée

Re-bonsoir,

OK ! Felix. Bien compris... Je ferai le nécessaire demain...

Merci encore.

Fabrice,

Re

Un petit tuto regroupant les 2 conseils.

Fichier

Amicalement

Nad

Edit de Nad : fichier modifié pour corriger une erreur de plage signalée par cb60

Bonsoir,

Une autre méthode que celle proposée par NAD avec ce code toujours à placer dans la feuille où se trouve le TCD.

Private Sub Worksheet_Activate()
Range("A3").PivotTable.RefreshTable
End Sub

Avec Range("A3") = une cellule du TCD (celle en haut à gauche dans le TCD par exemple.

La différence est que dans ce code seul le TCD de cette feuille est actualisé tandis que dans le code utilisant REFRESHALL, ce sont tous les TCD du fichier qui sont actualisés. Ce qui peut ne pas toujours être souhaité.

Dans ton cas cela pourrait donner ceci :

Private Sub Worksheet_Activate()
Range("A5").PivotTable.RefreshTable
Range("P5").PivotTable.RefreshTable
End Sub

Toutefois si le TCD en P5 est réalisé à partir du TCD en A5 la deuxième instruction ne servira pas car le fait d'actualiser le premier TCD actualisera automatiquement le second.

Amicalement

Dan

capture d e cran 2016 11 25 a 10 43 57

Bonjour le forum,

Un grand merci à tous pour vos conseils. Je m'en occupe dans la journée et reviens vers vous ensuite.

Bonne journée.

Fabrice,

Bonjour

Pour le petit tuto de Dan

Changer la formule Décaler

=DECALER(Donnees!$A$1;;;NBVAL(Donnees!$A:$A)-1;2)

Par celle ci

=DECALER(Donnees!$A$1;;;NBVAL(Donnees!$A:$A);2)

Afin de prendre en compte les titres et toutes les lignes

Re-bonjour les amis du forum,

Je dois décidément être bête car, malgré vos judicieux conseils, je n'arrive pas à mettre à jour mes TCD...

Ma base où les données sont rentrées au Km via un Userform se trouve dans un onglet qui s'appelle "Journal_enregistrements". A partir de cette base, je souhaiterai mettre à jour plusieurs TCD qui se trouve dans des onglets différents (TCD PI, TCD PE, etc...).

Dans mon onglet "Journal_enregistrements", j'ai insérer le nom Plage_TCD avec la formule DECALER comme vous me l'avez suggéré.

J'ai ensuite insérer la procédure "RefreshAll" dans chaque feuille dans le VBA.

Malgré tout ça, mes TCD ne se mettent pas à jour... Je pense que c'est parce qu'il me manque une étape. Celle où les TCD doivent faire référence au nom "Plage_TCD" je pense...

Merci pour vos lumières...

Fabrice,

re,

A l'étape 1 de l'assistant TCD, vérifie que tu as bien mis PLAGE_TCD.

Si tu places la macro utilisant le REFRESHALL dans une feuille contenant un TCD, il faut que tu sélectionnes cette feuille pour tous les TCD de ton fichier s'actualisent. Si tu cliques sur une feuille ne contenant pas la macro REFERESALL, aucun TCD ne sera mis à jour.

Pour être sûr que cela fonctionne pour le fichier entier, il faut placer la macro ailleurs.

Je peux adapter ton code mais pour ce faire il faut connaître le nom des feuilles ne contenant pas de TCD.

Eventuellement mets ton fichier sur le forum ce sera plus facile.

A te relire

Dan

Edit Dan : Essaie ceci :

Enlève les macros contenant les REFRESALL et mets le code ci-après en VBA dans THISWORKBOOK :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
On Error Resume Next
ThisWorkbook.RefreshAll
End Sub

Re- le forum,

Bonjour Dan

C'est justement à cette fameuse étape 1 que je n'arrive pas à mettre le nom Plage_TCD... Quand je veux modifier la plage, j'ai un message : "Le nom du champ du tableau croisé dynamique n'est pas valide... Etc...".

Je peux refaire le TCD (puisque mes données sont toujours là) mais comment lui dire de faire référence au nom "Plage_TCD..."

Merci d'avance.

Fabrice,

re,

Le mieux est de refaire tes TCD.

Une fois le nom PLAGE_TCD défini par INSERTION / NOM / DEFINIR, va rechercher ce nom par INSERTION / NOM / COLLER lorsque tu es dans l'assistant étape 1.

A te relire

Dan

Edit : Etape 2 au lieu de étape 1

Bonjour,

Bonjour Dan

Fabrice, à l'étape 2, "Où se trouvent vos données", clique sur F3, tu auras alors la possibilité de sélectionner ton nom dans ta liste de noms..

Bonne journée

Re-, le forum

Dan, Felix,

J'ai essayé de faire comme vous me l'avez indiqué. Felix, quand je reviens sur l'étape 2 du TCD dans l'assistant, la touche F3 n'a aucune action...

J'ai donc effacé mon TCD pour en refaire un autre et quand j'arrive à l'étape 2, là je peux me servir de la touche F3 qui me propose effectivement le Nom défini avec la fonction DECALER. Je le choisi donc mais quand je clique sur disposition pour mettre en forme le TCD, j'ai à nouveau ce message d'erreur qui me dit :

" Le nom de champ de tableau croisé dynamique n'est pas valide. Pour créer un rapport de tableau croisé dynamique, vous devez utiliser les données sous forme de liste avec des étiquettes de colonnes. Si vous changez le nom d'un champ de tableau croisé dynamique, vous devez taper un nouveau nom pour le champ.".

Je ne sais pas comment m'en sortir et vous faire un bout de fichier va être compliqué car j'utilise plusieurs userform pour faire les mises à jour qui vont certainement prendre trop de place...

Merci de votre patience.

Fabrice,

Re-,

tu n'aurais pas de cellules vides dans tes en-têtes?

tu as bien pris les en-têtes dans ta formule décaler?

mets ici ta formule décaler..

Bon courage

re,

Sélectionne ta base de données et fais en un photo. Ensuite poste là ici que l'on voit comment se présente ta feuille.

A te relire

Dan

Re-,

Dan, Felix,

Je suis en retard pour attraper mon train et je n'ai malheureusement pas accès de chez moi à tous mes répertoires de boulot...

Je reprends le fil vendredi si cela ne vous ennuie pas...

Merci encore à vous deux et bon jeudi de l'Ascension.

Fabrice,

Bonjour les amis du forum,

En supprimant quelques onglets et quelques centaines de lignes de saisie, je peux joindre un fichier...

https://www.excel-pratique.com/~files/doc2/Declaration_charges.zip

Dans le code VBA, j'ai mis en commentaires les lignes qui me servaient, au départ, à rafraichir mes TCD.

Ne regardez pas la syntaxe du code Je suis archi-débutant mais je compte bien me perfectionner grâce à ce super forum... Le seul problème que je rencontre, c'est le temps que je peux consacrer au VBA qui me manque. Du coup, quand je me remets dessus, j'ai oublié pas mal de choses...

Merci de votre aide encore une fois.

Fabrice,

Rechercher des sujets similaires à "mise jour tcd macro"