CALC "N/D" en résultat de formule avec SI imbriqués

Bonjour,

(voir la feuille en pièce jointe).

J’ai une colonne avec des valeurs d’abscisses (colonne marquée X)
J’ai deux colonnes avec des valeurs d’ordonnées (a et b)
Je crée une colonne (c) en prenant la valeur a ou la valeur b en
fonction de ce qui se trouve en C1 ("A" dans l’exemple).
Si c’est "A", je prends la colonne a, si c’est autre chose, je prend
la colonne b. Dans les deux cas, je soustrait 10 à la valeur.

J’ai utilisé pour ça la formule (matrice) suivante :
=SI(C1="A";C3:C45-10;D3:D45-10)

Tout fonctionne normalement mais lorsque la colonne abscisse ne
comporte pas de valeur numérique, j’obtiens #VALEUR!

Ce n’est pas très grave, mais ce n’est pas joli.

Je teste donc si la valeur de X est numérique pour écrire le résultat
de la formule ou rien... La colonne d le fait et contient la formule
suivante :

=SI(ESTNUM(B3:B45);SI(C1="A";C3:C45-10;D3:D45-10);"")

Là, le résultat est bon lorsque la valeur est non numérique (je
n’obtiens rien) mais j’obtiens "N/D" si la valeur est numérique.

Merci de vos lumières.

Jean-Luc

Bonsoir,

Là, le résultat est bon lorsque la valeur est non numérique (je
n’obtiens rien) mais j’obtiens "N/D" si la valeur est numérique.

Je ne connais pas ce code d'erreur. Il n'est pas référencé dans l'aide. Lorsque tu sélectionnes la cellule, qu'est-il indiqué dans la barre d'état ? "Erreur : ..." ?

Laurent BP

Bonsoir Laurent,

Bonsoir,

Là, le résultat est bon lorsque la valeur est non numérique (je
n’obtiens rien) mais j’obtiens "N/D" si la valeur est numérique.

Je ne connais pas ce code d'erreur. Il n'est pas référencé dans
l'aide. Lorsque tu sélectionnes la cellule, qu'est-il indiqué dans
la barre d'état ? "Erreur : ..." ?

Le code en question est l’équivalent de l’anglais #NA (qu’on avait
avec les versions 1 et 2 d’OpenOffice et qui a - en locale Fr - été
remplacé par #ND.

Le message associé est "Erreur : Valeur non disponible".

J-L

Bonsoir,

Il vaut mieux prévoir le cas d'erreur :
=SI(ESTERR(C1="A");D3:D45-10;C3:C45-10)

Cordialement,
Sandy-Pascal Andriant

Non, ça, ça ne fait pas ce que je demande.
C1="A" n’est jamais en erreur, donc le SI donne toujours la même valeur.

Ce que je veux tester c’est que C1="A" ou pas...

Donc la formule indiquée remplit bien la fonction :
=SI(C1="A";D3:D45-10;C3:C45-10)

J’englobe ensuite le SI dans un autre SI :
=SI(ESTNUM(B1:B45);[ma formule précédente qui marche];"")

C’est l’imbrication qui ne marche pas (dans ce cas-là parce que, dans
mon projet, je procède de même un peu partout sans problème, sauf dans
ce cas là...)

J-L

Comme on n'a pas reçu la feuille jointe, ça devient difficile à comprendre.
Il vaut mieux mettre la feuille dans nabble :
http://nabble.documentfoundation.org/Users-f1744091.html

Cordialement,
Sandy-Pascal Andriant
Coordinateur de UPT-Paléographie

Re,

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Bonjour,

(voir la feuille en pièce jointe).

Les pièces jointes ne passent pas directement sur la liste de diffusion. Il faut soit passer par passerelle Nabble, soit utiliser un système de mise à disposition de fichier tel que http://cjoint.com/ http://dl.free.fr/ ou autre.

...

Je teste donc si la valeur de X est numérique pour écrire le résultat
de la formule ou rien... La colonne d le fait et contient la formule
suivante :

=SI(ESTNUM(B3:B45);SI(C1="A";C3:C45-10;D3:D45-10);"")

Là, le résultat est bon lorsque la valeur est non numérique (je
n’obtiens rien) mais j’obtiens "N/D" si la valeur est numérique.

Je ne reproduis pas le même problème avec LibO 3.4.5 sous WinXP. Le premier test ESTNUM ne semble pas fonctionner et considère le résultat toujours vrai. C'est la référence à une cellule qui semble poser un pb :

=SI(ESTNUM(B3:B45);SI(B3:B45>0;"vraiA";"vraiB");"")
retourne le résultat attendu
alors que
=SI(ESTNUM(B3:B45);SI($C$1="A";"vraiA";"vraiB");"")
retourne que des "vraiA" quelle que soit la valeur numérique ou non en B3:B45
Nommer la cellule C1 ne change rien.
=SI(ESTNUM(B3:B45);SI(valTest="A";"vraiA";"vraiB");"")
Il faut utiliser la colonne E pour recopier la valeur à tester et changer la formule :
=SI(ESTNUM(B3:B45);SI(E3:E45="A";"vraiA";"vraiB");"")
renvoie "vraiA" ou "" suivant la valeur en B.

