Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comportement bizarre de CDate

18 réponses
Avatar
Daniel
Bonjour.
J'ouvre un nouveau fil pour résumer celui intitulé "Combobox"
Considérons la macro suivante :
Sub test()
MsgBox CDate("0.4")
MsgBox CDate("0.43")
MsgBox CDate("0.431")
End Sub
La première ligne donne 00:04:00, la seconde 00:43:00
Et la troisième 10:20:38 !!
La logique : je ne peux pas fourrer 431 dans les minutes, alors,
j'interprète 0.431 comme une date à part entière.
Bizzare non ?
Cordialement.
Daniel

10 réponses

1 2
Avatar
isabelle
bonjour Daniel,

CDate Date Toute expression de date valide.

Les dates sont stockées sous la forme d'une partie d'un nombre réel.
Les valeurs situées à gauche du séparateur décimal représentent la date,
tandis que celles situées à sa droite représentent l'heure.
Les valeurs négatives correspondent à des dates antérieures au 30 décembre 1899.

essaie comme ça,

Sub test()
a = 0.4
b = 0.43
c = 0.431
MsgBox CDate(a)
MsgBox CDate(b)
MsgBox CDate(c)
End Sub

isabelle


Bonjour.
J'ouvre un nouveau fil pour résumer celui intitulé "Combobox"
Considérons la macro suivante :
Sub test()
MsgBox CDate("0.4")
MsgBox CDate("0.43")
MsgBox CDate("0.431")
End Sub
La première ligne donne 00:04:00, la seconde 00:43:00
Et la troisième 10:20:38 !!
La logique : je ne peux pas fourrer 431 dans les minutes, alors,
j'interprète 0.431 comme une date à part entière.
Bizzare non ?
Cordialement.
Daniel




Avatar
Daniel
Bonjour et merci pour tes explications. Ce que tu expliques, c'est la
manière dont les dates sont gérées. Ce que je conteste, c'est la méthode que
CDate utilise pour convertir des éléments string. A l'origine, il y a la
valeur d'un combobox (donc string). C'est la conversion de ce résultat qui
provoque les anomalies signalées.
Cordialement.
Daniel
"isabelle" a écrit dans le message de news:
%
bonjour Daniel,

CDate Date Toute expression de date valide.

Les dates sont stockées sous la forme d'une partie d'un nombre réel.
Les valeurs situées à gauche du séparateur décimal représentent la date,
tandis que celles situées à sa droite représentent l'heure.
Les valeurs négatives correspondent à des dates antérieures au 30 décembre
1899.

essaie comme ça,

Sub test()
a = 0.4
b = 0.43
c = 0.431
MsgBox CDate(a)
MsgBox CDate(b)
MsgBox CDate(c)
End Sub

isabelle


Bonjour.
J'ouvre un nouveau fil pour résumer celui intitulé "Combobox"
Considérons la macro suivante :
Sub test()
MsgBox CDate("0.4")
MsgBox CDate("0.43")
MsgBox CDate("0.431")
End Sub
La première ligne donne 00:04:00, la seconde 00:43:00
Et la troisième 10:20:38 !!
La logique : je ne peux pas fourrer 431 dans les minutes, alors,
j'interprète 0.431 comme une date à part entière.
Bizzare non ?
Cordialement.
Daniel




Avatar
isabelle
re bonjour Daniel,

la méthode : le calcul se fait à partir des décimals obtenu à chaque étape :

4/10 x 24 hrs = 9.6 6/10 x 60 min. = 36.0
43/100 x 24 hrs = 10.32 32/100 x 60 min. = 19.2 2/10 x 60 sec. = 12
431/1000 x 24 hrs = 10.344 344/1000 x 60 min. = 20.64 64/100 x 60 sec. = 38

on obtient donc :

9 hrs 36 min 0 sec
10 hrs 19 min 12 sec
10 hrs 20 min 38 sec

