[TCD] Mise en forme conditionnelle

Bonjours à tous

Dans le cadre de mon travail je souhaiterai créer un TCD avec une mise en forme conditionnelle qui marchera après toute actualisation de la base de donnée.

Vous trouverez ci joint un exemple du TCD que je dois faire

J'ai pu conserver la largeur ainsi que les règles que j'impose de "remplissage de cellule" pour les pourcentages :

Noir = 100%

Pourpre = 40% à 50 %

Rouge = 20% à 40%

Orange = 8% à 20%

Jaune = 2% à 8%

Vert = ]0% à 2 %

La colonne 'Critère formule" contient une formule qui répète le nom de l'entreprise si la quantité est <30 et si la commission est <20).

L'étiquette "Critère formule" en tant qu'étiquette du TCD correspond au nombre de ligne de l'entreprise (A ou B ou C...) dont les valeurs de quantité et commission respectent ou non la formule.

Ce que je souhaite c'est parvenir à créer une mise en forme me permettant de remplir les cellules de pourcentage pour les étiquettes reprenant la valeur obtenu à partir de cette formule.

MAIS SEULEMENT pour les lignes de l'étiquette "Critère Formule" ayant récupéré le nom de l'entreprise.

Afin de vous de vous faciliter le travail ainsi que la compréhension de mon problème je vous ai mis le fichier en pièce jointe.

Merci d'avance !

55testouille.xlsx (22.88 Ko)

Bonjour,

Regarde ci ceci te correspond si cela ne va pas merci de faire un exemple dans ton fichier à fin de pouvoir répondre au mieux à tes attente.

Cordialement

Bonjour,

Je te remercie pour ton intervention mais je n'ai peut être pas été assez clair.

Mon problème et que je souhaite appliquer la mise en forme conditionnelle sur le tableau croisé dynamique.

Je souhaite pouvoir appliquer un remplissage des cellules en fonction de leurs pourcentage. MAIS seulement pour les lignes correspondant au nom de l'entreprise DANS l'étiquette. cf image 'bonne mise en forme".

Dans ma base de donnée, j'aurais statistiquement plus de cellule ne respectant pas ma formule de la colonne "critère formule".

Ce qui à pour conséquence dans la majorité des cas de n'avoir que des pourcentages <50% ce qui me permet en théorie d'appliquer juste des règles pour les valeurs en dessous de 50%.

Hors dans la réalité il est possible que le nombre de "ligne" correspondant à ma formule soit supérieur à 50% ce qui fait que la mise en forme s'applique sur la ligne de valeur ne respectant pas ma fonction. Voir "mauvaise mise en forme"

Ce que je souhaiterai c'est une formule que je pourrais rentrer dans la mise en forme conditionnelle selon une fonction me permettant ainsi d'appliquer la mise en forme seulement pour les lignes reprenant la lettre de l'entreprise mais dans l'étiquette "critère formule" de mon tableau croisé dynamique.

Si vous pensez qu'il faudrait faire une macro je suis ok pour en créer une mais je n'ai que des connaissances de débutant sur le VBA

Cordialement

bonne mise en forme mauvaise mise en forme

Bonjour,

Une proposition à étudier.

Cdlt.

Private Sub Worksheet_Activate()
    Me.PivotTables(1).PivotCache.Refresh
End Sub

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim rng As Range, Cell As Range
Dim I As Long

    Application.ScreenUpdating = False
    With Target
        .DataBodyRange.Interior.Color = xlNone
        Set rng = .PivotFields("Critère").DataRange
    End With
    For Each Cell In rng
        If Not IsEmpty(Cell) Then
            For I = 1 To 2
                Select Case Cell.Offset(, I)
                    Case Is < 0.02: Cell.Offset(, I).Interior.Color = RGB(146, 208, 80)
                    Case Is < 0.08: Cell.Offset(, I).Interior.Color = RGB(255, 255, 0)
                    Case Is < 0.2: Cell.Offset(, I).Interior.Color = RGB(255, 192, 0)
                    Case Is < 0.4: Cell.Offset(, I).Interior.Color = RGB(255, 0, 0)
                    Case Is < 0.5: Cell.Offset(, I).Interior.Color = RGB(112, 48, 160)
                    Case Else: Cell.Offset(, I).Interior.Color = RGB(0, 0, 0)
                End Select
            Next I
        End If
    Next Cell
    Set rng = Nothing

End Sub

Merci beaucoup Jean-Eric ! c'est exactement ce que je voulais.

J'essaye d'appliquer cette macro sur mon fichier testouille d'origine mais elle ne marche pas. Je n'arrive pas à l'enregistrer bien que j'ai recopié ton texte.

J'ai remarqué que dans la base de données tu as changé la formule que j'avais créer à l'origine.