Sinon, la formule non matricielle fonctionne correctement.
=SI(ESTNUM(B3);SI(C$1="A";C3-10;D3-10);"")

Si ça peut aider à faire avancer le schlimblick.

Laurent BP

Je crois comprendre l'erreur : Non disponible veut dire que pour la formule matricielle, il a besoin de modifier l'indice de tous les tableaux (C3:C45, D3:D45) mais il a un pb avec C1 : il ne peut trouver + qu'une ligne. Si je ne me trompe pas, si la cellule B3 est un numérique, il ne doit pas te mettre ND en résultat sur cette ligne.
Par contre, je ne comprends pas pourquoi je n'ai pas les même résultats que toi. Quelle version / OS ?

Laurent BP

J'ignorais que #N/A était un code anglais. Pour moi, il signifiait "non applicable".

Ceci étant, le changement peut être gênant pour certains. Par exemple, un programme traite un fichier csv susceptible de contenir des valeurs d'erreur. Sachant cela, on traite spécifiquement les données valant #N/A. Mais comme le code d'erreur a changé, la donnée #N/D sera considérée comme valide et le programme plantera. Ce qui peut conduire à d'ennuyeuses conséquences.

Bon, quelques réponses aux réponses (merci) :

Le fichier est ici :
http://nabble.documentfoundation.org/file/n3708276/ERR-ND.ods ERR-ND.ods

Pour ce qui est de l’OS et version :
Debian GNU/Linux 3.2.2
LibreOffice 3.5.0-rc2

Oui, le problème n’existe qu’avec les matrices. Sinon, ça fonctionne.

Si je crée une colonne supplémentaire (toujours en matrice) qui fait juste
le SI(ESTNUM()), alors, cela fonctionne (dans la colonne en question), mais
l’autre reste "pas jolie")

Jean-Luc

Personnellement quand un résultat n'est "pas joli" j'utilise systématiquement =ESTERR(), c'est plus propre

Cordialement,
Sandy-Pascal Andriant

Bonsoir,

Le code en question est l’équivalent de l’anglais #NA (qu’on avait
avec les versions 1 et 2 d’OpenOffice et qui a - en locale Fr - été
remplacé par #ND.

Le message associé est "Erreur : Valeur non disponible".

J'ignorais que #N/A était un code anglais. Pour moi, il signifiait "non
applicable".

