IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro VBA de mise en forme d'un tableau croisé dynamique


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Octobre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Octobre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Macro VBA de mise en forme d'un tableau croisé dynamique
    Bonjour,

    Après de nombreuses recherches infructueuses, je viens à vous pour vous soumettre mon problème.

    J'ai un tableau composé de boîtes qui contiennent des objets. Ces boîtes peuvent être regroupées en thèmes. Un thème peut contenir plusieurs boîtes et une boîte peut appartenir à plusieurs thèmes. De même un même objet (type d'objet, comme une table) peut être dans des boîtes différentes.
    De ce tableau j'ai généré un TCD qui me donne pour chaque objet dans quelles boîtes il apparaît et combien de fois. J'ai donc un count des thèmes avec en colonne les boîtes et en ligne les objets.
    Jusque là tout va bien.
    Mais le but du TCD est de détecter les adhérences entre les boîtes. Et donc j'aimerais les mettre en avant en mettant en rouge la cellule du count total, colonne finale du TCD. Pour ça j'ai besoin d'une macro, car mon nombre d'objets, de thèmes et de boîtes sera amené à bouger au fil du temps.
    J'ai un algo, mais je n'arrive pas à trouver les évènements pour le traduire en VBA. -_-

    Mon algo est le suivant :
    Pour chaque ligne du TCD
    Si le total de la ligne est supérieur à 1 et s'il y a plus d'une cellule non vide dans la ligne alors
    mettre en rouge le total
    Fin si
    Fin pour

    Pourriez-vous m'aider à traduire cet algorithme en VBA et dans le cadre d'un TCD s'il vous plaît ?

    Jade.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 753
    Points : 28 603
    Points
    28 603
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    As-tu déjà utilisé l'enregistreur de macros en appliquant la mise en forme conditionnel au tableau croisé dynamique ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 412
    Points : 16 254
    Points
    16 254
    Par défaut
    Bonjour

    Pour compléter sais-tu que tu peux détecter la position des totaux d'un TCD : cela fait partie des propriétés de l'objet PivotTable.

    Attention la MFC des TCD doit être faites par référence aux champs dudit TCD.

    Sans vois le fichier ou une image du TCD avec la référence des colonnes difficile de te donner les paramètres de la formules de MFC
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Octobre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Octobre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos premiers retours.

    Effectivement je n'avais pas pensé à l'enregistreur de macro. Mais lors d'une mise en forme conditionnelle peut-on vraiment lui définir la restriction "s'il y a plus d'une cellule non vide dans la ligne" ? Je viens de tester et le résultat n'est pas très concluant.

    En fait ce qu'il me manque c'est les connaissances sur les évènements des TCD et donc de l'objet PivotTable. Mais aussi des types d'objets.

    Voici une ébauche que j'ai bidouillée avec un algo légèrement différent et qui est fausse puisqu'elle ne fonctionne pas, si ça peut vous aider. Qu'importe le nom des lignes et colonnes dans le TCD, je saurai faire le parallèle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Sub miseenforme()
     
    Dim tcd As PivotTable
    Dim line As PivotField
    Dim cell As PivotField
    Dim celltotal As PivotField
    Dim i As Integer
     
    Set tcd = ActiveSheet.PivotTables("PT1")
    Set line = tcd.PivotFields("Objet")
    Set cell = tcd.PivotFields("Count de Theme")
    Set celltotal = .Cells(.RowAxis.RowMember.TotalMember, .ColumnAxis.ColumnMember). _
                Aggregates("Count de Theme").Value
    i = 0
     
    'pour chaque ligne de valeur
    For Each line In tcd.RowFields
        'pour chaque cellule
        For Each cell In line
            'si elle n'est pas vide
            If cell.Range.Value Is Not Null Then
                'alors compter 1
                i = i + 1
            'fin si
            End If
        'fin pour
        Next
        'si le compte est suppérieur à 1
        If i > 1 Then
            'alors mettre la cellule total en rouge
            celltotal.DataField.DataRange.Interior.Color = red
        'fin si
        End If
    'fin pour
    Next
     
    End Sub
    Concernant la détection des totaux, je l'ignorais. Justement je n'ai pas les propriétés en tête car je découvre l'objet TCD. Et VBA a une auto complétion... Pas terrible à mon goût. Elle ne présente pas toutes les possibilités d'un objet avec leur descriptif. Mais j'ai peut être loupé une option pour en afficher plus. Je continue de chercher.

  5. #5
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 412
    Points : 16 254
    Points
    16 254
    Par défaut
    BOnjour
    Citation Envoyé par JadeDB Voir le message
    ...Mais lors d'une mise en forme conditionnelle peut-on vraiment lui définir la restriction "s'il y a plus d'une cellule non vide dans la ligne" ...
    Oui mais comme déjà dit sans voir le TCD, je ne peux te donner de formule car il faut raisonner par rapport à la colonne total d'une part et au nombre d'autres colonnes d'autre part... et la structure du TCD peut aussi compliquer ou faciliter...
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Octobre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Octobre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Voici en capture le tableau source et le TCD.
    Ce que je souhaite faire c'est de mettre en rouge la cellule total à "3" puisqu'elle correspond à un objet présent dans plusieurs boîtes. Les totaux à "2" par exemple ne correspondent pas à mon filtre et ne seront pas mis en rouge.

    A noter que le nombre de colonnes et de lignes n'est pas fixe.

    J'ai continué à chercher en terme de code et voici mon dernier essai, toujours aussi peu concluant...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Sub adherences()
     
    ThisWorkbook.Sheets("Feuil4").Select
    pvtTCD = ActiveSheet.PivotTables("TCDtest")
    i = 0
    c = pvtTCD.ColumnFields.Count
     
    'pour chaque ligne du tcd
    For r = 1 To pvtTCD.RowFields.Count
        'si le total est supérieur à 1
        If pvtTCD.ColumnFields(c).PivotItems(r).Value > 1 Then
            'pour chaque cellule de la ligne
            For n = 1 To (c - 1)
                'si la cellule n'est pas vide
                If pvtTCD.ColumnFields(n).PivotItems(r).Value Is Not Null Then
                    'alors augmenté d'un le compteur
                    i = i + 1
                End If
            Next
            'si la ligne contient plus d'une colonne non vide
            If i > 1 Then
                'alors mettre en rouge le total
                pvtTCD.ColumnFields("Total général").NumberFormat = [red]
            End If
        End If
    Next
     
    End Sub
    Images attachées Images attachées   

  7. #7
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 412
    Points : 16 254
    Points
    16 254
    Par défaut
    Bonjour

    Peux tu préciser l'adresse de la cellule du TCD "Nombre de Thèmes"
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Octobre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Octobre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Le TCD commence en A1.

  9. #9
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 412
    Points : 16 254
    Points
    16 254
    Par défaut
    Re

    Sélectionner la 1ère valeur en B3 : MFC et
    Nom : MFC_TCD.png