Est ce la cause pour laquelle je ne parviens pas à appliquer ta macro ?

Je suis actuellement en train d'essayer de l'appliquer sur mon fichier mais cela à l'air problématique.

merci encore


De plus je pense que tu trouvera ca évident mais comment as tu fais dans ton TCD pour que ton étiquette "critère' ne soit pas inclus dans la colonne entreprise mais dans la colonne C ?

J'ai beau chercher dans les options du TCD mais je ne trouve pas cette fonctionnalité.

Pour la mise en forme de la colonne critère c'est bon je l'ai trouvé

J'ai réussi à appliquer ta macro sur mon fichier de test.

Je vais essayer de l'appliquer pour le fichier de mon travail je vous tiens au courant

Re,

A te relire.

Cdlt.

Bon c'est la crise.

J'ai essayé d'appliquer ta macro sur mon fichier final.

Je dois appliquer la mise en forme sur 3 colonnes de mon TCD donc pour cela j'ai dupliquer la macro 3 fois en m'assurant de renommer la range avec le nom de la colonne dans chacun des duplicata.

J'ai d'ailleurs rajouté de nouveaux critères de mise en forme

Voila à quoi ressemble la macro

Option Explicit

Sub Worksheet_Activate()
    Me.PivotTables(1).PivotCache.Refresh
End Sub

Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim rng As Range, Cell As Range
Dim I As Long

    Application.ScreenUpdating = False
    With Target
        .DataBodyRange.Interior.Color = xlNone
        Set rng = .PivotFields("Nombre de Clients").DataRange
    End With
    For Each Cell In rng
        If Not IsEmpty(Cell) Then
            For I = 1 To 1
                Select Case Cell.Offset(, I)
                    Case Is < 0.02: Cell.Offset(, I).Interior.Color = RGB(64, 255, 0)

                    Case Is < 0.08: Cell.Offset(, I).Interior.Color = RGB(255, 255, 0)

                    Case Is < 0.2: Cell.Offset(, I).Interior.Color = RGB(255, 192, 32)

                    Case Is < 0.5: Cell.Offset(, I).Interior.Color = RGB(224, 128, 96)

                    Case Is < 1: Cell.Offset(, I).Interior.Color = RGB(255, 0, 0)

                    Case Is = 1: Cell.Offset(, I).Interior.Color = RGB(160, 0, 32)

                    Case Else: Cell.Offset(, I).Interior.Color = RGB(160, 0, 92)
                End Select
            Next I
        End If
    Next Cell

    With Target
        .DataBodyRange.Interior.Color = xlNone
    Set rng = .PivotFields("Somme de Commiss.").DataRange
       End With
     For Each Cell In rng
        If Not IsEmpty(Cell) Then
            For I = 1 To 2
                Select Case Cell.Offset(, I)
                    Case Is < 0.02: Cell.Offset(, I).Interior.Color = RGB(64, 255, 0)

                    Case Is < 0.08: Cell.Offset(, I).Interior.Color = RGB(255, 255, 0)

                    Case Is < 0.2: Cell.Offset(, I).Interior.Color = RGB(255, 192, 32)

                    Case Is < 0.5: Cell.Offset(, I).Interior.Color = RGB(224, 128, 96)

                    Case Is < 1: Cell.Offset(, I).Interior.Color = RGB(255, 0, 0)

                    Case Is = 1: Cell.Offset(, I).Interior.Color = RGB(160, 0, 32)

                    Case Else: Cell.Offset(, I).Interior.Color = RGB(160, 0, 92)
                End Select
            Next I
        End If
    Next Cell

      With Target
        .DataBodyRange.Interior.Color = xlNone
    Set rng = .PivotFields("Somme de Quantité").DataRange
       End With
       For Each Cell In rng
        If Not IsEmpty(Cell) Then
            For I = 1 To 2
                Select Case Cell.Offset(, I)
                    Case Is < 0.02: Cell.Offset(, I).Interior.Color = RGB(64, 255, 0)

                    Case Is < 0.08: Cell.Offset(, I).Interior.Color = RGB(255, 255, 0)

                    Case Is < 0.2: Cell.Offset(, I).Interior.Color = RGB(255, 192, 32)

                    Case Is < 0.5: Cell.Offset(, I).Interior.Color = RGB(224, 128, 96)

                    Case Is < 1: Cell.Offset(, I).Interior.Color = RGB(255, 0, 0)

                    Case Is = 1: Cell.Offset(, I).Interior.Color = RGB(160, 0, 32)

                    Case Else: Cell.Offset(, I).Interior.Color = RGB(160, 0, 92)
                End Select
            Next I
        End If
    Next Cell

    Set rng = Nothing

End Sub

