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

8 réponses

1 2
Avatar
Jacky
Ok, je retiens donc....
MsgBox CDate(CDbl("0,4"))


Bonne soirée à tous
JJ

"michdenis" a écrit dans le message de
news:
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





Avatar
Daniel
Si vous le permettez, aucune solution de fonctionne dans mon contexte.
La valeur du combobox étant choisie dans une liste de dates, il s'agit de
faire apparaitre un nombre formaté "date" dans la fenêtre du combobox :

Private Sub ComboBox1_Change()
ComboBox1.Value = CDate(CDbl(ComboBox1.Value))
End Sub

L'exécution de cette macro la redéclenche puisque la valeur de
ComboBox1.Value a changé. Et il y a plantage en "incompatibilité de type"
sur la seconde exécution.
Daniel
"michdenis" a écrit dans le message de news:

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





Avatar
michdenis
Bonjour Daniel,

Un fichier exemple là : http://cjoint.com/?cyvY4b7LeA

P.S. La propriété RowSource du combobox n'est pas utilisé !


Salutations!



"Daniel" a écrit dans le message de news: %
Si vous le permettez, aucune solution de fonctionne dans mon contexte.
La valeur du combobox étant choisie dans une liste de dates, il s'agit de
faire apparaitre un nombre formaté "date" dans la fenêtre du combobox :

Private Sub ComboBox1_Change()
ComboBox1.Value = CDate(CDbl(ComboBox1.Value))
End Sub

L'exécution de cette macro la redéclenche puisque la valeur de
ComboBox1.Value a changé. Et il y a plantage en "incompatibilité de type"
sur la seconde exécution.
Daniel
"michdenis" a écrit dans le message de news:

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





Avatar
Daniel
Merci.
Mais dans mon cas, c'était "listfillrange" qui est utilisé. Ca peut se
changer, toutefois. Ou alors renseigner les heures en format texte dans les
cellules, ça marche aussi.
Bonne soirée.
Daniel

"michdenis" a écrit dans le message de news:

Bonjour Daniel,

Un fichier exemple là : http://cjoint.com/?cyvY4b7LeA

P.S. La propriété RowSource du combobox n'est pas utilisé !


Salutations!



"Daniel" a écrit dans le message de news:
%
Si vous le permettez, aucune solution de fonctionne dans mon contexte.
La valeur du combobox étant choisie dans une liste de dates, il s'agit de
faire apparaitre un nombre formaté "date" dans la fenêtre du combobox :

Private Sub ComboBox1_Change()
ComboBox1.Value = CDate(CDbl(ComboBox1.Value))
End Sub

L'exécution de cette macro la redéclenche puisque la valeur de
ComboBox1.Value a changé. Et il y a plantage en "incompatibilité de type"
sur la seconde exécution.
Daniel
"michdenis" a écrit dans le message de news:

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










Avatar
AV
| 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.

Objection votre Honneur !

MsgBox CDate("0.4" + 0)
MsgBox CDate("0,4" + 0)

Si le symbole décimal système est le point, les 2 syntaxes sont sans soucis quel
que soit le symbole décimal choisi dans l'application (possiblité de
différencier système et application après XL200)
C'est toujours le choix de la virgule comme séparateur décimal qui pose problème
!

AV
Avatar
michdenis
Bonjour AV,


| 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.

Ce qui précède était pour appuyer le choix que j'avais fait
MsgBox CDate(CDbl("0,4"))
En fait, pour utiliser une fonction de conversion, la chaîne
doit avoir le séparateur décimale définit dans le panneau de
configuration de Windows. Cela demeure vrai nonobstant
l'option "internationale" utilisée (version excel 2002 et 2003)
de la feuille de calcul.

Évidemment, les "dates" font toujours les choses un peu différemment.
Avec la virgule comme séparateur décimale -> panneau de configuration

Voici 2 opérations différentes :
Si on multiplie par 1 la date trouvé par CDate("0,4")
MsgBox CDate("0,4") * 1 -> 36617 -> 01-04-2000

MsgBox CDate("0,4" + 0) ' = 9:36:00

Et pour ajouter à ce qui précède, j'ai modifié la "langue" du panneau de
configuration pour Anglais - US et j'ai obtenu ce qui suit nonobstant
le séparateur décimale

MsgBox CDate("0.4") ' = 12:04:04 AM
MsgBox Format(CDate("0,4" + 0), "MMMM DD YYYY H:MM:ss") '= January 3 1900 00:00:00
MsgBox CDate("0,4" + 0) ' = 9:36:00

Je n'ai jamais prétendu que ta méthode MsgBox CDate("0,4" + 0) ne fonctionnait
pas, mais je demeure perplexe sur la manière que vba interprète le contenu entre
les parenthèses pour la transformer! Si tu connais comment VBA résout
la donne, je serais bien heureux de lire tes commentaires sur le sujet.

MsgBox CDate(CDbl("0,4"))
L'utilisation de cette syntaxe est pour moi, plus simple au niveau de la
compréhension... de la logique (cdbl transforme d'avoir la chaîne en valeur numérique
pour par la suite extraire la date) et de ce que je connais comme "règle général"
en programmation dans le maniement des variables !


Salutations!
Avatar
AV
| MsgBox CDate("0,4") * 1 -> 36617 -> 01-04-2000

La chaine n'a pas été converti en numérique (le * 1 hors parenthèses, n'a aucune
incidence sur le résultat), CDate interprète la "décimale" comme séparateur de
date

| MsgBox CDate("0,4" + 0) ' = 9:36:00

La chaine a pas été converti en numérique par l'opération + 0, CDate interprète
correctement la valeur

AV
Avatar
AV
|| MsgBox CDate("0,4" + 0) ' = 9:36:00
| La chaine a pas été converti en numérique par l'opération + 0, CDate
interprète
| correctement la valeur

Pfff... Les bonheurs des copier/coller !
Il faut évidemment enlever le "pas"

AV
1 2