Affichages : 3672
Taille : 43,8 Ko
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Octobre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Octobre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Re,

    Merci pour ton retour.

    C'est une piste intéressante, hélas si je rajoute un troisième crayon dans la boîte D, ça ne fonctionne plus :/
    Mon tableau n'est pas figé dans le temps, que se soit en nombre de ligne, nombre de colonne et contenu.

    De plus j'ai testé et la mise en forme ne se fait pas sur le TCD, j'ignore pourquoi. D'autres mises en formes automatiques se font très bien...
    J'ai testé également avec une autre piste du style : =SI(ET(D3<>1;MAX(B3:C3)<>D3);VRAI;FAUX)
    Mais pas plus de résultat...

    En pièce jointe le fichier Excel.

    Merci pour ton aide, je sèche complètement -_-
    Fichiers attachés Fichiers attachés

  11. #11
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 412
    Points : 16 254
    Points
    16 254
    Par défaut
    Bonjour

    Si tu avais recopié ma formule cela marcherait et ce quel que soit le nombre de colonnes et de lignes.

    Les $ sont à respecter à la lettre : ce n'est pas $B$2 mais B$2....
    Nom : MFC_TCD.png
Affichages : 3714
Taille : 177,8 Ko

    Si tu ajoutes des boîtes effectivement le 3 n'est plus bon : tu peux remplacer par
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  12. #12
    Nouveau Candidat au Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Octobre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Octobre 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Re,

    Effectivement, j'avais loupé un $. Faut croire que les horaires à rallonge ne m'ont pas réussis...

    J'ai trouvé une piste intéressante de mise en forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ET(ESTNUM(CHERCHE("Total";B$2));(NBVAL(DECALER($A3;;;1;NBVAL(3:3))))>1)
    Ce n'est pas encore tout à fait ça mais ça me semble prometteur.



    Après quelques derniers tests j'ai trouvé un formule qui semble bien fonctionner lorsque je rajoute/enlève et boîtes ou des objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ET(ESTNUM(CHERCHE("Total";B$2));(NBVAL(DECALER($B3;0;0;1;NBVAL(3:3)))-(1+NB.SI(3:3;0)))>1)
    J'ai demandé à mon TCD d'afficher des 0 sur les cellules vides, puis j'ai calculé le nombre de cellules différentes de 0 en comptant celles non nulles, moins celles contenant un 0 et moins celle du total.

    Quoi qu'il en soit merci pour votre aide. De discuter du problème m'a sorti la tête du guidon ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/11/2010, 17h06
  2. [CR 2008] Mise en forme d'un tableau croisé
    Par mickamar dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 12/07/2010, 12h19
  3. [AC-2007] Mise en forme d'un tableau croisé dynamique
    Par Tyu38 dans le forum IHM
    Réponses: 3
    Dernier message: 02/06/2010, 07h57
  4. Réponses: 1
    Dernier message: 18/12/2008, 18h55
  5. Mise à forme d'un tableau croisé dynamique
    Par Oluha dans le forum Access
    Réponses: 16
    Dernier message: 20/02/2006, 09h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo