Microsoft 365 MACRO VBA Comptabiliser les cellules non colorisées d'une plage définie

chris6999

XLDnaute Impliqué
Bonsoir le FORUM
Une bonne année à tous

Je suis face à un petit problème avec un code qui a pour but de calculer le nombre de cellules non colorisées (Interior.ColorIndex = -4142) d'une plage définie.
Ce nombre s'incrémente colonne C.

Si sur certaines lignes le nb remonté est correct sur d'autre en revanche cela ne correspond pas à la réalité.!!
Pour pouvoir faire des tests j'ai mis la valeur 1 dans les cellules non colorisées mais dans mon fichier réel les cellules sont vides.
Cela me permet de comparer col A le nb correct et de le comparer à ce que le code calcule colonne C.

Peut-être un œil avisé aura une idée du pourquoi des ces différences de valeur?
Si c'est le cas je prendrais vos conseils avec beaucoup d'intérêt.

Mon code ci-après + fichier test en PJ


Dercol = Cells(2, Cells.Columns.Count).End(xlToLeft).Column
derlig = Range("A" & Rows.Count).End(xlUp).Row
' i plage de la ligne 2 à 30
For i = 1 To derlig
nb = 0
'j plage de la colonne 4 à 65 (D à BM)
For j = 4 To Dercol
'comptabilise 0,5 pour chaque ligne de la plage si cellule sans couleur

If Cells(i, j).Interior.ColorIndex = -4142 Then nb = nb + 1
Next j
'Si dans la ligne valeur de la ligne 1 est non vide alors met le nombre trouvé dans la colonne 3 soit C
If Cells(i, 1) <> "" Then Cells(i, 3) = nb
Next i


Merci par avance de votre
Très bonne soirée à tous
 

Pièces jointes

  • FICHIER TEST COULEUR DE CELLULE.xlsm
    28.7 KB · Affichages: 10

Dudu2

XLDnaute Barbatruc
Bonjour,
Tu as de cellules en fond blanc, par exemple en AJ7.

Voici la différence de propriétés de format entre fond blanc (à gauche) et pas de fond (à droite).

Différence.jpg


Edit: et pour les repérer...
Remplace:
VB:
        If Cells(i, j).Interior.ColorIndex = -4142 Then nb = nb + 1
Par: (ici pour tracker la ligne 7)
VB:
        If Cells(i, j).Interior.ColorIndex = -4142 Then
            nb = nb + 1
        Else
            If i = 7 Then
                ActiveSheet.Cells(i, j).Select
                MsgBox "Ligne = " & i & ", Colonne = " & j & ", ColorIndex = " & Cells(i, j).Interior.ColorIndex
            End If
        End If
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Chris,
Tout simplement certaines de vos cellules ne sont pas avec "aucun remplissage"
Ci dessous en rouge après avoir patiemment repris tous les fond des cellules blanches avec aucun remplissage, tout devient correct.
1.jpg

C'est ballot ! :)

Je pense qu'il serait judicieux de mettre une légère couleur au lieu de transparent, car transparent et blanc c'est visuellement quasi la même chose.
 

Pièces jointes

  • FICHIER TEST COULEUR DE CELLULE.xlsm
    25.7 KB · Affichages: 7

chris6999

XLDnaute Impliqué
Bonsoir le FORUM
Une bonne année à tous

Je suis face à un petit problème avec un code qui a pour but de calculer le nombre de cellules non colorisées (Interior.ColorIndex = -4142) d'une plage définie.
Ce nombre s'incrémente colonne C.

Si sur certaines lignes le nb remonté est correct sur d'autre en revanche cela ne correspond pas à la réalité.!!
Pour pouvoir faire des tests j'ai mis la valeur 1 dans les cellules non colorisées mais dans mon fichier réel les cellules sont vides.
Cela me permet de comparer col A le nb correct et de le comparer à ce que le code calcule colonne C.

