Somme instantanée de cellules colorées

d28b -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

sous excel 2007 et étant plus que débutant, j'ai enfin trouvé sur ces forums,comment faire la somme de cellules d'une meme couleur avec le code ci-après.
Ca marche très bien, mais si par la suite, je modifie la couleur d'une cellule, la somme ne s'actualise pas.
Comment faire pour que dès que je modifie une couleur, ma somme s'actualise instantanément
Option Explicit
Function som_couleur(plage As Range, couleur As Integer) As Double
Dim r As Range, nb As Double
Application.Volatile
nb = 0
For Each r In plage
If r.Interior.ColorIndex = couleur Then nb = nb + r.Value
Next
som_couleur = nb
End Function

Function cellcouleur(c As Range)
cellcouleur = c.Interior.ColorIndex
End Function

merci de votre aide.
Configuration: Windows XP

7 réponses

  1. Deeper
     
    Tu te places sur "This workbook" de l'explorateur (colonne de gauche) dans vba
    Tu copie colle cette fonction :

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    MsgBox "tutu"
    End Sub

    tu remplaces MSGbox "tutu" par ta fonction.
    En revanche, il faut que tu passe le range en parametre
    0
    1. d28b
       
      ca avance,
      ca doit ressembler à:
      Option Explicit
      Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      Function som_couleur(plage As Range, couleur As Integer) As Double
      Dim r As Range, nb As Double
      Application.Volatile
      nb = 0
      For Each r In plage
      If r.Interior.ColorIndex = couleur Then nb = nb + r.Value
      Next
      som_couleur = nb
      End Function
      End Sub

      Function cellcouleur(c As Range)
      cellcouleur = c.Interior.ColorIndex
      End Function

      passer le range en parametre, c'est à dire?

      merci bcp
      0
  2. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Bonjour,

    Non, il n'y a pas de raison, cela devrait se recalculer automatiquement. Soit le recalcul est trés long parceque la plage concernée en paramétre est trés vaste soit il faut regarder dans les options d'excel, dans la rubrique "Calcul" si c'est bien le mode "Automatique" qui est coché et non pas "Sur ordre".

    A+
    0
    1. d28b
       
      Salut,

      Je suis bien en automatique et je travaille sur un tableau d'essai très light.
      chose étrange, j'ai juste crée une ligne de cellules contenant une couleurs et des cellules sans couleur,
      chaque cellule contient une valeur à additionner suivant la couleur
      je rentre dans la cellule devant effectuer l'operation, je valide et tout fonctionne.
      si je change une couleur manuelement ca ne s'actualise pas
      si je tire la couleur a partir d'une cellule deja colorée, ca se réactualise automatiquement
      .....

      on m'a donné cette solution, mais j'ai un peu de mal a l'integrer (gros débutant)
      Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      "ma fonction"

      a ton avis?
      0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour à tous

    cette macro est à installer dans le module feuilX concerné (la feuille ou tu travailles)
    pour l'exemple la plage est A1:F1 et le résultat est en B10

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Intersect(Target, Range("A1:F1")) Is Nothing Then: Exit Sub
    Range("B10") = tafonction
    End Sub

    lorsque tu cliques dans la plage, la fonction se déclenche et compte le nombre de couleurs (soit le m^me si t'as rien changer)
    c'est un premier à améliorer (paramètres de la plage a rentrer qu'une fois), j'y jette un oeil, sois patient...
    0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    RE,

    dans le module où tu as installé ta fonction et audessus de toute écriture tu écris
    Public Const plage As String = "A1:F1" 'a adapter
    Public Const couleur As Byte = ' a adapter
    Public Const cible As String = "B10" 'a adapter


    et dans le module feuille on a:
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Intersect(Target, Range(plage)) Is Nothing Then: Exit Sub
        Range(cible) = tafonction(plage, couleur)
    End Sub


    edit à 12:05: modifications en italique
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Bonjour Michel_m,

    C'est exact, j'ai été un peu rapide car le changement de couleur ne provoque pas d'événement et donc pas de recalcul. Donc la seule solution est d'utiliser Worksheet_SelectionChange mais par contre si les fonctions ont été uilisées dans la feuille comme fonction personalisées, il serait peut être plus simple de forcer le calcul.

    du style :

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Worksheets("Feuil1").Calculate
    End Sub

    ou en faisant le test d'intersection de plage comme tu le propose

    Qu'en penses-tu ?
    0
  7. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Salut Pilas,
    oui peut-être, faudrait essayer (je n'ai pas enregistré...) mais à priori, je suis un peu sceptique car on ne change aucun paramêtre de la fonction (plage et couleur)
    enfin, faut voir... pas sûr de moi
    mais merci de ta remarque, je regarderai tout à l'heure
    0
  8. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Re,
    Je viens de regarder en rentrant: la fonction activate par Worksheet_SelectionChange ou par la solution proposée par Deeper Workbook_SheetChange (Bonjour Deeper, excuses moi) ne réagissent qu'au changement de valeur et non au changement de format (ici,colorindex)...
    ou il y a qqchose que je n'ai pas pigé, ce qui est très possible...

    A moins que les couleurs soient issues d'une Mise En Forme Conditionnelle!!!
    0