Je me doute qu'il est possible de le faire sans dupliquer la macro mais bon que veux-tu je suis pas subtil en VBA .

Le problème est que au lieu d'appliquer le remplissage dans les cellules des 3 colonnes du TCD la macro l'applique sur les colonnes en dehors du tableau cf image "problème"

Pourrais tu m'aider afin que le remplissage se fasse sur les colonnes que je souhaite

J'ai essayé de comprendre le fonctionnement de la partie "complexe" de la macro. Ce que j'ai pu retenir est que :

Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
          'titrage de la macro en indiquant que la cible de la macro est le TCD
Dim rng As Range, Cell As Range
'on associe rng a Range ainsi que Cell
Dim I As Long
'On dimensionne I en tant que LONG ???
    Application.ScreenUpdating = False
'Je ne  comprend pas

    With Target
' Avec la cible (cad le TCD)
        .DataBodyRange.Interior.Color = xlNone
'je ne comprend pas
        Set rng = .PivotFields("Nombre de Clients").DataRange
'On associe la range avec la colonne du TCD "nombre de clients" ainsi que leurs valeurs.
    End With
'fermeture du With
    For Each Cell In rng
'pour chacune des cellules de rng
        If Not IsEmpty(Cell) Then
'Si la cellule est vide alors 
            For I = 1 To 1
'je ne comprend pas :(

Je te remercie encore pour le temps que tu accorde sur mon cas !

Cordialement

probleme

RE,

Un nouvel exemple.

Le code est commenté.

Cdlt.

RE

Bon j'ai réussi à appliquer la macro sur mon fichier

Mais j'ai encore des problèmes que je souhaiterai corriger.

1 : le Premier est sur l'évaluation des pourcentage dans le cas de l'image problème en pièce jointe vous pouvez voir que dans ce cas la pourcentage des lignes correspondant à la fonction est supérieur à ceux qui ne la respectent pas.

Or ce que je souhaite faire avec la macro c'est qu'elle applique la mise en forme SEULEMENT pour les valeurs de la ligne des étiquettes dont le nom réapparait (comme dans le fichier testouille avec le B qui apparait dans l'étiquette entreprise B).

Une fois cette règle ajoutée il ne me restera qu'à rajouter des conditions de mise en page afin de couvrir la plage de pourcentage de 0% à 100%

Cordialement

probleme

RE,

Merci de joindre un fichier.

Cdlt.

Bonjour

J'ai créer un fichier qui reprend la structure et le fonctionnement de mon tableau de la mission que je dois faire.

J'ai appliqué la formule de la macro de base pour te faciliter le travail, afin que tu n'ai qu'a ajouter les lignes pouvant répondre aux problèmes.

J'ai rajouté les détails des contraintes que je souhaiterai appliquer dans le fichier directement.

J'espère que ca sera clair pour toi.

Cordialement

Bonjour,

Tout cela est très loin d'être clair.

Cdlt.

Bonjour,

Merci beaucoup c'est parfait ! Désoléde ne pas avoir été assez clair

J'ose une dernière fois abuser de ton aide mais est il possible d'appliquer le remplissage noir mais seulement pour les lignes "vides" lorsqu'elles sont à 100% ?

J'ai joint un fichier qui j'espère sera clair.

Je vais essayer de l'appliquer ce que tu m'a donné sur mon fichier de base en attendant ta réponse .

cordialement

RE,

Voir fichier.

Cdlt.

J'ai eu quelque soucis à ajouter la macro mais je me susi rendu compte que la forme de mon TCD n'était pas appropriée.

Je l'ai modifié et cela marche bien, j'ai aussi compris comment marche la macro du coup est il possible de créer une ligne de commande permettant de remplir les cellules à droite d'une cellule vide si leurs valeurs est égale à 100 % ??

je devrais faire une commande de ce type ?

If empty(cell) then
For I = 2 to 4
Select Case Cell.Offset(, I)
                    Case Is < 0.02: Cell.Offset(, I).Interior.Color = RGB(0, 0, 0)
    End Select
            Next I
        End If
    Next Cell
    Set rng = Nothing

Merci encore

Ca marche !

Merci beaucoup, tu m'as permis de mieux comprendre comment fonctionne le VBA

Je te dérange juste une dernière chose.

Je souhaite faire des bordures noires sur certaine cellule

Est ce que cette commande est bonne ?

 Select Case Cell.Offset(, I)
                    Case Is = 1: Cell.Offset(, I).Interior.Color = RGB(0, 0, 0)
                    Case Is = 1: Cell.Offset(, I).Borders.Weight = xlThin
                    Case Is = 1: Cell.Offset(, I).Borders.ColorIndex = 1
Rechercher des sujets similaires à "tcd mise forme conditionnelle"