Rafraîchir TCD avec macro VBA (click sur une cellule)

Bonjour à tous,

Je viens vers vous car j'ai grand besoin de votre aide En effet, sur mon fichier excel j'ai réalisé une sorte de dashboard celui-ci tire ces données de plusieurs TCD qui se trouve dans une autre feuille, jusque-là rien de trop compliqué j'ai réussis à effectué une macro qui me permet de rafraîchir les TCD par le click sur un bouton me permettant de changer le pays ou le type de client, bouton créer par l'outil développeur, qui change dans les TCD les filtres et rafraîchit par la même occasion tous les TCD présents, mais maintenant j'ai un soucis, car j'aimerais que les TCD soit aussi mit à jour lorsque je change la date, et le cas est clairement différent du changement de pays ou de type de client, cette fois il s'agit d'une liste déroulante (créée via le menu "Data Validation"), j'aimerais donc savoir s'il est possible que lorsque je change une date mes TCD présent dans une autre feuille soit mit à jour ou est-ce que je suis obligé de faire comme pour les précédents modes (Pays et Type de client) je tiens à préciser que ça me poserais un gros problème car beaucoup de mes formules dépendent des cellules "Date" et "Année" et qu'après une tentative j'ai eu un gros plantage sur absolument tout mon fichier et surtout sur la formule "=DATE(B7,MONTH(1&B8)-1,1)" qui dans le cas d'une création de bouton me renvoi plus le mois précédent mais l'année et le mois précédent

Je joins un fichier afin de voir si vous pouvez m'aider ou m'aiguiller au mieux car j'avoue que là je suis totalement perdu ...

Sur le fichier que je vous joint le TCD qui ne se met pas à jour et situé dans la feuille "Cross tabulation" en Q28

J'espère que j'ai réussis à faire comprendre mon problème ^^ en gros c'est : "Peut-on réussir à faire une macro VBA qui va rafraîchir tous les TCD grâce à une cellule comportant une liste déroulante, si oui quelle est la façon de faire ? Si non comment résoudre ce problème ?"

Merci d'avance et bonne soirée à vous tous !

Cordialement

45aide-refreshtcd.xlsm (140.28 Ko)

Bonjour,

la valeur de Sheets("DashBoard").Range("B8") n'est pas compatible avec les date du TCD,

il faudrait faire une liste de validation avec un choix de 1 à 12

ÉDIT:

Sub RefreshTCD15()
With Sheets("Cross Tabulation")
On Error Resume Next
.PivotTables("Tableau croisé dynamique15").PivotFields("Years").ClearAllFilters
   For Each Pi In .PivotTables("Tableau croisé dynamique15").PivotFields("Years").PivotItems
    x = Pi
    choixAnnée = CStr(Sheets("DashBoard").Range("B7"))
    choixMois = Sheets("DashBoard").Range("B8")
     If Pi = choixAnnée Or Month(Pi) = choixMois Then
      Pi.Visible = True
     Else
      Pi.Visible = False
     End If
   Next
End With
End Sub

Bonjour,

Pourquoi ne pas commencer par utiliser les segments et lier les TCDs?

Cdlt.

Bonjour,

la valeur de Sheets("DashBoard").Range("B8") n'est pas compatible avec les date du TCD,

il faudrait faire une liste de validation avec un choix de 1 à 12

ÉDIT:

Sub RefreshTCD15()
With Sheets("Cross Tabulation")
On Error Resume Next
.PivotTables("Tableau croisé dynamique15").PivotFields("Years").ClearAllFilters
   For Each Pi In .PivotTables("Tableau croisé dynamique15").PivotFields("Years").PivotItems
    x = Pi
    choixAnnée = CStr(Sheets("DashBoard").Range("B7"))
    choixMois = Sheets("DashBoard").Range("B8")
     If Pi = choixAnnée Or Month(Pi) = choixMois Then
      Pi.Visible = True
     Else
      Pi.Visible = False
     End If
   Next
End With
End Sub

Bonjour sabV, tout d'abord merci de la réponse, je t'avoue que je ne comprends pas trop ton message (je suis débutant sur VBA)

