Alternance couleur de remplissage sur changement valeur en colonne C

Kiriko

XLDnaute Occasionnel
Bonjour à tous !
J'ai un soucis de mise en page sur le fichier joint.

Un tableau est défini (Tableau13)
A l'intérieur de ce tableau je souhaiterais que dès qu'il y a changement de valeur en colonne C, la couleur de remplissage des colonnes A à K change, alternativement, un coup sans remplissage, un coup gris clair, ainsi de suite, comme je l'ai fait "manuellement" dans le fichier joint...

Pour info, ce "tableau" peu comporter jusqu'à 2500 lignes, est réalisé par macro, n'est pas du tout trié à l'origine, c'est la macro qui exécute le tri (en fin de code)...

Des MFC sont déjà présentes pour d'autres "options" de présentation, mais si d'aventure vous voyez une méthode plus simple et plus rapide pour le même résultat, je prends bien sûr...

J'ai également un soucis sur les sauts de pages, mais je posterais un nouveau sujet afin d'avoir un titre de discussion explicite et faciliter les recherches d'autres forumeurs en demande...

Merci par avance,
Cordialement,
 

Pièces jointes

  • Alternance couleur remplissage sur changement valeur colonne C.xlsx
    50 KB · Affichages: 195

Robert

XLDnaute Barbatruc
Repose en paix
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Bonjour Kiriko, bonjour Cisco, bonjour le forum,

Une autre proposition par VBA :
Code:
Sub Macro1()
Dim p As Object 'déclare la variable p (onglet Plannings)
Dim dl As Integer 'décalre la variable dl (Dernière Ligne)
Dim pl As Range 'décalre la variable pl (PLage)
Dim cel As Range 'décalre la variable cel (CELlule)
Dim tl() As Integer 'décalre le tableau de variables indexées tl (Tableau de Lignes)
Dim i As Integer 'décalre la variable i (Incrément)

