Les formules dans les tables

Après avoir vu comment créer et formater une table, nous allons voir quelques particularités sur l'écriture des formules dans les tables.

Références dans les tables

Les tables ont un nom qui est unique dans le classeur. Par conséquent, il n'est pas utile de préciser le nom de la feuille sur laquelle la table est située.
Les tables sont en fait un objet (au sens programmatique du terme) excel de type plage de données (range) et il est stocké comme tel par excel. Mais il y a une particularité : la ligne d'entête et celle des totaux ne sont pas incluses dans le range défini par le nom !

Dans les options d'excel 2007, vous avez la possibilité de travailler avec les noms de tableaux dans les formules. Si ce n'est déjà fait, cochez cette option et la saisie semi-automatique de formule pour suivre ce tutoriel (options/formules/manipulation de formules)

Un des grands intérêts des tables c'est d'avoir un système de référence "interne" à la table, c'est à dire ne dépendant pas des numéros de lignes et de colonnes.
Reprenons l'exemple utilisé dans la page précédente, et ajoutons une colonne "total dépenses"
Au bout de la première ligne de données, tapez = somme( et sélectionnez les données de la première ligne).

Vous voyez deux choses particulières :
1) Au lieu du

=somme($B$2:$D$2) 

attendu, la formule est

=SOMME(data_famille[[#Cette ligne];[nb personnes]:[visites]])

Les références sont constituées du nom de la table (data_famille) puis entre crochets droits des références ligne;colonne définies par les entête de colonnes.
[#cette ligne] indique qu'on fait référence à la même ligne que celle sur laquelle se trouve la formule.

NB dans excel 2010 [#cette Ligne] est noté [@] ce qui est autrement plus lisible et raccourcit agréablement les formules !

2) quand vous validez la formule, en cliquant sur l'icone qui apparait puis sur le message, la formule se recopie automatiquement dans toute la colonne.


De façon notable, la formule est exactement la même dans toute la colonne, il n'y a pas de référence à des numéros de ligne et de colonne comme dans une formule classique.

Intérêt du mode de référence des tables

A première vue on se dit que c'est plus simple de taper (ou de lire)

=somme($B$2:$D$2) 

que

=SOMME(data_famille[[#Cette ligne];[nb personnes]:[visites]])

Cette notation présente l'avantage d'expliciter les références en termes de contenus plutôt que de position.
En fait ce type de notation est surtout intéressante (je trouve) lorsque les tables sont appellées à s'étendre par l'ajout de nouvelles lignes ou de nouvelles colonnes.
C'est particulièrement pratique quand on a plusieurs tables les unes en dessous des autres dans une feuille qui chacune peuvent accueillir de nouvelles données.
En effet, l'ajout de données dans celle du haut de la feuille décale les références (en numéros de lignes) de la seconde table.
Avec le mode de notation "tables", les références ne changent pas. Ainsi,

=data_famille[[#En-têtes];[Famille]]

fait référence à la première cellule de la table, quelle que soit sa position dans la feuille.
Cette stabilité des références est particulièrement utile pour manipuler les tables en VBA.

Vous pouvez cependant tout à fait utiliser les références classiques pour utiliser les données d'une table.
Si vous souhaitez désactiver de façon permanente ce mode de référence, décochez l'option correspondante dans les options d'excel.

Références absolues et semi relatives dans une table.

Une limite du mode de référence des tables c'est l'impossiblité de fixer une référence comme on le fait avec les $ dans une référence classique.
C'est parfois très gênant.
Disons que l'on veut calculer les dépenses de courses et de visites par personne.
Effaçons la colonne total dépenses et créons deux nouvelles colonnes avec comme intitulé courses_pax et visites_pax
En dessous de courses_pax, la formule

=data_famille[[#Cette ligne];[courses]]/data_famille[[#Cette ligne];[nb personnes]]

nous donne ce qu'on souhaite. Mais en tirant la formule vers la droite pour l'appliquer à la colonne visites_pax, il faudrait fixer la partie

data_famille[[#Cette ligne];[nb personnes]]

On peut le faire de deux façons :
On peut tout à fait faire un mélange de références de type tables et de références classiques:
=data_famille[[#Cette ligne];[courses]]/$B2
Ici on utilise des références semi-relatives, de façon à ne fixer que la référence de la colonne, pour que la formule s'adapte dans le reste de la colonne.

C'est pratique mais on perd l'avantage de s'affranchir complètement des références aux numéros de ligne et de colonne.
On peut le faire en utilisant la fonction INDIRECT qui transforme du texte en une référence. Quand on tire une formule contenant indirect(" ref de la cellule") le texte entre guillemets n'est pas modifié ce qui permet de fixer notre formule.
Un petit conseil, n'hésitez pas à modifier petit à petit vos formules si elles sont un peu complexes, et à ajouter des espaces entre les parenthèses et crochets pour ne pas vous y perdre !

=data_famille[[#Cette ligne];[courses]]/INDIRECT("data_famille[[#Cette ligne];[nb personnes]]")

Dans ce cas précis, [#cette ligne] fait que cette référence reste une référence semi-relative, ce que nous souhaitons.

Cette notation de type table fonctionne aussi pour faire dans une cellule hors d'une table des calculs sur celle-ci.

=SOMMEPROD((data_famille[nb personnes]=2)*(data_famille[courses]))

Renvoie le montant dépensé pour les courses par les familles de deux personnes.
Là encore, on peut utiliser indirect pour fixer une référence.

Utiliser les entêtes de colonnes comme valeurs dans une formule.

Les entêtes de colonne peuvent contenir des dates ou des valeurs que l'on souhaite utiliser dans une formule.
Il faut se souvenir que le fait de transformer une plage de données en formule transforme en même temps en texte les entêtes de colonne.
Pour utiliser cet entête comme une valeur il faut simplement transformer à nouveau le texte en valeur, par exemple en ajoutant 0 ou en multipliant par 1.

Utiliser la colonne d'une table comme source dans données/validation

Il ne semble pas que dans données/validation, on puisse restreindre le choix à une liste et indiquer directement = table2[colonne1] comme source de données, ce qui est ma foi fort dommage. ça ne marche pas non plus si la table n'a qu'une seule colonne.
On peut cependant ruser et dans le gestionnaire de nom définir un nouveau nom : masource=matable[macolonne]
Cette façon de définir une source pour la validation de données est intéressante car la source est dynamique (si on ajoute de nouvelles valeurs elles sont prises en compte), et on n'a pas besoin d'indiquer le nom de la feuille contenant les données.

Mots clefs associés à cette page : ,

Recherche sur tableau

Bonjour; voila sur le même tableau qui est constitué d'une 20 de colonnes, la plupart c'est des dates de vaccinations des enfants: le problème c'est que dans un anglet j'ai adresse une fiche de recherche cet dernière se base sur le numéro de naissance de l'enfant quant je tape le numéro et je valide j'exécute l'opération par la touche F9 pour remédier a la lenteur de la saisie , alors le résultat s'affiche normalement pour les champs renseignés dans l'anglet enregistrement,mais les champs dates qui sont vide dans la base de données "enregistrement" s'affiche sous la forme de "00/01/00" dans langlet recherche alors j'ai pas pu les cahés.
la formule de rechereV = RECHERCHEV(B8;Enregistrement!A2:AP15000;28;FAUX)
exp :
résultat de recherche:
non : hamadouche. Prénom: Saly. Date de naissance:01/01/2009.
date de vaccination BCG: 01/01/2009 date de vaccination HBV2: 00/01/00 (l'enfat n'est pas encore vacciné est le champs est vide dans la base enregistrement)
j'ai essayé cette formule est sa n'as pas marchés :
=SI(B8<>"";SI(RECHERCHEV(B8;Enregistrement!A2:AP15000;30;FAUX)<>0/1/1000;""))
b8 : cellule qui contient la saisie de numéro de l'enfant a recherché

Redouane_oran

nom du tableau et BDNBVal

Merci Misange pour votre aide , ça marche très bien et même quant j'ajoute des données au dessous de la table les données sont intégrés automatiquement et les formules calculent automatiquement les nouvelles données. en même temps j'arrête pas de rencontrer des problèmes tels que la lenteur de l'application au moment de la fermeture, sachant qu'elle prend en charge au maxi 15000 enrg, PC P4 Windows XP et de 256 de RAM. j'aimerais bien vous transmettre l'application mais je ne sais comment. NB/ excuse mon français je maitrise pas bien la langue de moliere. merci.

Redouane_oran

limites...

Je crains que les lenteurs que vous rencontrez ne viennent des limites de votre machine. 256 MO de RAM ce n'est pas beaucoup aujourd'hui. Les formules travaillant sur des plages de données sont très gourmandes en ressources.

Misange

Tableau

j'exploite des petites bases de données sur excel et j'utilise des références de plages dans les formules comme
=BDNBVAL(Enregistrement!A2:AQ3;7;critères!B5:C6),
quand j'ai nommé le tableau par "liste" j'ai changé la formule par
=BDNBVAL(liste;7;critères!B5:C6)
mais ça n'a pas marché. A noter que à chaque fois que j'ajoute un enregistrement le tableau prend le nouvel enregistrement mais la référence des formules BDVAL ne change pas. L'enregistrement actuel est de a2:aq3 on ajoutant un enregistrement alors la référence reste tjrs on a2:aq3 au lieu de a2:aq4... ainsi de suite. merci pour votre aide précieuse.

Redouane_oran

mélange

Bonjour,
Comme il est indiqué en haut de cette page, une des particularités des noms des tables définies avec la fonction "mise en forme de tableau" c'est que nom n'intègre PAS la ligne d'en-tête ni celle des totaux. Or dans la fonction BDNBVAL, le premier paramètre c'est l'adresse de la base de données AVEC la ligne d'en tête.
la bonne syntaxe est donc
=BDNBVAL(liste[#tout];7;critères!B5:C6)
[#tout] renvoie à la référence de la table AVEC la ligne d'en tête.

Misange

Nouveau

6 Nouvelles pages ajoutées ce mois-ci dont :

Mises à jour

8 pages modifiées ce mois-ci dont :