j'ai mis les formules dans ce fichier :
http://cjoint.com/?cys2MHCCfz

isabelle


Bonjour et merci pour tes explications. Ce que tu expliques, c'est la
manière dont les dates sont gérées. Ce que je conteste, c'est la méthode que
CDate utilise pour convertir des éléments string. A l'origine, il y a la
valeur d'un combobox (donc string). C'est la conversion de ce résultat qui
provoque les anomalies signalées.
Cordialement.
Daniel
"isabelle" a écrit dans le message de news:
%

bonjour Daniel,

CDate Date Toute expression de date valide.

Les dates sont stockées sous la forme d'une partie d'un nombre réel.
Les valeurs situées à gauche du séparateur décimal représentent la date,
tandis que celles situées à sa droite représentent l'heure.
Les valeurs négatives correspondent à des dates antérieures au 30 décembre
1899.

essaie comme ça,

Sub test()
a = 0.4
b = 0.43
c = 0.431
MsgBox CDate(a)
MsgBox CDate(b)
MsgBox CDate(c)
End Sub

isabelle



Bonjour.
J'ouvre un nouveau fil pour résumer celui intitulé "Combobox"
Considérons la macro suivante :
Sub test()
MsgBox CDate("0.4")
MsgBox CDate("0.43")
MsgBox CDate("0.431")
End Sub
La première ligne donne 00:04:00, la seconde 00:43:00
Et la troisième 10:20:38 !!
La logique : je ne peux pas fourrer 431 dans les minutes, alors,
j'interprète 0.431 comme une date à part entière.
Bizzare non ?
Cordialement.
Daniel









Avatar
isabelle
il faut transformer la valeur string en valeur numérique :

Sub test()
MsgBox CDate(Val("0.4"))
MsgBox CDate(Val("0.43"))
MsgBox CDate(Val("0.431"))
End Sub

isabelle


Bonjour et merci pour tes explications. Ce que tu expliques, c'est la
manière dont les dates sont gérées. Ce que je conteste, c'est la méthode que
CDate utilise pour convertir des éléments string. A l'origine, il y a la
valeur d'un combobox (donc string). C'est la conversion de ce résultat qui
provoque les anomalies signalées.
Cordialement.
Daniel
"isabelle" a écrit dans le message de news:
%

bonjour Daniel,

CDate Date Toute expression de date valide.

Les dates sont stockées sous la forme d'une partie d'un nombre réel.
Les valeurs situées à gauche du séparateur décimal représentent la date,
tandis que celles situées à sa droite représentent l'heure.
Les valeurs négatives correspondent à des dates antérieures au 30 décembre
1899.

essaie comme ça,

Sub test()
a = 0.4
b = 0.43
c = 0.431
MsgBox CDate(a)
MsgBox CDate(b)
MsgBox CDate(c)
End Sub

isabelle



Bonjour.
J'ouvre un nouveau fil pour résumer celui intitulé "Combobox"
Considérons la macro suivante :
Sub test()
MsgBox CDate("0.4")
MsgBox CDate("0.43")
MsgBox CDate("0.431")
End Sub
La première ligne donne 00:04:00, la seconde 00:43:00
Et la troisième 10:20:38 !!
La logique : je ne peux pas fourrer 431 dans les minutes, alors,
j'interprète 0.431 comme une date à part entière.
Bizzare non ?
Cordialement.
Daniel









Avatar
AV
.....c'est la méthode que
| CDate utilise pour convertir des éléments string.


| CDate utilise pour convertir des éléments string.

Faut convertir d'abord en numérique :

Sub test()
MsgBox CDate("0.4" * 1)
MsgBox CDate("0.43" * 1)
MsgBox CDate("0.431" * 1)
End Sub

AV

Avatar
michdenis
Bonjour Daniel,