Peut-être un œil avisé aura une idée du pourquoi des ces différences de valeur?
Si c'est le cas je prendrais vos conseils avec beaucoup d'intérêt.

Mon code ci-après + fichier test en PJ


Dercol = Cells(2, Cells.Columns.Count).End(xlToLeft).Column
derlig = Range("A" & Rows.Count).End(xlUp).Row
' i plage de la ligne 2 à 30
For i = 1 To derlig
nb = 0
'j plage de la colonne 4 à 65 (D à BM)
For j = 4 To Dercol
'comptabilise 0,5 pour chaque ligne de la plage si cellule sans couleur

If Cells(i, j).Interior.ColorIndex = -4142 Then nb = nb + 1
Next j
'Si dans la ligne valeur de la ligne 1 est non vide alors met le nombre trouvé dans la colonne 3 soit C
If Cells(i, 1) <> "" Then Cells(i, 3) = nb
Next i


Merci par avance de votre
Très bonne soirée à tous
Bonjour,
Tu as de cellules en fond blanc, par exemple en AJ7.

Voici la différence de propriétés de format entre fond blanc (à gauche) et pas de fond (à droite).

Regarde la pièce jointe 1051641

Edit: et pour les repérer...
Remplace:
VB:
        If Cells(i, j).Interior.ColorIndex = -4142 Then nb = nb + 1
Par: (ici pour tracker la ligne 7)
VB:
        If Cells(i, j).Interior.ColorIndex = -4142 Then
            nb = nb + 1
        Else
            If i = 7 Then
                ActiveSheet.Cells(i, j).Select
                MsgBox "Ligne = " & i & ", Colonne = " & j & ", ColorIndex = " & Cells(i, j).Interior.ColorIndex
            End If
        End If



Merci Jacky pour cette analyse très précise et pour le temps passé sur ma question.
C'est vrai que c'est tellement évident que j'aurais pu y penser toute seule..
Avec cette donnée je commence à entrevoir ma solution en transformant les blanc en transparent puis en dénombrant mes transparents ensuite.

Merci encore
Très bonne journée
 

chris6999

XLDnaute Impliqué
Bonsoir Chris,
Tout simplement certaines de vos cellules ne sont pas avec "aucun remplissage"
Ci dessous en rouge après avoir patiemment repris tous les fond des cellules blanches avec aucun remplissage, tout devient correct.
Regarde la pièce jointe 1051643
C'est ballot ! :)

Je pense qu'il serait judicieux de mettre une légère couleur au lieu de transparent, car transparent et blanc c'est visuellement quasi la même chose.


Bonjour

Merci encore Sylvanu je vois où se situe le problème et du coup comment le contourner.
Je n'ai pas la main sur les couleurs du tableau que j'exploite en l'état.
mais la solution est là
Merci encore
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Apparament le blanc n'est pas une couleur utilisée dans votre tableau.
Dans ce cas faites un test "si fond transparent ou blanc".
Un truc dans ce genre :
VB:
'Comptabilise 0,5 pour chaque ligne de la plage si cellule sans couleur   
        If (Cells(i, j).Interior.ColorIndex = -4142) _
        Or (Cells(i, j).Interior.Color = RGB(255, 255, 255)) _
        Then nb = nb + 1
 

Aurelien25

XLDnaute Nouveau
Bonjour à tous,
Je suis dans une impasse. J'ai presque la solution à ce que je cherche ici, mais pas tout à fait.

Je cherchais également à compter les cellules non colorisées (donc -4142) d'une plage de données.
Sur cette plage de données, les couleurs de la case sont données par une mise en forme conditionnelle (si > à une date, alors, si > à une autre date, alors, etc).

J'ai commencé ma fonction par relever la couleur d'une cellule pour faire des tests avant d'utiliser
Mais ce code me donne la valeur -4142 à chaque fois.

