Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Un tableau croisé dynamique de plus...

  • Initiateur de la discussion Initiateur de la discussion Belgoman
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

B

Belgoman

Guest
Bonjour le forum,

Après quelques mois d'absence, me revoici avec un problème bien ennuyeux. J'ai constitué un TCD que je désire "piloter" par macro. Pour être précis, je voudrais sélectionner la valeur "ROBERT" dans le champ de colonne "N°" (qui contient beaucoup mais alors beaucoup d'autres valeurs).

J'ai réalisé cette petite macro (avec l'aide la touche F1) :
Code:
For Each pvtitem In Sheets("Pointages").PivotTables("TCD_Pointages").PivotFields("N°").PivotItems
If (pvtitem.Name = "ROBERT") Then
    pvtitem.Visible = True
ElseIf (pvtitem.Name <> "ROBERT") Then
    pvtitem.Visible = False
End If
Next
La macro semble fonctionner mais est extrêmement lente (je n'ai jamais eu la patience d'attendre jusqu'au bout d'ailleurs). Je pense que cela est du au fait que le tableau est recalculé après chaque "dé-sélection".

J'ai consulté une volée de posts sur le forum mais sans succès...

Ma question est donc la suivante : Comment puis-je améliorer ma macro pour la rendre plus rapide ?

Merci,
Belgoman
 
Re : Un tableau croisé dynamique de plus...

Bonjour, ceci aide-t-il ?

VB:
With Application
  .Screenupdating = False
  .Calculation = xlCalculationManual
  For Each pvtitem In Sheets("Pointages").PivotTables("TCD_Pointages").PivotFields("N°").PivotItems
    pvtitem.Visible = iif(pvtitem.Name = "ROBERT", True, False)
  Next
  .Screenupdating = True
  .Calculation = xlCalculationAutomatic
End With
 
Re : Un tableau croisé dynamique de plus...

Bonjour Softmama,

Merci pour ta réponse malheureusement la solution proposée ne semble pas fonctionner chez moi. L'idée (si je la comprends bien) d'arrêter le calcul durant la boucle For me parait pourtant bonne mais comment faire :-(...

Belgoman
 
Re : Un tableau croisé dynamique de plus...

Bonjour Belgoman, Bonjour Softmama,

Sur la même idée (mais les TCD sont indépendants du mode de calcul classique je crois)

Modifier les ligne de SoftMama avec Calculation par


Code:
Sheets("Pointages").PivotTables("TCD_Pointages").ManualUpdate = False
puis
Code:
Sheets("Pointages").PivotTables("TCD_Pointages").ManualUpdate = True
(pas testé)
 
Dernière édition:
Re : Un tableau croisé dynamique de plus...

Bonjour tototiti2008,

je viens d'essayer la modification proposée mais ca ne marche toujours pas chez moi.
Ca m'apprendra a vouloir jouer avec les tableaux croisés dynamiques ! ;-)...

Bonne soirée,
Belgoman
 
Re : Un tableau croisé dynamique de plus...

Bonjour,

Euh, je crois que j'ai répondu un peu vite hier

si tu intervertis les 2 lignes que je te proposais, ça donne quoi ?
Oui, logique, d'abord on passe en mise à jour manuelle (ManualUpdate = true) puis on désactive la mise à jour manuelle (ManualUpdate = false)
Et pas le contraire 😱

Mais je ne suis pas sûr que ça réponde à ta question.... Pas de TCD long à mettre à jour sous la main

Si ton TCD est aussi long à mettre à jour, c'est qu'il est basé sur des données externes ? genre grande base de données avec table/requête énorme ?
Ou alors c'est simplement lié à des données d'une autre feuille ?

Et si c'est une autre feuille, est-ce que celle-ci contient des champs calculés avec des formules lourdes ? Auquel cas la solution de Softmama aurait dû te faire gagner du temps...

Bref, quelques précisions nous donneraienrt peut-être des pistes
 
Re : Un tableau croisé dynamique de plus...

Bonjour tototiti2008,

J'avais fait l'adaptation lors de mon premier essai. Le TCD semble donc toujours se calculer à chaque "dé-sélection". Le temps de calcul pour filtrer le champ de colonne "N°" sur "ROBERT" est d'environ 10 minutes 🙂-().

En ce qui concerne mes données, elles proviennent d'une autre feuille de 48000 lignes et 60 colonnes environ (mais sans aucune formule). Si ca peut aider, je veux bien essayer de constituer un fichier test mais je crains qu'il soit un peu "lourd" (50 Mo environ...).

Par contre, j'ai vu sur le forum des posts au sujet du nettoyage de la liste de sélection dans les TCD. S'il est impossible de bloquer le re-calcul du TCD à chaque dé-sélection, n'est-il pas possible de diminuer le nombre de dé-sélection à effectuer. Par exemple, est-il concevable de limiter la liste du champ de colonne "N°" aux valeurs "ROBERT", "MARC", "LUCIEN" et "BERNARD" (les autres valeurs ne me servent pas en fait). De cette façon, il n'y aurait que 3 dé-sélections à effectuer pour filtrer sur "ROBERT", ce qui devrait limiter le temps de calcul.

Bon weekend,
Belgoman
 
Re : Un tableau croisé dynamique de plus...

Bonjour Belgoman,


Sur le principe, l'idée est excellente, mais je viens d'enregistrer une macro en décochant Afficher tout (qui les décoche tous) puis en en recochant qu'un seul, et le code généré refait la liste de tous les éléments qui ont été décochés... ce qui revient au même que ton code original....


S'il n'y a vraiment que ROBERT (coucou 🙂), MARC, LUCIEN et BERNARD qui t'intéressent, peut-être envisager un TCD basé sur des données externes qui filtreraient les lignes en amont.
Connais-tu les données externes ?
 
Re : Un tableau croisé dynamique de plus... [Résolu]

Bonjour tototiti,

Après avoir tergiversé longuement, j'ai finalement suivi ton idée. J'ai remplacé les valeurs parasites par un blanc dans la table de données :

Code:
Sheets("données").Select
Sheets("données").Range("A1").Sort Key1:="Type", Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Ligne = (Sheets("données").Cells.Find(What:="Ressource", LookIn:=xlValues, After:=ActiveCell, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Row) - 1
Colonne = Sheets("données").Rows(1).Find(What:="N°", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Column
Sheets("données").Range(Cells(2, Colonne), Cells(Ligne, Colonne)).Value = ""
ActiveWorkbook.Save

Merci pour ton aide.

Belgoman
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…