Ce qui est génant c'est d'avoir un message (valeur non disponible) en français pour un code en anglais (A est pour Available), c'est pas très cohérent... Les codes d'erreur étaient pendant un temps à moitié traduits, ils le sont tous maintenant (normalement :slight_smile:

Ceci étant, le changement peut être gênant pour certains. Par exemple,
un programme traite un fichier csv susceptible de contenir des valeurs
d'erreur. Sachant cela, on traite spécifiquement les données valant
#N/A. Mais comme le code d'erreur a changé, la donnée #N/D sera
considérée comme valide et le programme plantera. Ce qui peut conduire à
d'ennuyeuses conséquences.

Donc il vaut mieux garder les bugs parce qu'on est habitué à les contourner ?

À bientôt
Sophie

Bonjour

De ce que je comprends du problème la formule devrait plutôt être quelque
chose comme :

=SI($C$1="A";SI(ESTNUM(C3:C45);C3:C45-10);SI(ESTNUM(D3:D45);D3:D45-10))

Cela dit, si C1 ne peut être "en erreur' (sic) tu peux procéder cf. col H
dans le classeur joint (calcul des références puis calcul via indirect).

Pour terminer, je ne vois pas la nécessité de passer par des formules
matricielles cf. col I dans le classeur joint.

http://nabble.documentfoundation.org/file/n3709295/ERR-ND.ods ERR-ND.ods

Cordialement
Pierre-Yves

Bonjour,

en entrant la formule hors matrice, cela fonctionne parfaitement.

Il me manquait la suite :

Dans la matrice, j'ai réussi de la manière suivante (à traduire en français)
Ça fonctionne, même s'il y a du texte dans b3:b45 mais est-ce rédhibitoire ?

=IF(C1="A";IF(ISBLANK(B3:B45);"";C3:C45-10);D3:D45-10)

En fait, pour être mieux avec A ou sans A dans C1 il faut rajouter une couche de if supplémentaire :

=IF(C1="A";IF(ISBLANK(B3:B45);"";C3:C45-10);IF(ISBLANK(B3:B45);"";D3:D45-10))

reste toujours la question du texte dans la première colonne

Bonjour

Jacques wrote

En fait, pour être mieux avec A ou sans A dans C1 il faut rajouter une
couche de if supplémentaire :

=IF(C1="A";IF(ISBLANK(B3:B45);"";C3:C45-10);IF(ISBLANK(B3:B45);"";D3:D45-10))

Ce type d'utilisation du IF (SI) retournant une chaîne vide est désormais
déconseillée depuis le changement de gestion des chaînes dans les calculs
(voir
http://nabble.documentfoundation.org/equivalent-de-SIERREUR-tt3463462.html#a3463748
ce fil précédent )

Privilégier une approche cf.
http://nabble.documentfoundation.org/CALC-quot-N-D-quot-en-resultat-de-formule-avec-SI-imbriques-tt3706822.html#a3709295
ma réponse de tout à l'heure

Cordialement
Pierre-Yves

Bonjour tout le monde,

L'erreur N/D est normale dans le cas de ta formule. Il ne s'agit ni d'un
bogue, ni d'une limitation de Calc.
Ton test est du type SI(matrice;scalaire...
dans ce cas là, le deuxième argument (scalaire) s'applique au premier terme
de la matrice.
Les autres termes de la matrice ne trouvant pas de résultat, l'erreur N/D
est renvoyée.
C'est le cas lorsque l'on a des matrices de tailles différentes.

Par contre on peut avoir un scalaire en condition1 : Si la condition est
respectée, renvoyer matrice.

Mais comme Pierre-Yves l'a justement souligné, nul besoin de formule
matricielle ici.

Concernant l'erreur N/D traduite (comme les autres erreurs : VALUE! DIV/0
...etc, Sophie a raison de souligner qu'il est logique que celle-ci aussi
soit traduit.
Mais, car il y en a un, il n'est pas très logique dans ce cas que les
fonctions afférentes ne le soit pas - NA() - ou partiellement - ESTNA() -.

J'écris =NA() et j'obtiens N/D.

Gérard

Si l'on fait par exemple : =IF(C1="A";IF(ISNUMBER(B3:B45);C3:C45-10);IF(ISNUMBER(B3:B45);D3:D45-10))
Ceci me retourne 0 dans la matrice si B(n) est vide ou est texte, et FAUX à l'extérieur de la matrice. Pourriez-vous m'expliquer pourquoi ?

Dans mon exemple précédent qui ne gérait pas le texte dans B(n) : =IF(C1="A";IF(ISBLANK(B3:B45);"";C3:C45-10);IF(ISBLANK(B3:B45);"";D3:D45-10))
  le résultat était le même en et hors matrice, ce qui finalement me semble normal puisque je générais un texte bien défini et vide (j'ai compris, c'est pas bien).

Peut-on obtenir autre chose que 0 dans la matrice ?

Le code en question est l’équivalent de l’anglais #NA (qu’on
avait avec les versions 1 et 2 d’OpenOffice et qui a - en locale
Fr - été remplacé par #ND.

Le message associé est "Erreur : Valeur non disponible".

J'ignorais que #N/A était un code anglais. Pour moi, il signifiait
"non applicable".

C’est assez facile à voir.
Dans une cellule, mettez ce qui suit :
=NA()

Cette fonction force justement cette valeur d’erreur.
Et on obtient (au moins avec ma version)... #N/D

Et, pour en avoir le cœur net, passez l’interface en anglais depuis
les paramètres linguistiques :
On obtient alors #N/A au lieu de #N/D

Ceci étant, le changement peut être gênant pour certains. Par
exemple, un programme traite un fichier csv susceptible de contenir
des valeurs d'erreur. Sachant cela, on traite spécifiquement les
données valant #N/A. Mais comme le code d'erreur a changé, la
donnée #N/D sera considérée comme valide et le programme plantera.
Ce qui peut conduire à d'ennuyeuses conséquences.

Si on a ces fâcheuses conséquences, c’est qu’on n’a pas programmé le
truc normalement.

Ce qu’il faut faire dans ce cas-là, ce n’est pas traiter sur la valeur
#N/A (chaîne de caractères) mais faire quelque chose comme :
=SI(ESTERR(xxxx); :wink: --> Toutes les erreurs SAUF #N/A
=SI(ESTNA(xxx); ; ) --> Erreur de type #N/A uniquement
=SI(ESTERREUR().... --> TOUTES les erreurs

Mais c’est vrai que ce n’est pas toujours possible. Les valeurs
d’erreurs sont affichées comme du texte (comme les résultat de
formules) mais une cellule de tableur contient bien autre chose que
.Value ou .String. Les importations CSV n’importent que ça… Personne
ne peut préjuger à l’avance du formatage d’un fichier texte. Il faut
soit le spécifier AVANT, soit faire une routine qui s’accommode des
deux langues (si on ne parle que de l’anglais et du français).

Il faut savoir que TOUT est localisé et pas seulement #N/A
#VALEUR! par exemple posera les mêmes problèmes.

Jean-Luc