Couleur une ligne sur 2 mais avec autre condition

Bonjour

Dans mon fichier, j'ai la macro suivante afin de masquer les lignes vide (car beaucoup de données pour l'impression)

Sub masquer_ligne_vide()

Dim cel As Range

For Each cel In Range("w9:w10981")

If cel = "0" Then

cel.EntireRow.Hidden = True

End If

Next

End Sub

Elle fonctionne très bien, par contre après avoir lancé ma macro pour masqué les lignes vide je dois mettre une ligne sur 2 en couleur (celle qui reste affiché seulement). Ceci je le fais manuellement car je ne sais pas comment le faire autrement Quelqu'un pourrais m'aider svp

Bonsoir Chantal25506

Voici ton code modifié pour ce que tu demandes

Sub masquer_ligne_vide()
  Dim Cel As Range, Flg As Boolean
  ' Colorier la 1ère ligne en mettant le flag à vrai
  Flg = True
  ' Pour chaque cellule de la plage
  For Each Cel In Range("W9:W10981")
    If Cel = 0 Then
      Cel.EntireRow.Hidden = True
    Else
      ' Si le flag est vrai
      If Flg Then
        ' Mettre en couleur
        Cel.EntireRow.Interior.ColorIndex = 43
      Else
        Cel.EntireRow.Interior.ColorIndex = xlNone
      End If
      ' Mettre le flag à l'inverse de sons état précédent
      Flg = Not Flg
    End If
  Next
End Sub

A+

Bonsoir,

une orientation de réponse

Option Explicit

Sub LouReeD()
    Dim i As Long, Inter As Boolean
    For i = 9 To 10981
        If Cells(i, 1).EntireRow.Hidden <> True Then
            If Inter = True Then
                Range(Cells(i, 1), Cells(i, 23)).Interior.Color = RGB(255, 0, 0)
            Else
                Range(Cells(i, 1), Cells(i, 23)).Interior.Color = RGB(0, 255, 0)
            End If
            Inter = Not Inter
        End If
    Next i
End Sub

Attention, je n'ai pas testé le code !

L'idée : une variable "Inter" qui permet de savoir quelle couleur il faut appliquer à la ligne.

Une boucle sur l'ensemble des lignes.

Un test sur chaque ligne pour savoir si elle est visible ou pas.

Si visible alors on met la couleur en fonction de l'Inter.

Une fois fait on bascule Inter sur la position opposée.

Sans avoir regardé votre code, autant vous pouvez intégrer plus ou moins celui-ci au votre vu que vous faites un test pour masquer, cela veut dire que vous ne masquer pas si le test est faux, donc vous mettez une couleur de fond et changez l'état d'Inter afin que la prochaine ligne soit d'une couleur différente...

Je vous laisse le soin d'adapter.

@ bientôt

LouReeD

Flute !

Pas assez rapide !

Bonsoir BrunoM45 !

@ bientôt

LouReeD

Bonsoir Chantal, le forum,

je te propose ce code VBA (à adapter) :

Option Explicit

Sub Essai()
  Dim lig&, k As Byte, cx&
  For lig = 9 To 10981
    If Cells(lig, 23) = 0 Then
      Rows(lig).Hidden = -1
    Else
      k = 1 - k: If k = 0 Then cx = 3 Else cx = -4142
      Cells(lig, 1).Resize(, 23).Interior.ColorIndex = cx
    End If
  Next lig
End Sub

* cx = 3 : c'est pour un fond rouge ; tu peux le modifier pour une autre couleur de la palette

* cx = -4142 : c'est pour « aucune couleur » : à laisser tel quel

* Cells(lig, 1) : à partir de la colonne A ; si par exemple à partir de la colonne E : Cells(lig, 5)

* .Resize(, 23) : à partir de la colonne A, 23 colonnes ➯ colonnes A à W ; si par exemple tu veux de A à Z :

Cells(lig, 1).Resize(, 26).Interior.ColorIndex = cx

* je n'ai pas utilisé .EntireRow pour éviter de colorier toute la ligne, de la colonne A à la colonne XFD