La liste de choix de 1 à 12 c'est à dire ? qu'à la place de 2017 2018 je dois mettre 1 2 3 ...

Pour le code VBA je dois le mettre dans la feuille même où la rentrer pour une cellule précise ?

Merci d'avance

Cordialement

Bonjour,

Pourquoi ne pas commencer par utiliser les segments et lier les TCDs?

Cdlt.

Aide-refreshTCD (1).xlsm

Bonjour Jean-Eric, merci pour la réponse, le problème c'est que nous avons déjà énormément avancé sur le Dashboard l'envoi que j'ai fais ne contient qu'un graphique, mais il y a beaucoup beaucoup de choses qui changent et qui sont déjà automatisées, surtout le second problème c'est que nous souhaitons affiché par période de 6 mois (3 mois avant la date sélectionnée et 3 mois après) ici avec 2018 on vient au problème qu'il n'affiche que 2018 puis niveau esthétique on va dire que je risque d'avoir des retours (que je sais d'avance ^^) donc si j'ai la possibilité juste de réussir à faire ce refresh par un petit code VBA

Ce Dashboard et la reprise d'un autre qui a déjà beaucoup plut à mes directeurs, et ils attendent le même mais présentant autre chose ... Je me retrouve un peu coincé dirons nous

Bonjour,

Pourquoi ne pas commencer par utiliser les segments et lier les TCDs?

Bonjour,

sans rien toucher à ton travail actuel, tu ajoutes des segments et en cliquant droit sur un segment (qui n'est jamais qu'un filtre sur TCD mais plus visuel) tu lies tous les tcd.

Ca ne change rien à tes tcd et à ta base de données

P.

Bonjour,

Pourquoi ne pas commencer par utiliser les segments et lier les TCDs?

Bonjour,

Ce que jeux dire Jean Eric, c'est que sans rien toucher à ton travail actuel, tu ajoutes des segments et en cliquant droit sur un segment (qui n'est jamais qu'un filtre sur TCD mais plus visuel) tu lies tous les tcd.

Ca ne change rien à tes tcd et à ta base de données

P.

Bonjour Patrick, le problème n'est pas le fait de toucher la base de données, c'est qu'en fait mon dashboard est dans l'ensemble finit le fichier que j'ai partagé ne contient qu'un graphique parmi de nombreux qui eux sont déjà automatisés et n'ont aucuns soucis, ainsi que pas mal d'autres données. Le soucis supplémentaire c'est que sur mon Dashboard l'espace même le plus petit qu'il soit doit être optimisé et les segments sont beaucoup trop volumineux et viendrait totalement casser le design déjà existant et hélas je peux me le permettre ... De plus les segments présents ne proposent pas les fonctions recherchées pour le reste du dashboard cela répondrait au soucis de rafraîchissement, mais pas à d'autres contrariété tel que le fait de demander une période ici lorsqu'on choisit 2018 on obtient que 2018 alors que le but du dashboard est aussi de comparer pour certaines données au mois précédent et pour d'autres graphiques d'affichés 3 mois avant et 3 mois après

Je sais que ma demande est complexe mais j'espère qu'il existe réellement une autre solution comme sabV à l'air de proposer mais je ne comprend pas la démarche

Re,

On peut aussi insérer une chronologie!...

Sinon, as-tu regardé la construction du 2ème. TCD avec des champs calculés?

Il évite un tableau intermédiaire pour créer un nouveau TCD (graphique).

Cdlt.

Je ne comprend pas trop votre réponse mais il m'est impossible de passer par ce type de segment ...

Voici le dashboard final avec tous les graphiques, il y a un manque de place, de plus tous ce qui est sur le côté gauche (que j'ai couvert de noir pour éviter de donner des chiffres) dépend des cellules : Year / Month / Country / Custo, je ne peux me permettre de passer par les TCD car dans ce cas tout serait casser, il ne proviennent pas tous d'un TCD et en plus font une différence entre le mois choisit et le précédent pour certaines données ... (donc formule faite).

Il n'existe donc pas de solution VBA pour rafraîchir une fois que je choisis le mois et l'année sur le dashboard ?

La solution de sabV n'est elle pas possible ? et comment fonctionne t'elle ?

EDIT :

Je précise que les deux premiers graphiques sont pour le coup parfaitement bien synchronisés avec le changement de date et de mois

les autres graphiques sont mit à jour aussi mais seulement si je change de custo ou de country (grâce à la macro VBA), mais j'aimerais le faire aussi pour les dates et mois car on peut ne pas souhaiter changer de pays/type de client

re,

sabV a écrit

la valeur de Sheets("DashBoard").Range("B8") n'est pas compatible avec les date du TCD,

il faudrait faire une liste de validation avec un choix de 1 à 12

Tu dois remplacer tes mois jan-fev-mar par 1-2-3 dans ta liste déroulante, c'est sa réponse mais alors il faut adapter la formule qui y fait référence.

P.

re,

sabV a écrit

la valeur de Sheets("DashBoard").Range("B8") n'est pas compatible avec les date du TCD,

il faudrait faire une liste de validation avec un choix de 1 à 12

Tu dois remplacer tes mois jan-fev-mar par 1-2-3 dans ta liste déroulante, c'est sa réponse mais alors il faut adapter la formule qui y fait référence.

P.

Le problème c'est donc qu'il ne reconnait pas les mois ? la formule n'accepte que des chiffres ?

Merci de l'aide et désolé si je ne peux pas prendre les segments TCD mais c'est pas spécialement parce que je ne veux pas moi mais on va dire qu'il y a plusieurs choses qui font que je ne peux pas passer par ça ...

re,

le principe dans une base de données ou un fichier qui sera la source d'un TCD, c'est que les dates soient en numériques dès le départ et en colonne.

Les dates ne sont que des nombres calculés par XL depuis le 1/1/1900 ou 1904 suivant l'option choisie; ça simplifie grandement de mettre des chiffres et puis on mets un format "mm" ou "mmm" qui fait apparaitre "jan" ou "janvier".

P.

re,

le principe dans une base de données ou un fichier qui sera la source d'un TCD, c'est que les dates soient en numériques dès le départ et en colonne.

Les dates ne sont que des nombres calculés par XL depuis le 1/1/1900 ou 1904 suivant l'option choisie; ça simplifie grandement de mettre des chiffres et puis on mets un format "mm" ou "mmm" qui fait apparaitre "jan" ou "janvier".

P.

Hum ... ça ne m'arrange pas alors xD car si j'utilises des chiffres on va me faire la remarque qu'il faut que ce soit en lettre et effectivement ça risque de casser mes autres formules aussi ... ou dans ce cas je pourrais faire en sorte qu'une case "cachée" correspond à la reprise de ma cellule contenant les mois mais cette fois en chiffre et lorsque je modifie le mois celle-ci ce modifie aussi et donc rafraîchit ? ça risque de faire ramer mon fichier aussi de rajouter encore ça ? ...

Bin , répond leur qu'ils n'y connaissent rien ...

Une date c'est un nombre qui apparaît en nombre ou en lettre suivant sont format; il y a toujours moyen de faire avec des janvier-février mais ça complique toujours les choses?

Juste MON avis

P.

Bin , répond leur qu'ils n'y connaissent rien ...

Une date c'est un nombre qui apparaît en nombre ou en lettre suivant sont format; il y a toujours moyen de faire avec des janvier-février mais ça complique toujours les choses?

Juste MON avis

P.

J'aimerais bien leur dire ça mais je pense que les directeurs vont moyennement appréciés

Pour toi il serait donc possible tout de même de passer avec un système tel que j'ai actuellement ?

Je me prends la tête depuis deux jours sur ça ... ça m'énerve car c'est le petit truc qui fait que le Dashboard n'est pas finit U_u pour un "petit" truc ...

Bin , répond leur qu'ils n'y connaissent rien ...

Une date c'est un nombre qui apparaît en nombre ou en lettre suivant sont format; il y a toujours moyen de faire avec des janvier-février mais ça complique toujours les choses?

Juste MON avis

P.

Alors après question bête mais n'est-il pas possible de dire à la macro qu'à un changement de "données" dans la cellule B8 il fasse une actualisation totale du TCD ? Le fait qu'il y est n'importe quelle donnée ou valeur pourrait permettre un rafraichissement ? C'est une question bête mais au moins ça évite de s'embêter avec ce qui est présent dans la cellule à partir du moment ou celle-ci change il y aurait une mise à jour ? Je sais pas ... Car lorsque l'on change de mois, la cellule doit bien intégrer le fait qu'il y a un changement non ? Je vais m'arracher les cheveux (heureusement ils sont longs )

Bonjour,

J'ai modifié la macro pour éviter de modifier la liste de validation "mois",

est ce que c'est mieux comme ça ?

Sub RefreshTCD15()
arrMois = Array("", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

With Sheets("Cross Tabulation")
On Error Resume Next
.PivotTables("Tableau croisé dynamique15").PivotFields("Years").ClearAllFilters
   For Each Pi In .PivotTables("Tableau croisé dynamique15").PivotFields("Years").PivotItems
    x = Pi
    choixAnnée = CStr(Sheets("DashBoard").Range("B7"))
    choixMois = Application.Match(Sheets("DashBoard").Range("B8"), arrMois, 0)
     If Pi = choixAnnée Or Month(Pi) = choixMois Then
      Pi.Visible = True
     Else
      Pi.Visible = False
     End If
   Next
End With
End Sub

Bonjour,

J'ai modifié la macro pour éviter de modifier la liste de validation "mois",

est ce que c'est mieux comme ça ?

Sub RefreshTCD15()
arrMois = Array("", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

With Sheets("Cross Tabulation")
On Error Resume Next
.PivotTables("Tableau croisé dynamique15").PivotFields("Years").ClearAllFilters
   For Each Pi In .PivotTables("Tableau croisé dynamique15").PivotFields("Years").PivotItems
    x = Pi
    choixAnnée = CStr(Sheets("DashBoard").Range("B7"))
    choixMois = Application.Match(Sheets("DashBoard").Range("B8"), arrMois, 0)
     If Pi = choixAnnée Or Month(Pi) = choixMois Then
      Pi.Visible = True
     Else
      Pi.Visible = False
     End If
   Next
End With
End Sub

Bonjour SabV, merci de la réponse serait-il possible de me décrire un peu cette macro pour éviter que je refasse un post inutile et que je me couche moins bête

Faut-il intégrer cette macro directement dans la feuille ? ou l'attribuer à une partie précise ? genre une cellule (si c'est possible je ne sais pas )

Bonjour à tous,

kinders59, les macro sont à copier sur la page code de la feuille "DashBoard"

Private Sub Worksheet_Change(ByVal Target As Range)
's'il y a un changement sur la feuille "DashBoard" dans la cellule  "$B$7$" ou "$B$8$"  mettre le tcd15 à jour
If Target.Address = "$B$7$" Or Target.Address = "$B$8$" Then RefreshTCD15
End Sub

Sub RefreshTCD15()
arrMois = Array("", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
With Sheets("Cross Tabulation")
On Error Resume Next
.PivotTables("Tableau croisé dynamique15").PivotFields("Years").ClearAllFilters
'pour chaque item du champ "Years" du tcd15
   For Each Pi In .PivotTables("Tableau croisé dynamique15").PivotFields("Years").PivotItems
    choixAnnée = CStr(Sheets("DashBoard").Range("B7"))
'    'trouve le mois sélectionner dans les donnée de arrMois et retourne un chiffre entre 1 et 12
    choixMois = Application.Match(Sheets("DashBoard").Range("B8"), arrMois, 0)
     If Pi = choixAnnée Or Month(Pi) = choixMois Then
      Pi.Visible = True
     Else
      Pi.Visible = False
     End If
   Next
End With
End Sub
Rechercher des sujets similaires à "rafraichir tcd macro vba click"