Équivalent de ESTDATE() dans le tableur

Bonjour,

J'ai eu besoin de la fonction est ESTDATE (équivalent de ESTNUM pour les dates) mais je ne l'ai pas trouvé.

Apparemment elle n'existe pas dans le tableur. J'ai donc tenté de réaliser une formule équivalente.

J'en suis arrivé à cela...

A1= cellule à tester
B2=ET(OU(TYPE(A1)=1;TYPE(A1)=8);CELLULE("FORMAT";A1)>="D1";CELLULE("FORMAT";A1)<="D5";MAINTENANT()=MAINTENANT())

Cette formule retourne true ou false si la cellule testée est une date
(saisie ou calculé par formule mais pas une chaine de caractère)
dont la valeur numérique est bien mis en forme avec au minimum l'affichage du mois et de l'année ou du mois et du jour (ex. 11/2010 ou 31/12)

Remarque : Cette formule ne prend pas en compte les mises en forme personnalisées qui renverraient bien ces informations mais dans un format "G" (tout les autres formats) (voir l'aide de CELLULE("FORMAT";A1)

Remarque 2 : On peut vouloir imposer la présence des valeurs JOUR MOIS et ANNEE en mettant non pas une fourchette allant de D1 à D5 mais en mettant D1 OU D4.

J'avais bien trouvé sur internet NON(ESTERREUR(ANNEE(A1))), mais je pouvais avoir n'importe qu'elle valeur numérique qui semblait être une valeur date valide.
Je n'ai pas réussi à utiliser DATEVAL() avec autre chose que des chaines de caractère en paramètres.

Qu'en pensez vous, est-ce la meilleure solution ?

N'existe-il pas plus simple... ?

Est-ce compatible avec les tableurs concurrent (j'en doute un peu) ?

A noter : J'ai mis le maintenant()=maintenant() pour forcer la réévaluation systématique de la fonction cellule à chaque mise à jour du tableau (même le F9 n'agit sans ça).

A+

Samuel Mounier

Bonsoir,

j'ai un peu cherché sans trouver encore de réponse simple. Ceci étant, il y a plus expert que moi.

Ce qui me choque par contre c'est de constater qu'en dehors du texte, tout est assimilé à un nombre valide et donc évalué comme une date.
les cellules vides
le zéro
les opérateurs + et -
les valeurs négatives

J'ai mené les tests avec la fonction N0.SEMAINE

E VRAI #VALEUR !
2 FAUX 1
02/01/01 FAUX 1
- FAUX 52
+ FAUX 52
-1
  52
0
  52

  52

Bonjour,

J'ai eu besoin de la fonction est ESTDATE (équivalent de ESTNUM pour les dates) mais je ne l'ai pas trouvé.

Apparemment elle n'existe pas dans le tableur. J'ai donc tenté de réaliser une formule équivalente.

J'en suis arrivé à cela...

A1= cellule à tester
B2=ET(OU(TYPE(A1)=1;TYPE(A1)=8);CELLULE("FORMAT";A1)>="D1";CELLULE("FORMAT";A1)<="D5";MAINTENANT()=MAINTENANT())

Cette formule retourne true ou false si la cellule testée est une date
(saisie ou calculé par formule mais pas une chaine de caractère)
dont la valeur numérique est bien mis en forme avec au minimum l'affichage du mois et de l'année ou du mois et du jour (ex. 11/2010 ou 31/12)

Remarque : Cette formule ne prend pas en compte les mises en forme personnalisées qui renverraient bien ces informations mais dans un format "G" (tout les autres formats) (voir l'aide de CELLULE("FORMAT";A1)

Remarque 2 : On peut vouloir imposer la présence des valeurs JOUR MOIS et ANNEE en mettant non pas une fourchette allant de D1 à D5 mais en mettant D1 OU D4.

J'avais bien trouvé sur internet NON(ESTERREUR(ANNEE(A1))), mais je pouvais avoir n'importe qu'elle valeur numérique qui semblait être une valeur date valide.
Je n'ai pas réussi à utiliser DATEVAL() avec autre chose que des chaines de caractère en paramètres.

Qu'en pensez vous, est-ce la meilleure solution ?

N'existe-il pas plus simple... ?

Est-ce compatible avec les tableurs concurrent (j'en doute un peu) ?

A noter : J'ai mis le maintenant()=maintenant() pour forcer la réévaluation systématique de la fonction cellule à chaque mise à jour du tableau (même le F9 n'agit sans ça).

A+

Samuel Mounier

Bonsoir,

j'ai un peu cherché sans trouver encore de réponse simple. Ceci étant, il y a plus expert que moi.

Ce qui me choque par contre c'est de constater qu'en dehors du texte, tout est assimilé à un nombre valide et donc évalué comme une date.

Bonsoir,

Une valeur numérique est aussi une date. Un nombre entier est une date :
40722 formaté en date devient 28/06/2011. Normal, c'est le nombre de jours depuis la date référence par défaut (30/12/1899).
S'il y a une partie décimale de ,0 à ,1, c'est la partie horaire :
40722,5 donne le 28/06/2011 12:00

La démarche de Samuel est la bonne à mon avis, mais il y a aussi un piège (un bug ?)
Soit la valeur décimale 40722 en A1
= CELLULE ("FORMAT"; A1) retourne F0 (normal), mais une application au format date ne change rien, sauf à forcer le recalcul (Ctrl + Maj + F9)

Dommage…
Lucien

Samuel, j'ai pas mieux comme solution. Désolé.

Bon surf,
Christian

Bonjour

En complément des réponses déjà données...

Samuel Mounier (Liste CGO) wrote:

J'ai eu besoin de la fonction est ESTDATE (équivalent de ESTNUM pour les
dates) mais je ne l'ai pas trouvé.

Apparemment elle n'existe pas dans le tableur

Comme déjà dit les dates sont des nombres (entiers ou décimaux)... affichés
sous forme de date.
Ceci explique cela...

Ta formule en est d'ailleurs une illustration puisque tu ne testes pas
"seulement" qu'il s'agit d'une date, mais en plus qu'elle est formatée selon
ce que *tu attends*.

En ce sens je ne suis pas sûr qu'elle soit beaucoup améliorable.

Il serait possible de programmer une fonction reposant sur la fonction
ISDATE disponible en LibOBasic mais cette dernière est moins restrictive que
toi qui limites la validité à un certain format.

Sur ce point toutefois :

Samuel Mounier (Liste CGO) wrote:

A noter : J'ai mis le maintenant()=maintenant() pour forcer la
réévaluation systématique de la fonction cellule à chaque mise à jour du
tableau (même le F9 n'agit sans ça).

Tu peux simplifier en remplaçant maintenant()=maintenant() par ALEA() qui
provoquera également le recalcul.

Le classeur joint reprend ces différents points :
http://nabble.documentfoundation.org/file/n3120572/IsDate.ods IsDate.ods

Cordialement
Pierre-Yves

Bonjour Christian et Lucien,

[...]

Bonsoir,

j'ai un peu cherché sans trouver encore de réponse simple. Ceci étant, il y a plus expert que moi.

Ce qui me choque par contre c'est de constater qu'en dehors du texte, tout est assimilé à un nombre valide et donc
évalué comme une date.

Perso ça ne me choque pas trop étant donné que je sais que le tableur ne traite que deux type de données :
1) les numériques et
2) les alphanumériques.

