Compteur couleurs VBA

Bonjour à tous,

Je suis novice en VBA et voilà maintenant une après-midi entière que je me retourne les méninges sur ce problème.

Contexte:

Un fichier excel de suivi de reception avec des dates limites pour différents documents.

Il y a un premier tableau avec les dates limites et un deuxième en parrallèle où, lorsque je reçois le document, j'y indique la date de reception.

Grâce à VBA, une fois la date de reception indiquée, la case se met en vert.

Lorsque la date est dépassée et que le document n'est pas rendu, je met en forme à la main la case en la mettant en rouge.

J'analyse le taux de reception des documents grâce à VBA et cette formule "=CouleurCellule($S$11:$AD$74;AG1)" en comptant le nombre de cases rouges (documents non rendus et échance passée) et les cases vertes (documents reçus à l'heure ou en retard).

Les documents reçus dans les délais sont calculés via cette formule "=SOMMEPROD((F11:Q203>=S11:AD203)*(F11:Q203>0)*(S11:AD203>0))"

Mes soucis:

- Le compteur ne compte pas correctement les cases rouges, il y a plus de cases rouges que la réalité.

Mon hypothèse: la mise en forme manuelle en rouge reste (comme un calque photoshop par exemple) sous la mise en forme VBA qui se déclenche une fois que j'ai inscrit la date.

Exemple:

Nous somme le 25/10/2019, Mr X devait rendre son dossier le 15/10/2019 donc case rouge. --> Au compteur une case rouge et 0 case verte.

3 jours plus tard le 28/10/2019, Mr X rend sont dossier, j'écrit donc dans la case "28/10/2019", la cellule passe en vert. --> Cependant au compteur une case rouge et une case verte...(ce n'est pas le cas pour toutes les cellules, de temps en ça marche et de temps en temps non...)

- J'aimerais aussi automatiser la mise en rouge des cellules dépassant la date d'aujourd'hui, je suis passé par une mise en forme conditionnelle mais même soucis pour le compteur, il ne les prend pas en compte...

Ci dessous le code VBA du module du fichier et le code VBA de chaque onglet:

Function CouleurCellule(Plage As Range, Cel As Range) As Long

    Dim Dico As Object
    Dim C As Range
    Dim Total As Long
    Dim Couleur As Long

    Couleur = Cel.Interior.Color

    Set Dico = CreateObject("Scripting.Dictionary")

    For Each C In Plage

        If C.Interior.Color = Couleur Then Dico(C.MergeArea.Address) = C.MergeArea.Address

    Next C

    CouleurCellule = Dico.Count

    Application.Volatile

End Function
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Me.Range("S11:AD150")) Is Nothing Then
        Target.Interior.ColorIndex = IIf(IsDate(Target), 4, xlColorIndexNone)
    End If
End Sub

Devrais-je passer uniquement par de la mise en forme conditionnelle "lorsque j'inscris une date, la cellule se met en vert" ? Ou bien le code VBA n'est pas correct ? Ou le compteur prend en compte la couleur "cachée" sous le vert ?

Je vous remercie par avance si vous avez une solution !

Bonsoir,

Joindre un fichier anonymiser pour nous faciliter la tâche

Merci

Slts

Pas une mauvaise idée, ça, un fichier anonymisé d'Anonyme76!

Salut Anonyme,

Salut Boss,

J'ai trouvé ceci sur le Net que je ne connaissais pas.

Pas encore testé, évidemment...

Pourrait aider, peut-être...

Sub test()
'
Dim Fc As FormatCondition
'
Set Fc = Worksheets("Feuil1").Range("B1").FormatConditions(1)
MsgBox "L'index couleur est : " & Fc.Interior.ColorIndex

End Sub

A+

Bonjour,

Avec une MFC, en VBA tu ne peux pas savoir si la cellule est colorée ou pas, il te faut utiliser la même formule que la MFC et dans ce cas, tu peux en déduire si elle est colorée ou pas !

Si tu colores en VBA et avec une MFC, il va y avoir confusion donc, if vaut mieux que ce soit, soit l'un soit l'autre mais comme te le demande boss_68 , postes un fichier anonymisé mais qui soit le plus représentatif de l'original

Bonjour à tous

J'ajoute aussi qu'avec des plages fusionnées comme le laisse penser la macro MergeArea, le résultat risque d'être aléatoire !

Sauf cas très exceptionnel, je ne traite pas les couleurs dans un code VBA, j'utilise en effet les MFC, et pour ce qui est du VBA je vais chercher les conditions de la MFC pour effectuer le traitement.

Une lecture utile https://forum.excel-pratique.com/viewtopic.php?f=2&t=13

Bonjour Anonyme76, Bonjour aux Contributeurs déclarés.

J'ai créé un petit fichier avec 2 feuilles qui présente deux méthodes de fonctionnement pour ton besoin.

Une méthode indirecte sur la feuille Color. La personne contrôle le dépassement de date. Et le fond de la cellule passe en rouge. Sinon si c'est dans les délais c'est fonds vert.

