Bonjour,
Voici un exemple :
1 2 3 4 5 6 7 8 9 10 11
| Sub TotauxDansCellulesGrises()
Dim n As Integer, c As Range
For Each c In Intersect(ActiveSheet.UsedRange, Columns("A:A"))
If c.Interior.Pattern = xlSolid Then
c.FormulaR1C1 = "=SUM(R[-" & n & "]C:R[-1]C)"
n = 0
Else
n = n + 1
End If
Next
End Sub |
Ici le traitement prend en compte les cellules de la colonne A uniquement. A adapter selon tes besoins.
Le principe est d’utiliser un compteur (n, ici). Quand on rencontre une cellule qui a un fond (grisé ou non, car il y a plusieurs nuances de gris, et j’ignore laquelle tu utilises), on y inscrit une formule avec le sous-total des n cellules précédentes, et on remet le compteur à zéro.
Il y a 2 interprétations pour cette phrase:
jusqu'à la cellule grise d'avant
Cette dernière cellule peut être incluse ou non. Mon exemple de code ne l'inclut pas.
Pour l’inclure, il faudrait remplacer
c.FormulaR1C1 = "=SUM(R[-" & n & "]C:R[-1]C)"
par
c.FormulaR1C1 = "=SUM(R[-" & n + 1 & "]C:R[-1]C)"
Par ailleurs, cet exemple n’est qu’un point de départ : cela fonctionne très bien si chaque cellule grisée est précédée d’au moins une cellule non grisée.
Par contre, si 2 cellules grisées sont l’une en dessous de l’autre, la seconde contiendra un zéro qui résulte d’une référence circulaire :
La formule est le sous-total de la cellule située n lignes au-dessus, jusqu'à la cellule précédant celle qui contient la formule :
En A10, si n = 4, la formule sera "=SOMME(A6:A9)", ce que l’on souhaite. mais si n = 0 (2 cellules grisées consécutives), la formule sera "=SOMME(A10:A9)", ce qui aboutit à une référence circulaire
Un test supplémentaire est donc nécessaire, si le risque existe d’avoir 2 cellules grisées à la suite.
De même, si on a une cellule grisée en ligne 1, Excel considère que la cellule "précédente" est celle qui se trouve en dernière ligne (A65536, ou A1048576 avec Excel 2007). La formule est alors traduite par "=SOMME(A:A)" ce qui conduit également à une référence circulaire, puisque par hypothèse, il s’agit de la formule en cellule A1.
En outre, il n’y a aucune adaptation automatique des formules si on grise une cellule qui ne l’était pas, ou si on enlève le grisé d’une cellule qui l’était.
Pour cela, il aurait fallu ajouter une procédure événementielle qui n’est pas faite.
J'espère que cet exemple te permettra d’aller plus loin si nécessaire, car pour les cas les plus simples, il fonctionne directement.
Cordialement,
Michel Gaboly
Envoyé par
abalboul
Bonjour,
Je suis debutant dans la programation VBA, ce que je veux faire, c'est que sur une colonne, j'ai certaines cellules en couleur grises, et je veux faire un macro qui parcours toute la colonne, en mettant sur chaque cellule de couleur grise, la somme des cellules au dessus, qui ne sont pas de couleur grises, jusqu'a la cellule grise d'avant;
Merci beaucoup pour votre aide
Partager