[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 !
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
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 SubMerci 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 SubJe 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
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
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,
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
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 = NothingMerci 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