Somme 3D "automatique"

Comment faire dans la feuille "Bilan" la somme de valeurs contenues dans les feuilles Truc1 à Truc12.

Solution simple mais dangereuse :

=somme(truc1:truc12!A1)

fait la somme de toutes les cellules A1 des feuilles truc1 à truc12.

Mais attention, si vous intercalez une feuille "machin" après la feuille Truc3 par exemple, la valeur de Machin!A1 sera additionnée aux autres. Super dangereux car sur le moment on s'en souvient mais on risque de l'oublier par la suite. A contrario, cela peut être très pratique pour étudier certains scénarios...

Ecrire les références "en dur" dans la formule

Indirect permet de faire interpréter à excel une chaîne de caractère comme si c'était une référence:
Lorsqu'excel lit
= indirect("A" & somme(B1:B3)),
le programme fait la somme de B1 à B3 (disons 7) puis remplace dans l'expression ce qui donne =indirect("A7") et renvoie la valeur contenue dans A7.

Cette astuce est très pratique pour introduire des données variables dans une formule. Mais indirect semble incompatible avec les références 3D.
Par conséquent, =somme(indirect("truc1:truc12")) renvoie #REF...

Il faut ruser (astuce de Bob Philipps, le champion international de Sommeprod !)

=sommeprod(N(INDIRECT("Truc" & ligne( INDIRECT("1:12")) & "!A1")))

Si on évalue cette formule pas à pas, on voit que la partie

"Truc" & ligne( INDIRECT("1:12")) & "!A1"

est transformée en un array
{Truc1!A1;Truc2!A1....Truc12!A1}
qui est utilisé dans la fonction sommeprod. 
On pourrait aussi utiliser la fonction somme et faire une validation matricielle  à la place de sommeprod dans ce cas.

A noter : même si on intercale une feuille Machin entre les feuilles Truc... elle n'est pas prise en compte dans le calcul

L'inconvénient, c'est que si on tire cette formule pour la copier dans d'autres cellules, la référence A1 étant incluse dans la partie INDIRECT de la formule. 
Pour rendre l'ajustement possible, on utilise cette fois trois autres fonctions : adresse, lign() et colonne()
Adresse permet de construire une adresse à partir des références des lignes et des colonnes.
Colonne() renvoie le numéro de la colonne de la cellule active. Et O surprise, ligne() celui de la ligne active.
Adresse(ligne(),colonne()) renvoie donc A1 lorsqu'on est en A1 et ... D23 quand on est en D23.

Notre formule devient

=sommeprod(N(INDIRECT("Truc" & ligne( INDIRECT("1:12")) & "!" & adresse(ligne();colonne()))))

Quand on ne connait pas à l'avance le nombre de feuilles

Et si j'ajoute des feuilles Truc13, Truc 14... Comment faire en sorte que ces feuilles soient prises en compte ?
Pour faire cela, il faut que les numéros des "Trucs" soient stockés quelque part dans le classeur, par exemple sous forme d'une plage de cellules ou d'une plage nommée ("mestrucs")
On pourra alors accéder au nom de la dernière feuille de la famille Truc par le bout de formule
=max(mestrucs)
On remplace alors dans la formule le 12 de indirect('"1:12")  par cette formule:

=sommeprod(N(INDIRECT("Truc" & ligne( INDIRECT("1:" & max(mestrucs)) & "!" & adresse(ligne();colonne()))))

Quand il n'y a pas de logique dans le nommage des feuilles

L'astuce de Bob Phillips peut être utilisée en entrant le nom des feuilles dans un tableau disons en N1:N4 et en utilisant cette référence dans la formule

=SOMMEPROD(N(INDIRECT("'"&N1:N4&"'!A1")))

Et si on nomme "mesfeuilles" (insertion/nom/définir ou pour excel 2007+, formules/définir un nom) cette liste:

=SOMMEPROD(N(INDIRECT("'"& mesfeuilles &"'!A1")))

Ce nom peut être dynamique : si mesfeuilles est défini par =decaler($N$1;;;nbval($N:$N), tou ajout d'un nom de feuille en dessous des autres fera que cette feuille sera prise en compte dans les calculs.

Auteurs : ,

Mots clefs associés à cette page : , , ,