(n'est-ce pas, Bruno ? bien sûr, c'est selon les goûts de chacun...)

* pour une couleur de fond hors de la palette, tu dois utiliser .Color au lieu de .ColorIndex

(tu en as un exemple dans le code VBA de LouReeD)

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Bonjour,

Une autre proposition, plus rapide à l'exécution (à vérifier tout de même sur 11.000 lignes)

ALT F8, exécuter la procédure.

Cdlt.

5chantal25506.xlsm (21.47 Ko)
Public Sub HideAndColorRows()
Dim ws As Worksheet
Dim lCol As Long, N As Long, i As Long, k As Long
Dim Rng As Range, Cell As Range
    Set ws = ActiveSheet
    lCol = 23   'Colonne W
    N = ws.Cells(Rows.Count, lCol).End(xlUp).Row
    For i = 9 To N
        If ws.Cells(i, lCol).Value = 0 Then
            If Rng Is Nothing Then
                Set Rng = ws.Cells(i, lCol)
            Else
                Set Rng = Union(Rng, ws.Cells(i, lCol))
            End If
        End If
    Next i
    Rng.EntireRow.Hidden = True
    Set Rng = ws.Cells(9, lCol).Resize(N - 9).SpecialCells(xlCellTypeVisible)
    For Each Cell In Rng
        k = k + 1
        Cell.EntireRow.Interior.Color = IIf(Application.IsOdd(k), 14277081, xlNone)
    Next Cell
End Sub

Bonsoir,

de mon coté je me suis limité à la taille de la ligne allant de la colonne 1 (A) à 23 (W), d'où le range avec une cellule de départ et une cellule d'arrivée... Car mettre en couleur une ligne entière sur plus de 16000 colonne à quoi bon

@ bientôt

LouReeD

@LouReeD

tu a écrit :

Car mettre en couleur une ligne entière sur plus de 16000 colonnes à quoi bon ?

j'pense pareil que toi !

note que Range(Cells(i, 1), Cells(i, 23)) équivaut à : Cells(i, 1).Resize(, 23)

dhany

Bonjour

J'ai essayé ton code BrunoM45 et tout fonctionne à merveille. Merci beaucoup

Bonsoir,

@dhany (à priori c'est comme ça qu'on le note pour adresser un message à une personne particulière... Je dois dire que j'ai mis du temps à comprendre... Mais je fais peut-être fausse route ? le @ veut dire Adresser tout comme il est utilisé pour les adresse mail ?)

C'est ce genre d'écriture que je ne maitrise pas (si je puis dire que je maitrise ne serait-ce qu'une chose) :

Cells(i, 1).Resize(, 23)

Ca rentrera peut-être un jour...

@ bientôt

LouReeD

@LouReeD (lire : à LouReeD)

en fait, Cells(i, 1).Resize(, 23) signifie : Cells(i, 1) redimensionné avec même nombre de lignes et sur 23 colonnes.


il est super, ton nouvel avatar ! mais t'as oublié d'mettre à jour ta signature : les 2 premières lignes sont restées pareil alors que la coupe du monde est passée depuis longtemps, et que t'as fini de déménager !

dhany

Bonjour,

@ LouReeD,

Un petit fichier pour tenter d'appréhender Range.Resize.

Cdlt.

5loureed.xlsm (25.83 Ko)

@Jean-Eric

sympa ton fichier ! juste une petite remarque : ça sera plus facile pour LouReeD de suivre tes exemples en affichant le quadrillage (masqué à l'ouverture du fichier) ; c'est plus facile aussi en lisant de droite à gauche les valeurs définies pour lCol et lRow car utilisées ensuite de gauche à droite ; exemple : lCol = 3: lRow = 4 puis .Resize(lRow, lCol).Resize(4, 3)

dhany

Bonsoir,

merci pour ces délicates attentions !

j'appréhende mieux le "resize".

@ bientôt

LouReeD

Rechercher des sujets similaires à "couleur ligne condition"