Une date est une valeur numérique pour excel.
Habituellement, on fournit à la fonction "Cdate" une
"vraie date de type string : "12/08/2006" ou "9:41:46"
si tu veux lui passer directement une valeur numérique
il faut d'abord convertir la valeur de type string en valeur
numérique de type "double" dans le cas présent.

Essaie de cette façon :

Cdbl convertit d'abord la donnée entre guuillemets
en valeur numérique et CDate la convertit en HH:MM:SS

Les fonctions de conversion exige le même séparateur décimale
que celui définit dans le panneau de configuration Windows.
Moi c'est la virgule ... toi ? à adapter au besoin.

'--------------------
Sub test3()
MsgBox CDate(CDbl("0,4"))
MsgBox CDate(CDbl("0,43"))
MsgBox CDate(CDbl("0,431"))
End Sub
'--------------------

Et si tu voulais faire l'inverse :
conversion d'une donnée date en valeur numérique:

MsgBox CDbl(CDate("9:41:46"))



Salutations!



"Daniel" a écrit dans le message de news: %
Bonjour et merci pour tes explications. Ce que tu expliques, c'est la
manière dont les dates sont gérées. Ce que je conteste, c'est la méthode que
CDate utilise pour convertir des éléments string. A l'origine, il y a la
valeur d'un combobox (donc string). C'est la conversion de ce résultat qui
provoque les anomalies signalées.
Cordialement.
Daniel
"isabelle" a écrit dans le message de news:
%
bonjour Daniel,

CDate Date Toute expression de date valide.

Les dates sont stockées sous la forme d'une partie d'un nombre réel.
Les valeurs situées à gauche du séparateur décimal représentent la date,
tandis que celles situées à sa droite représentent l'heure.
Les valeurs négatives correspondent à des dates antérieures au 30 décembre
1899.

essaie comme ça,

Sub test()
a = 0.4
b = 0.43
c = 0.431
MsgBox CDate(a)
MsgBox CDate(b)
MsgBox CDate(c)
End Sub

isabelle


Bonjour.
J'ouvre un nouveau fil pour résumer celui intitulé "Combobox"
Considérons la macro suivante :
Sub test()
MsgBox CDate("0.4")
MsgBox CDate("0.43")
MsgBox CDate("0.431")
End Sub
La première ligne donne 00:04:00, la seconde 00:43:00
Et la troisième 10:20:38 !!
La logique : je ne peux pas fourrer 431 dans les minutes, alors,
j'interprète 0.431 comme une date à part entière.
Bizzare non ?
Cordialement.
Daniel




Avatar
Jacky
Bonsoir à tous

Déjà souvent confronté à ce genre de problème, voila maintenant 3 solutions.

Isabelle: MsgBox CDate(Val("0.4"))
Alain: MsgBox CDate("0.4" * 1)
Denis: MsgBox CDate(CDbl("0,4"))

Bien que le résultat soit le même, laquelle est la plus sûre ??
JJ
Avatar
AV
| Bien que le résultat soit le même, laquelle est la plus sûre ??

Celle-là :
MsgBox CDate("0.4" + 0)

;-)
AV
Avatar
Jacky
Re..
Non, mais sérieusement ??

JJ

"AV" a écrit dans le message de
news:u3$
| Bien que le résultat soit le même, laquelle est la plus sûre ??

Celle-là :
MsgBox CDate("0.4" + 0)

;-)
AV




Avatar
michdenis
Bonjour AV,

la question était celle-ci :

laquelle est la plus sûre ??
MsgBox CDate(CDbl("0,4"))

Et non laquelle est la plus courte ?
MsgBox CDate("0.4" + 0)

Et dans les 2 cas, le séparateur décimale doit être le même
que celui que l'on retrouve dans le panneau de configuration.

;-))


Salutations!


"AV" a écrit dans le message de news: u3$
| Bien que le résultat soit le même, laquelle est la plus sûre ??

Celle-là :
MsgBox CDate("0.4" + 0)

;-)
AV
1 2