Maintenant Sophie avait je crois alerté la communauté lorsque le moteur du tableur qui évalue les cellules vide et 0 avait été modifié (je crois vers la version 3).

Et ce qui te choque et assez proche de ce point.

Les gens n'avait malheureusement que trop peu réagit alors.

Maintenant c'est fait... je doute que l'on puisse revenir facilement dessus

Bonsoir,

Une valeur numérique est aussi une date. Un nombre entier est une date :
40722 formaté en date devient 28/06/2011. Normal, c'est le nombre de jours depuis la date référence par défaut
(30/12/1899).
S'il y a une partie décimale de ,0 à ,1, c'est la partie horaire :
40722,5 donne le 28/06/2011 12:00

La démarche de Samuel est la bonne à mon avis, mais il y a aussi un piège (un bug ?)
Soit la valeur décimale 40722 en A1
= CELLULE ("FORMAT"; A1) retourne F0 (normal), mais une application au format date ne change rien, sauf à forcer le
recalcul (Ctrl + Maj + F9)

C'est vrai que ça ressemble à un bug.

C'est pour palier à ce bug que j'ai ajouté le aujourdhui()=aujourdhui() qui force la réévaluation de la formule systématiquement en retournant vrai.

A mon avis pour le corriger, il faudrait répertorier les fonctions (et des paramètres particuliers) en plus des opérateurs qui doivent généré un calcul systématique de la formule qui les contiennent.