Une méthode directe sur la feuille Direct. Dès son ouverture l'évènement feuille vérifie les "hors-délais" et les passent en rouge. Pour passer au vert il faut une date de réception.

Il est aussi possible de changer la police en rouge pour le fonds rouge et ne garder ainsi qu'un rectangle rouge anonyme! Voir macros et modifier en conséquence.

Bons tests et bonne continuation.

143datecolor.xlsm (19.86 Ko)

Bonjour,

Avec une MFC, en VBA tu ne peux pas savoir si la cellule est colorée ou pas, il te faut utiliser la même formule que la MFC et dans ce cas, tu peux en déduire si elle est colorée ou pas !

Si tu colores en VBA et avec une MFC, il va y avoir confusion donc, if vaut mieux que ce soit, soit l'un soit l'autre mais comme te le demande boss_68 , postes un fichier anonymisé mais qui soit le plus représentatif de l'original

Bonjour à tous,

Merci beaucoup pour vos retours !

Ci-joint le fichier anonymisé

Vous pouvez voir dans celui-ci qu'excel me compte 31 cellule rouges au lieu de 25, ce qui fausse mon résultat de documents attendus et par conséquence mon pourcentage de réception et mon pourcentage de docs renduent dans les délais.

J'ai pensé à rajouter des lignes où, lorsqu'on insère une date, excel efface toute mise en forme précédente de la cellule pour la mettre en vert. Cependant après plusieurs test je n'ai pas reussi à l'adapter sur mon fichier ne comprenant pas le language VBA...

Merci Theze, en effet VBA et la MFC ne fonction pas tous les deux, c'est pour ça que je mets les documents non reçu ayant dépassé la date d'échance en rouge à la main... Il y a peut être une solution sous VBA ?

Merci infiniment pour votre aide !

Bonjour Anonyme76,

Si tu as téléchargé mon fichier, tu as la solution.

Si tu as besoin d'un ajout ou traitement différent postes le en retour.

Bonjour Anonyme76,

Si tu as téléchargé mon fichier, tu as la solution.

Si tu as besoin d'un ajout ou traitement différent postes le en retour.

Bonjour X Cellus,

J'ai en effet essayé de comprendre ton fichier et l'adapter au mien, cependant je n'ai pas bien compris ton raisonnement avec la date test 01/01/1900 et de plus:

- Lorsqu'une case est rouge, il ne la compte pas en hors delais alors qu'il le faut afin de calculer mon chiffre de fichiers attendus et le comparer à ceux reçus

- Lorsque le fichier est rendu en retard, la case passe bien en vert mais il est compté avec les "avant limites" alors qu'il est reçu mais devra compter dans les hors limites (mais en vert)

Si tu peux m'éclairer je suis preneur !

Merci !

Bonsoir Anonyme76,

Ci-joint après ton dernier message une modification (vert hors limite) réalisée sur la feuille Color. Ainsi que des explications supplémentaires.

Bons tests de celui-ci. Peut être te conviendra t'il mieux.

141datecolormodif.xlsm (21.07 Ko)

Bonsoir Anonyme76,

Ci-joint après ton dernier message une modification (vert hors limite) réalisée sur la feuille Color. Ainsi que des explications supplémentaires.

Bons tests de celui-ci. Peut être te conviendra t'il mieux.

DateColorModif.xlsm

Hello X Cellus,

Merci pour ton aide !

Ta solution complique un peu les choses et j'ai bien peur de ne pas m'y retrouver si je dois inscrire des dates partout (le fichier est très gros une trentaine d'onglet comme celui que j'ai déposé) ...

Les cases rouges sont bien toutes comptées en hors délais, c'est en faite quand je reçois le fichier et que grâce au vba la case passe en vert( en y inscrivant la date de reception) que mon compteur detecte toujours le rouge en dessous du vert !

N'y a t'il pas une solution pour nettoyer la cellule avant que VBA y dépose sa mise en forme ? J'ai lu que je pouvais utiliser "ClearCell" mais je ne sais absolument pas comment m'y prendre je ne connais pas du tout le language VBA...

Encore merci !

J'ai modifié uniquement la feuille Color. Celle qui est indirecte, c'est à dire que l'on inscrit la date test.

Par contre je n'ai pas modifié la feuille Direct, qui est elle inscrit directement la date test dès que la date ultime de réception est dépassé d'un jour. En fait cette deuxième feuille t'évite de contrôler chaque jour les dates dépassées. Elle le fait de manière événementielle dès son ouverture.

Donc la trentaine d'onglets devrait s'en inspirer. A chaque fois que tu travailles sur un d'eux la mise à jour se fait automatiquement.

Bonjour Anonyme76,

Ci -joint le fichier modifié avec la feuille Direct mise à jour sur le même principe tableau que celle Color.

Bons tests, bonne continuation.

Rechercher des sujets similaires à "compteur couleurs vba"