VB:
Function Testcouleur(Cellule As Range) As Integer
    Application.Volatile
    Testcouleur = Cellule.Interior.ColorIndex
End Function

De l'aide ?
 

Dudu2

XLDnaute Barbatruc
-4142 c'est xlNone qu'on doit pouvoir considérer comme blanc
Tu n'utilises pas Interior.Color ?

Pour tester si une cellule est colorée, j'utilise le Interior.Pattern.
Si xlNone pas colorée
Si 1 (ou plutôt pas xlNone) colorée.

Edit:
Une cellule non colorée: Cellule.Interior.Color = 16777215 & Cellule.Interior.Pattern = xlNone
Une cellule colorée en blanc: Cellule.Interior.Color = 16777215 & Cellule.Interior.Pattern = 1 (ou plutôt pas xlNone car la valeur dépend de la Pattern utilisée).

Pour savoir la couleur d'une cellule potentiellement colorée par MFC if faut s'intéresser non pas à Cellule mais à Cellule.DisplayFormat qui couvre les 2 cas MFC et non-MFC.
VB:
Sub a()
    MsgBox ActiveCell.DisplayFormat.Interior.ColorIndex & vbCrLf & _
           ActiveCell.DisplayFormat.Interior.Color & vbCrLf & _
           ActiveCell.DisplayFormat.Interior.Pattern
End Sub
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Aurélien, Dudu,
Cellule.Interior.ColorIndex donne la couleur de la cellule mais pas la couleur donnée par la MFC.
Pour détecter une couleur mise par MFC, regardez ceci :
ou encore par formule, come ici :
ou encore :
 

Aurelien25

XLDnaute Nouveau
Bon, je suis vraiment une bille en VBA.
Je vous explique mon besoin.
J'ai des noms sur une colonne et des dates de validité d'habilitation dans les colonnes suivantes pour des procédés de fabrication.
Un exemple en PJ (en xlsx sans macro pour éviter de mettre des macros comme ça sur le web).
La MFC est la suivante : si vide, alors fond transparent, texte normal, noir.
Si date à 2 mois : fond orange, texte gras.
Si date dépassée : fond rouge, texte gras, blanc.

Dans le cas réel, j'ai 50 opérateurs et 90 procédés.
D'où mon besoin : je souhaiterais que la colonne de prénom s'affiche en fond rouge si une des MFC est différente de fond transparent.

J'y arrive en prenant les fonctions citées par @sylvanu sur la première colonne.
Avec la fonction suivante, je récupère le code couleur et je le mets dans la colonne précédent les prénoms

Ensuite, petite MFC des familles (si différent de 16777215, alors...)
VB:
Private Function COULEUR(cellule As range)

    'Fonction COULEUR : Sébastien Mathier - Excel-Pratique.com
    'Source : https://www.excel-pratique.com/fr/astuces_vba/fonction-couleur-mfc
    
    Application.Volatile
    
    COULEUR = Evaluate("couleurCellule('" & cellule.Worksheet.Name & "'!" & cellule.Address & ")")
    
End Function

Private Function couleurCellule(cellule As range)

    couleurCellule = cellule.DisplayFormat.Interior.color
    
End Function
Mais je suis paumé quand il s'agit ensuite d'itérer le test sur l'ensemble des colonnes.

De l'aide ?
 

Pièces jointes

  • Qualification.xlsx
    10.2 KB · Affichages: 2

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Aurélien,
Je pense qu'on peut résoudre votre souci sans VBA, juste avec une MFC en colonne D :
=OU(MIN($E5:$G5)<=$F$1;MIN($E5:$G5<=$F$2))
car si une des cellule de la ligne considérée est inférieure à F1 OU inférieure à F2 alors elle est rouge.
 

Pièces jointes

  • Qualification.xlsx
    9.7 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
315 108
Messages
2 116 280
Membres
112 712
dernier inscrit
sarah.arnold.edc@hotmail.