Est-ce quelqu'un connait le moteur qui fait cette évaluation ?

Est-ce qu'une liste de ce type existe seulement ?

L'issue semble exister elle, je ne l'ai pas trouvé (pas pris le temps de chercher) mais j'ai trouvé une mention à son sujet sur http://wiki.services.openoffice.org/wiki/Documentation/FR/Calc:_fonction_CELLULE.

Il me semble bien de renseigner cette liste pour que ce bug soit corriger correctement.
Si quelqu'un peut s'y atteler

Perso, je n'ai pas de temps en ce moment.

Je vais par contre tenter de décrire l'utilité d'une fonction native qui remplacerai ma formule.
Je transfère le sujet sur Discuss pour ne pas charger user

A+

Et encore merci à tous

Dommage…
Lucien

Samuel, j'ai pas mieux comme solution. Désolé.

C'est pas grave au moins j'ai une solution qui fonctionne pour OOo et LibO.

Par contre je n'ai pas le moyen de tester sur une version MS Excel.

Est-ce que quelqu'un sait (ou peut tester pour voir) si ma formule y fonctionne ?

Bon surf,
Christian

Samuel

Bonjour

En complément des réponses déjà données...

[...]

Tu peux simplifier en remplaçant maintenant()=maintenant() par ALEA() qui
provoquera également le recalcul.

J'y avait pensé mais deux raisons m'ont fait préféré maintenant() :
1) même si c'est fort peu probable, ALEA() peut je crois renvoyer un 0 (strict) qui équivaudrait à un FALSE au lieu d'un TRUE.
   il faudrait donc mettre 1 + ALEA pour être sûr d'avoir un TRUE qui ne falsifierait pas ma formule.

2) De plus je suis partie de la supposition que pour la majorité des architectures, il est toujours plus simple "en interne" de retourner une valeur qui existe déjà dans un registre mémoire (la date courante) que de faire appel à une fonction aleatoire qui sont souvent gourmande (hormis puce avec générateur intégré).

Le classeur joint reprend ces différents points :
http://nabble.documentfoundation.org/file/n3120572/IsDate.ods IsDate.ods

J'ai étudié ton code vb, qui me parait intéressant
Je pense que l'on pourra se servir d'un code de ce type si l'on veut implémenter une fonction ESTDATEBIENFORMATE(...;...;[...]) alias ISDATEWELLFORMATTED(...;...;[...])

Je transfère ce sujet sur Discuss pour ne pas encombré user

Cordialement
Pierre-Yves

Merci encore

A+

Samuel

Bonjour Samuel,

Bonjour,

J'ai eu besoin de la fonction est ESTDATE (équivalent de ESTNUM pour les dates) mais je ne l'ai pas trouvé.

Apparemment elle n'existe pas dans le tableur. J'ai donc tenté de réaliser une formule équivalente.

J'en suis arrivé à cela...

A1= cellule à tester
B2=ET(OU(TYPE(A1)=1;TYPE(A1)=8);CELLULE("FORMAT";A1)>="D1";CELLULE("FORMAT";A1)<="D5";MAINTENANT()=MAINTENANT())

Cette formule retourne true ou false si la cellule testée est une date
(saisie ou calculé par formule mais pas une chaine de caractère)
dont la valeur numérique est bien mis en forme avec au minimum l'affichage du mois et de l'année ou du mois et du jour (ex. 11/2010 ou 31/12)

