Tableur, Annexe-1, 01.10.2012


Références

Ceci est un complément du cours/TD, afin de faciliter vos TPs avancés. Peut-être il y aura un autre complément, plus tard, mais ne soyons pas naïfs : on couvre moins de 20% de la structure du Calc dans ce cours entier. La moitié d'information "professionnelle" concerne les dispositifs d'interfaçage visuelle et les "macros" (p. ex. en Basic, de la véritable programmation ; pour cela nous n'avons pas le temps...).


J'ai séparé l'explication de quelques difficultés et ambiguïtés concernant les exercices vus en TP, sur cette page. On traitera Calc comme un langage de programmation universel, sans pour autant faire de la programmation au sens habituel (et inexact...) du terme ! Le but est d'expliquer un peu la structure du document Calc, de commenter les particularités de quelques fonctions, et de nous préparer à des exercices plus avancés.


"Variables" et leurs noms, références, liaisons.

Un langage de programmation "classique" vous permet de définir des variables : x, alpha, etc. Une variable contient une valeur, et peut référencer une autre variable, par ex. x=alpha transmet la valeur de alpha à x.

Un tableur utilise - typiquement - les "noms cartésiens" : \$A\$2, \$UR\$16, etc., avec des abréviations : l'ommission du dollar localement ne signifie rien, mais joue le rôle d'adressage relatif, quand on copie la cellule contenant, disons B3. Vous devez savoir tout ça ! Je rappelle que Calc vous donne également la possibilité de nommer les variables (cellules) à votre guise, il suffit de remplacer le texte dans le champ des noms (ici : A2) par quelque chose de plus significatif, par ex. x (si cela vous plaît...).

Ceci devient une référence absolue. Si vous copiez par =x cette cellule dans, disons, C4, et vous utilisez la copie incrémentale (le rectangle noir dans le coin), l'adressage ne change pas.

Le mot référence, utilisé plusieurs fois, n'a pas de bonne définition (bonne : exacte, facile à comprendre, universelle, pratiquement applicable, etc.). Mais vous commencez, même sous-consciemment de comprendre ce mot. Faites une expérience. Placez dans la cellule x une valeur, par ex. 333. Effectuez : copier - coller dans une autre cellule. Elle prend la valeur 333. Modifiez x. L'autre cellule n'a pas bougé !

La valeur a été copiée, et détachée complètement de l'original. Mais si au lieu de copier-coller, vous insérez dans l'autre cellule : =x, une formule qui référence x, le changement de l'original provoque la modification de la cible.

Le signe "=" introduit un calcul : une opération qui décode le texte "=x", qui récupère la référence x, et qui la dé-référence, afin d'obtenir sa valeur.

Une autre expérience, similaire, mais différente. Cette fois on obtient le même phénomène, mais sans calcul manuel des formules. Copiez le contenu de x, mais au lieu de le coller ailleurs, effectuez le "collage spécial", et cochez la case "Lier" dans la boîte de dialogue. La cellule-cible prendra la valeur : =\$Feuille1.\$A\$2, Calc a inséré automatiquement le texte contenant la référence en question : sous forme de formule, comme habituellement.

On dit que la cellule-cible référence la source, qu'elle récupère la valeur par indirection. Notez qu'une cellule peut référencer aussi une autre feuille, et même un autre document ! Ceci est essentiel pour l'assemblage des bases de données, qui ramassent des informations stockées séparément, dans un document compact, présentable.


Tableaux, matrices

Dans un langage de programmation moderne on peut écrire des expressions qui pas seulement permettent de calculer une valeur en appliquant des opérations à une ou plusieurs variables (déréferencées !), mais aussi de calculer l'endroit où se trouve une valeur, ou où il faut insérer une valeur. Par exemple, nos pouvons accéder à un élément impair d'un tableau par t[2*i+1], où i est une variable contenant un nombre entier, et t : un tableau (liste, séquence, "plage"...) composée de plusieurs items.

Calc permet de nommer les plages également. Sélectionnez la plage A9:C16, et nommez-la : mat. Remplissez la plage avec des valeurs quelconques. Vous ne pouvez pas insérer "comme ça" =mat dans une autre cellule-cible, disons, E8, une valeur composite ne peut pas remplacer directement une valeur simple. Si vous faites : copier la plage, et coller dans E8, Calc remplira les cellules voisines, selon la dimension de la plage.

Dans le "jargon mathématisant", une plage – en tant que collection de valeurs – sera appelée : matrice. (Ang.: array, qui se traduit mieux par tableau ; en mathématiques les matrices sont des objets algébriques spécifiques, ce qui n'est pas toujours vrai en Calc). Calc est capable de travailler automatiquement avec les matrices, mais il faut parfois demander cela explicitement. Revenez à la case E8, tapez =mat, et validez avec Ctrl-Shift-Enter. La plage (pardon, matrice) a été dûment insérée, comme une valeur composite, occupant la plage E8:G15. Calc visualise une formule matricielle dans des accolades, ici : {=mat}, mais ceci n'est qu'une forme permettant à l'utilisateur de voir le caractère de l'entité ; on ne peut pas modifier une partie de la formule matricielle grâce aux accolades.

Cependant, nous pouvons insérer d'un coup une matrice ! Tapez dans une cellule ={2;3;9;0} et validez par Ctrl-Shift-Enter. Calc insère les 4 valeurs dans une colonne et 4 lignes. ={1 . 2 . 3 . 4} insère une ligne. Avec les points et points-virgules, on peut insérer une plage rectangulaire. (Dans autres versions linguistiques du Calc et autres tableurs, virgules separent les colonnes. Encore ailleurs, points-virgules séparent les colonnes, et les signes "|" – les lignes. Parfois la documentation est erronée...)

Plusieurs fonctions acceptent les arguments matriciels et retournent une matrice. Reprenont le tableau mat, supposons qu'il contient des nombres. L'insertion matricielle (Cntrl-Shift-Enter) de =SIN(mat/10) remplit la plage entière avec les résultats. Vous pouvez aussi taper d'autres expressions, par ex. =B9:B16+C9:C16 et sommer facilement deux colonnes entières. Bien sûr, on peut également insérer des expressions conditionnelles matricielles.

Les fonctions matricielles et leur usage, ne sont pas l'objectif de cet annexe. Mais on y reviendra !

Terminons cette section par l'indexation individuelle des matrices. Tapez =INDEX(mat,2,1) dans une cellule libre. Vous aurez l'élément dans la cellule de la ligne 2 et colonne 1. Ainsi nous pouvons résoudre l'exercice de formatage des jours en italien, sans tricher (en choisissant la langue...). On insère à partir de, disons, A3 la liste :

Domenica
Lunedì 
Martedì
Mercoledì 
Giovedì 
Venerdì 
Sabato   
Affectons à cette liste : A3:A9 le nom jours.
Si une autre cellule, disons, C2 contient un nombre, le jour (numérique) de la semaine, par ex. 4, et si dans, disons, D2 nous insérons : =INDEX(jours;C2) (la ligne suffit, la colonne ne change pas), nous aurons la valeur Mercoledì.


Références et fonctions tableur.

Revenons à la question d'indirection. Calc est un interprète : un programme monolitique qui décode les textes (la seule structure) soumise par l'utilisateur, comme des valeurs numériques, ou comme les adresses (références textuelles : "C7") des cellules. Ou, comme des formules. ALors, pourquoi ne pas rendre accessibles ces fonctionalités à l'utilisateur lui-même?

Prenons une cellule libre, par ex. C7, et tapons A6 (sans signe "=" !). Le résultat est un simple texte, "A6". Il n'a aucune interprétation, aucune signification pour le système, simplement un texte de deux caractères, une lettre et un chiffre. Si nous tapons ailleurs, disons, dans E3, la formule =C7, nous obtiendrons le texte "A6", quoi d'autre...

Mais – insérons dans E3 la formule =INDIRECT(C7), le résultat sera : "Mercoledì". On a fait une déréférence indirecte, un double décodage.

Ceci est la base des opération sur les références. Nous pourrons récupérer l'adresse d'un objet, convertir cette "chose" en entités numériques, par ex. récupérer la ligne et la colonne (ou le paramétrage d'une plage complète), faire quelques calculs avec, par ex. modifier le numéro de ligne, et accéder au contenu d'une cellule ainsi référencée / identifiée. Par exemple, un autre moyen de trouver Mercredi en italien (pas très optimal...) serait :

Bref, les fonctions INDIRECT, ADRESSE, LIGNE, COLONNE et INDEX, sans parler de quelques autres, permettent d'opérer avec les coordonnées de tableur de manière dynamique.

Encore un exemple...


Si vous avez des questions, c'est le moment.


Conclusion

L'essentiel qui fait la différence entre une calculatrice (même avec mémoire) et un ordinateur (ou un vrai programme), réside en peu de choses, disons (d'abord...) deux : Ce texte s'occupe du premier problème, l'autre viendra plus tard. N'hésitez à nommer vos variables, et de rendre vos documents tableur plus faciliement modifiables, par l'usage des références, aussi indirectes.


Retour