Set p = Sheets("Plannings") 'définit l'onglet p
dl = p.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A)
Set pl = p.Range("C2:C" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellule cel de la plage pl
    If cel.Offset(1, 0).Value <> cel.Value Then 'condition 1 : si la valeur de la cellule en dessous de cel est différente de la valeur de cel
        ReDim Preserve tl(1, i) 'redimensionne le tableau tl
        If tl(0, i) = 0 Then 'condition 2 : si la variable indéxée tl(0,i) est nulle (ligne du début de la plage à colorier)
            tl(0, i) = cel.Offset(1, 0).Row 'récupère le numéro de ligne du début de la plage à colorier
        Else 'sinon
            tl(1, i) = cel.Row 'récupère la ligne de la fin de la plage à colorier
            i = i + 1 'incrémente i
        End If 'fin de la condition 2
    End If 'fin de la condition 1
Next cel 'prochaine cellule de la boucle
For i = 0 To UBound(tl, 2) - 1 'boucle sur toutes les variable indexées
    p.Range(p.Cells(tl(0, i), 1), p.Cells(tl(1, i), 11)).Interior.ColorIndex = 48 'colore la plge en gris
Next i 'prochaine variable de la boucle
End Sub
 

Kiriko

XLDnaute Occasionnel
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Bonjour CISCO, bonjour Robert !
Merci beaucoup à tous les deux !!
L'approche de CISCO est intéressante, je pourrais sans doute m'en servir ailleurs, mais il est vrai que je n'ai pas précisé que les dates ne sont pas forcément contiguës (on peut passer du 5 au 7 octobre, donc 2 jours "impairs" qui se suivent dans le fichier...

Robert, ce code fonctionne parfaitement, merci !!
Je pensais rajouter ceci en début de code (trouvé grâce à l'enregistreur) :
Code:
   Rows("2:2").Select
    Range(Selection, Selection.End(xlDown)).Select
    
    Range(Selection, Selection.End(xlDown)).Select
    With Selection.Interior
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Range("Tableau13[[#Headers],[Planning]]").Select

Sinon, pour ma culture personnelle, vu que l'élément à traité est un tableau défini ("Tableau13"), se servir de ce nom dans le code ne serait-il pas possible ? Cela réduirait-il des calculs ?
Ceci juste pour info, car le code en l'état me convient déjà parfaitement...

Merci encore à tous les deux !!
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Bonjour Kiriko, Cisco, bonjour le forum,

Ce que tu appelles tableau défini semble s'appeler Liste dans ma version (Excel 2003) et c'est quelque chose que je n'ai encore jamais utilisé jusqu'à présent. Je suis donc incapable de répondre à ta question...

Pour ton début de code cette simple ligne derait faire l'affaire :
Code:
pl.Offset(0, -2).Resize(pl.Rows.Count, 11).Interior.ColorIndex = xlNone 'supprime la couleur grise
Le code complet avec ce rajout :
Code:
Sub Macro1()
Dim p As Object 'déclare la variable p (onglet Plannings)
Dim dl As Integer 'décalre la variable dl (Dernière Ligne)
Dim pl As Range 'décalre la variable pl (PLage)
Dim cel As Range 'décalre la variable cel (CELlule)
Dim tl() As Integer 'décalre le tableau de variables indexées tl (Tableau de Lignes)
Dim i As Integer 'décalre la variable i (Incrément)

Set p = Sheets("Plannings") 'définit l'onglet p
dl = p.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A)
Set pl = p.Range("C2:C" & dl) 'définit la plage pl
pl.Offset(0, -2).Resize(pl.Rows.Count, 11).Interior.ColorIndex = xlNone 'supprime la couleur grise
For Each cel In pl 'boucle sur toutes les cellule cel de la plage pl
    If cel.Offset(1, 0).Value <> cel.Value Then 'condition 1 : si la valeur de la cellule en dessous de cel est différente de la valeur de cel
        ReDim Preserve tl(1, i) 'redimensionne le tableau tl
        If tl(0, i) = 0 Then 'condition 2 : si la variable indéxée tl(0,i) est nulle (ligne du début de la plage à colorier)
            tl(0, i) = cel.Offset(1, 0).Row 'récupère le numéro de ligne du début de la plage à colorier
        Else 'sinon
            tl(1, i) = cel.Row 'récupère la ligne de la fin de la plage à colorier
            i = i + 1 'incrémente i
        End If 'fin de la condition 2
    End If 'fin de la condition 1
Next cel 'prochaine cellule de la boucle
For i = 0 To UBound(tl, 2) - 1 'boucle sur toutes les variable indexées
    p.Range(p.Cells(tl(0, i), 1), p.Cells(tl(1, i), 11)).Interior.ColorIndex = 48 'colore la plge en gris
Next i 'prochaine variable de la boucle
End Sub
 

Kiriko

XLDnaute Occasionnel
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Re bonjour Robert ! Bonjour CISCO, Bonjour le forum !
Vraiment merci Robert, c'est vraiment parfait.
Non content de répondre parfaitement à mes besoins, ton code est détaillé ligne par ligne, ce qui sera très formateur pour moi, je vais me faire un plaisir de le décortiquer ligne par ligne pour tenter de comprendre...

Pour ce qui est du "tableau", lorsque je saisi une plage de donnée, il y a l'option "mettre sous forme de tableau", qui outre le fait de pouvoir appliquer des mises en forme prédéfinies (bof) permet surtout de recopier les formules uniquement sur les lignes utilisées, "automatiquement".

Merci encore !!

Sinon, je vais poster un autre sujet sur ce fichier, concernant un soucis de saut de page...
 

CISCO

XLDnaute Barbatruc
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Bonjour à tous, bonjour Kiriko

Et oui, ce n'était pas aussi simple que ce que je croyai. Je n'avais pas regardé la liste des dates assez vers le bas... Pour le moment, je ne vois pas de solution avec une MFC, sans colonne intermédiaire. Si la macro de Robert fait l'affaire, tant mieux.

@ plus

Cisco
 
Dernière édition:

Kiriko

XLDnaute Occasionnel
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Bonjour à tous, bonjour CISCO,
Tous mes remerciements encore pour l'intérêt porté. Comme je le disais, je suis sûr que cette MFC me sera très utile dans le futur, sur d'autres cas; je là note précieusement...
J'en profite pour re remercier Robert également !

Bonne journée à tous !
 

job75

XLDnaute Barbatruc
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Bonjour Kiriko, salut CISCO, Robert,

Une MFC sur la plage A2:K152 fonctionne très bien avec cette formule en ligne 2 :

Code:
=NON(MOD(SOMMEPROD(N($C$1:$C1<>$C$2:$C2));2))
Du moins pour le fichier présenté.

Avec un grand nombre de lignes ce sera sans doute laborieux... Edit : testé avec 1500 lignes, c'est encore correct...

Fichier joint.

A+
 

Pièces jointes

  • Alternance couleur remplissage sur changement valeur colonne C(1).xls
    64.5 KB · Affichages: 377
Dernière édition:

Kiriko

XLDnaute Occasionnel
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Bonjour job75, merci beaucoup !!
Effectivement, cela fonctionne parfaitement !!
Je vais fouiller pour voir s'il est possible d'appliquer une MFC à un tableau défini, quelle que soit la "longueur" de ce tableau, ou bien si je dois impérativement là baser sur le nombre maximum de lignes "potentiel)..

EDIT : En fait, c'est plus que parfait, la MFC s'adapte déjà à la taille du tableau...

Merci encore, job75, ainsi que Robert, et CISCO !!
A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Re,

Notez en passant qu'on peut remplacer SOMMEPROD par SOMME.

Les formules d'une MFC (ou d'un nom défini) se "matricialisent" quand c'est nécessaire.

Edit : vous avez indiqué que le fichier peut atteindre 2500 lignes.

Avec le fichier (2) joint (3000 lignes) il n'y a pas de problème.

Sur Win XP/Excel 2003 le défilement prend un peu de temps (pour la mise à jour de l'écran).

Sur Win 7/Excel 2010 le défilement se fait rapidement .

A+
 

Pièces jointes

  • Alternance couleur remplissage sur changement valeur colonne C(2).zip
    160.2 KB · Affichages: 106
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Bonjour

Concernant ta question sur les tableaux
1) oui bien sur tu peux adapter la mefc sur un tableau entier. Tu sélectionnes la colonne (ou le tableau) comme tu le fais pour une simple plage de cellules au moment d'entrer ta formule.
2) pour ce qui est du VBA, je n'ai pas regardé en détail le code de Roger mais oui bien sur aussi tu peux utiliser les tableaux =les listes en 2003) dans ton code. J'ai fait une page à ce sujet ici
Ce lien n'existe plus
 

CISCO

XLDnaute Barbatruc
Re : Alternance couleur de remplissage sur changement valeur en colonne C

Bonjour à tous

Bien vue, Job75, comme d'habitude, le test C$1:C1<>C$2:C2, pour mettre en évidence les changements de date.

Pour ce qui est du MOD ( ;2), on peut aussi faire avec EST.PAIR ou avec EST.IMPAIR, en fonction du besoin.

@ plus
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 393
Messages
2 088 009
Membres
103 699
dernier inscrit
samSam31