Remarque : Cette formule ne prend pas en compte les mises en forme personnalisées qui renverraient bien ces informations mais dans un format "G" (tout les autres formats) (voir l'aide de CELLULE("FORMAT";A1)

Remarque 2 : On peut vouloir imposer la présence des valeurs JOUR MOIS et ANNEE en mettant non pas une fourchette allant de D1 à D5 mais en mettant D1 OU D4.

J'avais bien trouvé sur internet NON(ESTERREUR(ANNEE(A1))), mais je pouvais avoir n'importe qu'elle valeur numérique qui semblait être une valeur date valide.
Je n'ai pas réussi à utiliser DATEVAL() avec autre chose que des chaines de caractère en paramètres.

Qu'en pensez vous, est-ce la meilleure solution ?

N'existe-il pas plus simple... ?

Est-ce compatible avec les tableurs concurrent (j'en doute un peu) ?

A noter : J'ai mis le maintenant()=maintenant() pour forcer la réévaluation systématique de la fonction cellule à chaque mise à jour du tableau (même le F9 n'agit sans ça).

A+

Samuel Mounier

J'ai suivi ce fil avec intérêt. Mais au départ, pourquoi veux tu tester si c'est une date ??
Si c'est une formule alors, facile que ce soit une date. Et verrouillage de la cellule.
Si c'est de la saisie, pourquoi ne pas bloquer la saisir avec la validation de données ?
Si c'est de la récupération de données... Alors, tu as ta fonction :wink:

Marie jo

Bonjour Marie Jo,

Dans le fichier qui m'a fait soulevé le problème les données sont déjà saisie (ce n'est pas moi qui ai réalisé ce tableau).
Et apparemment les utilisateurs mettent parfois un peu n'importe quoi dans les colonnes ou devraient apparaitre normalement une date (genre "voir Dupont" ou "rappeler au ...").

Si l'on veut obliger la saisie d'une date, il est effectivement possible d'utiliser la validation de données.

Cependant c'est faisable seulement si :
- le nombre de ligne est limité et connue au départ.
   (j'aime pas faire un truc du genre j'en met 300 ça devrait suffire et mettre la validation jusqu'en bas ça fait un peu gonfler les fichiers)

- Je ne veux pas conserver la liberté aux users de saisir des informations "présaisie",

C'est pour cela que j'ai trouvé plus judicieux de détecter si la donnée est une date bien formaté car
dans ce cas je l'utilise dans les formules qui y font référence ou sinon je n'en fait rien.

Pour mon cas,

les formules qui utilise ces valeurs de ces cellules se font sur une comparaison de date soit unique (soit une fourchette) et là ça commence à faire des formules très très longues...
(bien sûr je peux décomposer mais...)

D'où à mon avis l'intérêt de cette nouvelle fonction qui simplifierai pas mal ce genre de problématique.

Samuel

Bonjour

Samuel Mounier (Liste CGO) wrote:

...
(j'aime pas faire un truc du genre j'en met 300 ça devrait suffire et
mettre la validation jusqu'en bas ça fait un
peu gonfler les fichiers)
...
les formules qui utilise ces valeurs de ces cellules se font sur une
comparaison de date soit unique (soit une
fourchette) et là ça commence à faire des formules très très longues...

Ceci (gonflement et formules longues) peut ne pas se produire : il suffit de
définir la fonction comme un nom utilisateur travaillant sur une plage.

Dans l'exemple joint j'ai défini le nom "Pys" via Insertion> Nom> Définir>
assigné à $Feuille1.$A$1:$A$10
J'ai par ailleurs assigné au nom ESTDATE ta formule dans laquelle il suffit
de remplacer A1 par le nom créé ci-dessus afin que la formule travaille sur
la plage.

http://nabble.documentfoundation.org/file/n3145530/ESTDATE.ods ESTDATE.ods

Cordialement
Pierre-Yves

Bonjour Pierre-Yves,

C'est solution est élégante, et c'est claire que ça simplifie.

Je ne pensait pas que les références matricielles étaient prise en compte comme cela par la fonction TYPE ou CELLULE.

Par contre il faudra :
1) que je me souvienne que pour changer le paramétrage des formats à prendre en compte,
    il faut aller dans Insérer > Nom > Définir
2) Et que mes users sachent que lorsqu'ils veulent ajouter plus de ligne, ils devront corriger par ce même menu
    la référence matricielle définissant ou se trouve mes dates.

Par contre j'ai noté une Err:502 avec un cellule vide sur ton fichier dans certain cas, si on utilise TYPE.
Pour l'éliminer, j'ai ajouté à la formule : SI(ESTVIDE(Pys);FALSE;[le reste])

Hormis le 0 au lieu du FALSE (corrigible par un format forcé).

Cette solution m'a l'aire propre

Merci

A+

Samuel