Somme des cellules Excel selon leur couleur de fond

Résolu
coCCajus Messages postés 58 Statut Membre -  
BenoitLX Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous et à toutes,

Dans une feuille Excel dont je me sers pour ma comptabilité personnelle je souhaite effectuer dans une cellule la somme des cellules jaunes dans une plage donnée de cellules

J'ai trouvé je ne sais plus où le code suivant que j'utilise:

'Calcul la somme des cellules d'une plage dont le fond est d'une couleur donnée
'exemple 6 = jaune

Function SommeSiCouleurFond(Plage As Range, NumeroDeCouleur%) As Long
Application.Volatile True
Dim wCell As Range
For Each wCell In Plage
If wCell.Interior.ColorIndex = NumeroDeCouleur Then
SommeSiCouleurFond = SommeSiCouleurFond + wCell.Value
End If
Next
End Function


cette macro fonctionne avec néanmoins deux défauts:
1) la somme est arrondie à l'entier, or je voudrais 2 décimales
2) la somme ne se recalcule pas si l'on change seulement la couleur du fond, il faut par exemple faire F9 pour provoquer un calcul de la feuille et j'aimerais modifier le code pour que ce recalcul soit automatique
Est-ce possible?

si oui je remercie par avance ceux qui prendront le temps et la peine de m'aider

