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 :

Somme horizontale puis verticale en fonction de la couleur de fond des cellules. [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 214
    Points : 522
    Points
    522
    Par défaut Somme horizontale puis verticale en fonction de la couleur de fond des cellules.
    Bonjour,
    Je dispose d'une BdD dans laquelle je suis des dates par individus.

    Colonne A : Noms des individus
    Colonne B à colonne G: des Dates

    Toutes ces dates ont des MFC, en fonction de certains critères.
    Dès que les dates dépassent le critére alors le fond des cellules concerné se colorie en ROUGE.

    Je voudrais que la cellule H2 se colorie en ROUGE si au moins une des cellules des colonnes B2:G2 est ROUGE.

    Idem jusqu'en H10

    Puis en Cellule H11, il faudrait qu'excel fasse la somme des cellules ROUGE de H2 à H10

    Cordialement,
    Graphikris.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Ce qui est plus simple que de chercher les couleurs conditionnelles, c'est d'utiliser la valeurs ou les formules gérant la MFC pour faire tes sommes.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 199
    Points : 319
    Points
    319
    Par défaut
    Bonjour ,

    Un truc du genre

    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
     
    Sub maj_couleur_cellule()
     
    Dim cpt_l As Integer, cpt_c As Integer
    Dim nb_cellule_rouge As Integer
     
    nb_cellule_rouge = 0
     
    Sheets("Feuil1").Activate
     
    For cpt_l = 2 To Range("a" & Rows.Count).End(xlUp).Row
        For cpt_c = 2 To 7
            If ActiveSheet.Cells(cpt_l, cpt_c).Interior.ColorIndex = 3 Then
                'Dès que les dates dépassent le critére alors le fond des cellules concerné se colorie en ROUGE.
                ActiveSheet.Cells(cpt_l, 8).Interior.ColorIndex = 3
                nb_cellule_rouge = nb_cellule_rouge + 1
                Exit For
            End If
        Next cpt_c
     
    Next cpt_l
     
    'Puis en Cellule H11, il faudrait qu'excel fasse la somme des cellules ROUGE de H2 à H10
    ActiveSheet.Cells(11, 8) = nb_cellule_rouge
     
    End Sub
    Cordialement

  4. #4
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 214
    Points : 522
    Points
    522
    Par défaut
    Bonjour et merci,

    çà marche bien mais un petit souci. Lorsqu'une ligne ne possèdent plus aucune date dépassée (ex : L 05) alors en H05, la cellule reste rouge, elle ne passe pas au (sans fond coloré) . Par contre le calcul final est correct.

    Cordialement
    Graphikris.

  5. #5
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 214
    Points : 522
    Points
    522
    Par défaut
    Bonjour,

    Ci-joint un nouveau classeur avec des vraies dates et des MFC réélles,
    ATTENTION / En fonction des modules, la validité est différente.

    Et sinon une nouveauté par rapport au post initial, il y a désormais des cellules bleues.

    L'explication est mise sur le classeur joint en Q2 feuil1

    Cordialement
    Graphikris.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Essaie :

    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
    38
    39
    40
    41
    Sub test()
    'Set Var = ActiveCell.FormatConditions
    Dim C As Range, Ctr As Byte, Jours As Integer, tot As Integer
    With Sheets("Feuil1")
        For Each C In .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp)).Offset(, 14)
            Ctr = 0
            For i = 2 To 13
                For x = 1 To .Cells(C.Row, i).FormatConditions.Count
                    Set Var = .Cells(C.Row, i).FormatConditions
                    Var = .Cells(C.Row, i).FormatConditions(x).Formula1
                    If Left(Var, 8) = "=ESTVIDE" Then
                        If .Cells(C.Row, i) = "" Then
                            Ctr = Ctr + 1
                            Exit For
                        End If
                    End If
                    If InStr(1, Var, "INAPTE") > 0 Then
                        If .Cells(C.Row, i) = "INAPTE" Then
                            Ctr = Ctr + 1
                            Exit For
                        End If
                    End If
                    If InStr(1, Var, "AUJOURDHUI") > 0 Then
                        Jours = CInt(Split(Var, "-")(1))
                        If .Cells(C.Row, i) < Date - Jours Then
                            Ctr = Ctr + 1
                            Exit For
                        End If
                    End If
                Next x
            Next i
            If Ctr = 12 Then
                C.Interior.ColorIndex = 3
                tot = tot + 1
            Else
                C.Interior.ColorIndex = xlNone
            End If
        Next C
        .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 15) = tot
    End With
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  7. #7
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 214
    Points : 522
    Points
    522
    Par défaut
    Bonjour Daniel,

    Je viens de tester ton code mais il ne fonctionne que pour les lignes remplies entièrement de rouge ( L26, 60, 62, 105 et 118).
    Ca me donne un total de 5 Rouge en O121 Feuil1 mais rien en Feuil2 A2.
    Je suis désolé ou peut etre un peu trop exigeant mais çà ne repond qu'à une partie de ma demande.

    Sinon encore merci pour tout ce que tout fait sur ce forum.
    En attendant une réponse, voir un code.

    Merci,
    Graphikris.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Sub test()
     
    Dim C As Range, CtrRouge As Byte, CtrBleu As Byte, Jours As Integer, TotRouge As Integer, TotBleu As Integer
    With Sheets("Feuil1")
        For Each C In .Range(.[a2], .Cells(.Rows.Count, 1).End(xlUp)).Offset(, 14)
            CtrRouge = 0
            CtrBleu = 0
            For i = 2 To 14
                For x = 1 To .Cells(C.Row, i).FormatConditions.Count
                    Set Var = .Cells(C.Row, i).FormatConditions
                    Var = .Cells(C.Row, i).FormatConditions(x).Formula1
                    If Left(Var, 8) = "=ESTVIDE" Then
                        If .Cells(C.Row, i) = "" Then
                            CtrRouge = CtrRouge + 1
                            Exit For
                        End If
                    End If
                    If InStr(1, Var, "INAPTE") > 0 Then
                        If .Cells(C.Row, i) = "INAPTE" Then
                            CtrBleu = CtrBleu + 1
                            Exit For
                        End If
                    End If
                    If InStr(1, Var, "AUJOURDHUI") > 0 Then
                        Jours = CInt(Split(Var, "-")(1))
                        If .Cells(C.Row, i) < Date - Jours Then
                            CtrRouge = CtrRouge + 1
                            Exit For
                        End If
                    End If
                Next x
            Next i
            If CtrRouge + CtrBleu > 0 Then
                C.Interior.ColorIndex = 3
                TotRouge = TotRouge + 1
            ElseIf CtrBleu = 13 Then
                C.Interior.ColorIndex = 25
                TotBleu = TotBleu + 1
            Else
                C.Interior.ColorIndex = -4142
            End If
        Next C
        [Feuil2!A2] = TotRouge
        [Feuil2!B2] = TotBleu
    End With
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  9. #9
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 214
    Points : 522
    Points
    522
    Par défaut
    Re,

    Nickel mais je viens de réaliser que j'ai fais une erreur car pour les modules permanents (1 et 8) en colonne B et I, soit il y a une date soit c'est vide (si vide alors fond rouge).
    Pour les personnes INAPTE sur tous les autres modules mais pour lesquelles il y a soit une date soit du vide pour les modules 1 et 8, alors en colonne O, le fond doit etre bleu.

    Je suis totalement désolé, tu t'ai consacré à me faire un code et moi, je me suis trompé dans mes explications.

    Pourrais tu me modifier le code ?

    Encore Merci Daniel

    Cordialement,
    Graphikris.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    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
    38
    39
    40
    41
    42
    43
    44
    45
    Sub test()
    Dim C As Range, CtrRouge As Byte, CtrBleu As Byte, Jours As Integer, TotRouge As Integer, TotBleu As Integer
    With Sheets("Feuil1")
        For Each C In .Range(.[a2], .Cells(.Rows.Count, 1).End(xlUp)).Offset(, 14)
            CtrRouge = 0
            CtrBleu = 0
            For i = 2 To 14
                For x = 1 To .Cells(C.Row, i).FormatConditions.Count
                    Set Var = .Cells(C.Row, i).FormatConditions
                    Var = .Cells(C.Row, i).FormatConditions(x).Formula1
                    If Left(Var, 8) = "=ESTVIDE" Then
                        If .Cells(C.Row, i) = "" Then
                            CtrRouge = CtrRouge + 1
                            Exit For
                        End If
                    End If
                    If InStr(1, Var, "INAPTE") > 0 Then
                        If .Cells(C.Row, i) = "INAPTE" Then
                            CtrBleu = CtrBleu + 1
                            Exit For
                        End If
                    End If
                    If InStr(1, Var, "AUJOURDHUI") > 0 Then
                        Jours = CInt(Split(Var, "-")(1))
                        If .Cells(C.Row, i) < Date - Jours Then
                            CtrRouge = CtrRouge + 1
                            Exit For
                        End If
                    End If
                Next x
            Next i
            If CtrBleu = 11 Then
                C.Interior.ColorIndex = 25
                TotBleu = TotBleu + 1
            ElseIf CtrRouge + CtrBleu > 0 Then
                C.Interior.ColorIndex = 3
                TotRouge = TotRouge + 1
            Else
                C.Interior.ColorIndex = -4142
            End If
        Next C
        [Feuil2!A2] = TotRouge
        [Feuil2!B2] = TotBleu
    End With
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  11. #11
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 214
    Points : 522
    Points
    522
    Par défaut
    Merci Daniel,

    Il ne me reste plus qu'à l'adapter à ma vraie base de données.
    Une question car en réalité mes modules vont de AF à AR et les identités sont en A. Car le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each C In .Range(.[a2], .Cells(.Rows.Count, 1).End(xlUp)).Offset(, 14)
    me pose un souci de compréhension puisque tu mets :
    pourquoi [a2] ? car les identités n'ont pas d'intérets dans cette macro.

    Où devrais je modifier le code ?

    Cordialement,
    Graphikris.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    pourquoi [a2] ? car les identités n'ont pas d'intérets dans cette macro.
    L'intérêt de la colonne A est qu'elle ne comporte pas de cellule vide et que de cette façon je suis sûr de récupérer la plage A2:A120 alors que, si j'avais pris une autre colonne, je n'étais pas sûr que la dernière cellule remplie soit sur la ligne 120.
    Quelles seront les colonnes des modules permanents ?
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  13. #13
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 214
    Points : 522
    Points
    522
    Par défaut
    Bonjour Daniel,

    Les modules permanents se trouvent en Col B et I dans mon exemple maist en réalité ils sont en col AF et AM.
    Dans mon vrai tableau les noms sont en col A et les modules vont de AF à AR.
    De la col B à AE, j'ai d'autres données.

    Cordialement, et bon Dimanche
    Graphikris.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Vérifie la macro :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Sub testReel()
    Dim C As Range, CtrRouge As Byte, CtrBleu As Byte, Jours As Integer, TotRouge As Integer, TotBleu As Integer
    '--------------------- vérifier le nom de la feuille -----------------------------------------------------
    With Sheets("Feuil1")
        For Each C In .Range(.[a2], .Cells(.Rows.Count, 1).End(xlUp)).Offset(, 14)
            CtrRouge = 0
            CtrBleu = 0
            For i = 32 To 44
                For x = 1 To .Cells(C.Row, i).FormatConditions.Count
                    Set Var = .Cells(C.Row, i).FormatConditions
                    Var = .Cells(C.Row, i).FormatConditions(x).Formula1
                    If Left(Var, 8) = "=ESTVIDE" Then
                        If .Cells(C.Row, i) = "" Then
                            CtrRouge = CtrRouge + 1
                            Exit For
                        End If
                    End If
                    If InStr(1, Var, "INAPTE") > 0 Then
                        If .Cells(C.Row, i) = "INAPTE" Then
                            CtrBleu = CtrBleu + 1
                            Exit For
                        End If
                    End If
                    If InStr(1, Var, "AUJOURDHUI") > 0 Then
                        Jours = CInt(Split(Var, "-")(1))
                        If .Cells(C.Row, i) < Date - Jours Then
                            CtrRouge = CtrRouge + 1
                            Exit For
                        End If
                    End If
                Next x
            Next i
            If CtrBleu = 11 Then
                C.Interior.ColorIndex = 25
                TotBleu = TotBleu + 1
            ElseIf CtrRouge + CtrBleu > 0 Then
                C.Interior.ColorIndex = 3
                TotRouge = TotRouge + 1
            Else
                C.Interior.ColorIndex = -4142
            End If
        Next C
        [Feuil2!A2] = TotRouge
        [Feuil2!B2] = TotBleu
    End With
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  15. #15
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 214
    Points : 522
    Points
    522
    Par défaut
    Merci Daniel, la macro fonctionne correctement mais par rapport à ma vrai BdD, il serait judiciable que que la couleur des cellules se mettent en Rouge ou Bleu ou Blanc en Colonne P au lieu de la colonne O.

    Cordialement et merci pour tout le tps que tu me consacres.

    Graphikris.

  16. #16
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonjour,

    Utilise offset pour décaler d'un cran à gauche l'application de tes couleurs

  17. #17
    Membre confirmé Avatar de graphikris
    Homme Profil pro
    Pas tres doué
    Inscrit en
    Décembre 2012
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pas tres doué
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 214
    Points : 522
    Points
    522
    Par défaut
    Ok merci Bbil, je ne savait pas à quoi servait le Offset et maintenant je le sais.
    Un grand Merci à vous tous.

    Bon W.E
    Graphikris

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

Discussions similaires

  1. [XL-2007] Formule conditionnelle en fonction de la couleur de fond
    Par Menhir dans le forum Excel
    Réponses: 9
    Dernier message: 19/05/2014, 17h14
  2. [XL-2003] impression couleur d'une cellule en fonction de la couleur d'une autre cellule
    Par facteur dans le forum Macros et VBA Excel
    Réponses: 47
    Dernier message: 21/09/2012, 17h18
  3. [V6] Somme horizontale/verticale
    Par Anonymously dans le forum Deski
    Réponses: 2
    Dernier message: 04/05/2011, 15h12
  4. [XL-2003] Compter en fonction de la couleur de fond!
    Par vapordinateur dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/01/2011, 14h37
  5. Compter en fonction de la couleur de fond
    Par Nico123 dans le forum Excel
    Réponses: 2
    Dernier message: 12/07/2007, 14h52

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