10 réponses

  1. Heliotte Messages postés 1561 Statut Membre 92
     
    Bonsoir coCCajus,

    Pour qu'Excel recalcule automatiquement (à chaque changement) : Outils, Options .. Onglet Calul, calcul automatique
    1
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour

    juste au passage

    dans l'intitulé de ta fonction tu demandes un entier
    Function SommeSiCouleurFond(Plage As Range, NumeroDeCouleur%) As Long

    remplace par
    Function SommeSiCouleurFond(Plage As Range, NumeroDeCouleur%) As Double

    Cdbl(WCell.Value) est une bêtise tu peux garder Wcell.value
    1
  3. Heliotte Messages postés 1561 Statut Membre 92
     
    Bonsoir coCCajus,

    C'est ici qu'il faut changer :SommeSiCouleurFond = SommeSiCouleurFond + wCell.Value

    D'abord, la bonne pratique veut que l'on déclare les variables AVANT de les utiliser:
    - Dim SommeSiCouleurFond As Double .. ensuite ..
    - SommeSiCouleurFond = SommeSiCouleurFond + Cdbl(wCell.Value)
    - et pour finir, il faut formater la cellule qui reçoit le total sur 2 décimales

    C'est tout simple
    0
  4. coCCajus Messages postés 58 Statut Membre 18
     
    Bonjour et merci Helliote,

    je viens de modifier mon code selon votre proposition
    malheureusement une somme de 123.45 continue à s'afficher (et à être enregistrée) comme 123.00
    dans l'écriture des codes je manque de bases et je ne sais par exemple pas vraiment ce que signifie Cdbl(WCell.Value)par rapport à WCell.Value
    Je continue à chercher mais reste friand de toute suggestion
    Merci d'avance
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. coCCajus Messages postés 58 Statut Membre 18
     
    bonjour Michel
    Et merci, en effet cela marche comme cela et c'est super
    je m'attache maintenant au rafraichissement de la feuille
    j'envisage de créer un bouton qui d'abord affecterait la couleur choisie à la cellule (ou au groupe de cellules) sélectionnée(s) et qui ensuite déclencherait un calcul de la feuille
    si quelqu'un a une meilleure idée....
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Autre ânerie que je n'avais pas vu

      supprime cette déclaration
      Dim SommeSiCouleurFond As Double
      puisque SommeSiCouleurFond est le nom de la fonction ....

      On va peut-^tre feinter
      question à 1 euro
      quelles sont les conditions qui te font mettre des cellules en jaune ?
      0
  7. coCCajus Messages postés 58 Statut Membre 18
     
    j'avais déjà supprimé la chose redondante

    en fait il n'y a aucune autre condition que ma décision propre pour attribuer la couleur au fond de la cellule sélectionnée.

    je veux ainsi distinguer dans une liste de prix ceux qui seront affectés à un total, de ceux qui, non colorés, seront affectés à un autre total.

    cela en plus peut évoluer dans le temps, un montant initialement attribué à un total doit pouvoir être réaffecté à l'autre si je le décide

    en fait, je n'aurai pas réellement besoin de macro pour cela mais avec un bouton, je suis sûr de choisir la couleur sans erreur (jaune=6) et je cherche aussi un moyen de recalculer automatiquement la feuille après changement de couleur

    Cerise sur le gâteau, cela devrait me rendre moins ignare en VBA
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      avec un bouton, je suis sûr de choisir la couleur sans erreur (jaune=6)

      Tu peux expliquer ou montrer le code ce bouton

      Les macros événementielles ne réagissent pas à la mise en couleur d'une cellule et donc il faudra un bouton pour calculer les jaunes
      0
  8. coCCajus Messages postés 58 Statut Membre 18
     
    Je pense y être arrivé, en ne comprenant pas tout car j'ai enregistré la macro, mais cela à l'air de marcher

    Voila le code que j'ai associé au bouton créé:

    Sub Jaune()
    '
    ' Jaune Macro
    '
    With Selection.Interior
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
    .Color = 65535
    .TintAndShade = 0
    .PatternTintAndShade = 0
    End With
    ActiveSheet.Select
    Calculate
    End Sub


    Si je peux me permettre, j'aimerais que votre regard d'initié m'aide à rendre éventuellement ce code plus propre
    0
  9. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    avec une macro paramétrée qui pourra resservir pour boulot similaire ( toujours chercher à se constituer des bibliothèque de routine (macro paramétrée et/ou fonction)
    à adapter
    ton bouton appelle la macro "jaune"

    Sub jaune()   
    totaux_si_couleur "A1:B10", 6, "D2"     'plage de W, couleur, adresse du résultat   
    End Sub   
    '------------------   
    Sub totaux_si_couleur(plage, couleur, adr_out)   
    Dim cellule As Range, adr_depart   
    
    'Délimite le coloriage à la zone de travail   
    If Not Intersect(ActiveCell, Range(plage)) Then   
         'teinte la cellule   
         ActiveCell.Interior.ColorIndex = couleur   
         'recherche des cellules de la couleur utilisée   
         'et additionne leur valeur   
         With Range(plage) 'd'après aide en ligne MS Office  
              Set cellule = .Find("*", LookIn:=xlValues)   
              If Not cellule Is Nothing Then   
                   adr_depart = cellule.Address   
                   Do   
                        If cellule.Interior.ColorIndex = couleur Then Total = Total + cellule   
                        Set cellule = .FindNext(cellule)   
                   Loop While Not cellule Is Nothing And cellule.Address <> adr_depart   
              End If   
         End With
         Range(adr_out) = Total  
    End If   
    
    End Sub   
    


    pour apprendre VBA
    https://excel.developpez.com/cours/?page=prog#environnement
    Michel
    0
  10. coCCajus Messages postés 58 Statut Membre 18
     
    Merci beaucoup Michel de votre aide

    je vais étudier en détail votre proposition de code et essayer à tête reposée de l'adapter exactement à mon besoin

    merci aussi du lien pour apprendre VBA ; j'en ai vraiment besoin

    Je vais maintenant cesser de vous importuner et marquer ce sujet comme résolu

    La période est propice pour vous assurer de tous mes voeux pour 2013 que j'étends bien sûr à tous les participants de ce sympathique forum
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Tu ne m'as pas importuné !!! :o)

      Si c'était le cas, j'aurais abandonné le suivi...

      Bonne année 2013
      0
  11. BenoitLX Messages postés 1 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    J'essaie également de faire la somme du plusieurs cases d'une même colonne qui sont en couleur bleu. J'ai essayé de reprendre le code de la macro juste au dessus. Cependant, ce dernier ne fonctionne pas. J'ai complété la deuxième ligne en précisant la plage de travail, la couleur et l'adresse du résultat mais en voulant la faire tourner, il m'indique qu'il y a une erreur plus bas, à la ligne "If Not Intersect(ActiveCell, Range(plage)) Then".
    Je ne comprend pas pourquoi une erreur est identifiée ici.

    Merci d'avance
    0