XL 2016 fonction Cdate dans VBA

F22Raptor

XLDnaute Impliqué
Hello
Je récupère un fichier Excel dans lequel est codée une date, mais en texte, pas en format date.
On lit par exemple en A1 : 3/10/2019 pour le 3 octobre mais c'est du texte, si bien qu'en VBA je ne peux pas la comparer à une date du jour.

Je passe donc par CDate(Range(”A1”)) et je colle le résultat dans ma feuille, et c'est ... le 10-mars-2019 !!!
Il l'a lue à l'anglaise !
Y a t il un paramètre utilisable avec CDate pour lui dire que c'est bien du JMA et pas MJA ?

Merci !
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour

As-tu essayé d'utiliser Données/Convertir ?
(manuellement ou en VBA les deux fonctionnent)
Un exemple de macro
VB:
Sub mTxtCol()
Range("A1").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, FieldInfo:=Array(1, 4)
End Sub

EDITION: Bonsoir job75, pas rafraichi, pas vu ton message.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonsoir
et oui une colonne au format texte avec des date format non répertoriés ca ne peut que convertir

et puis Cdate est loin d'etre sur jouant avec les dates souvent j'ai pu m'en rendre compte plus d'une fois
heureusement il y a une petite sœur a cette fonction qui elle interprète plus facilement une date en string
et c'est peu de le dire !!!
je veux parler bien sur de "DateValue"


a oui elle est très bien
demo
VB:
Sub test()
[B1] = DateValue([A1])
[B2] = DateValue("3/10/2019")
[B3] = DateValue("3/octobre/2019")
[B4] = DateValue("2019/octobre/3")
[B5] = DateValue("3/octobre/19")
End Sub
demo2.gif


allez j'en rajoute une
Code:
[B6] = DateValue("3/Oct./19")

hein qu'elle est bien ;)
 

patricktoulon

XLDnaute Barbatruc
Bonjour
par curiosité a tu vérifié si dans la barre de formule la date était pareille
si c'est le cas ca veut dire que c'est toi qui interprète la date comme elle n'est pas est que la date inscrite est bien le 10 mars xxxx

au quel cas pour être sur
=datevalue([A1].text)
la propriété ".text" te donne ce que tu vois et non le ".value" ou ".formula"
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Issue de l'aide de VBA
VB:
Sub exemple_Aide_VBA()
'Cdate, fonction, exemple
'Cet exemple utilise la fonction CDate pour convertir une chaîne en Date.
'En règle générale, il n'est pas recommandé de programmer les dates
'et les heures sous la forme de chaînes développées
'(comme dans cet exemple).
'Utilisez plutôt des littéraux date et heure tels que #2/12/1969# et #4:45:23 PM#.
Dim MyDate, MyShortDate, MyTime, MyShortTime
MyDate = "12 février 1969"    ' Définit la date.
MyShortDate = CDate(MyDate)    ' Convertit en type Date.
MsgBox MyShortDate, vbExclamation, "ajout staple"
MyTime = "4:35:47 PM"    ' Définit l'heure.
MyShortTime = CDate(MyTime)    ' Convertit en type Date.
MsgBox MyShortTime, vbExclamation, "ajout staple"
End Sub
J'ai donc suivi le conseil de microsoft et O surprise ;)
VB:
Sub test()
Dim D
Dim DD
Dim a$
D = #3/10/2019#
DD = #10/3/2019#
a = D & " <-D" & Chr(13)
a = a & DD & " <-DD" & Chr(13)
a = a & Format(D, "dddd dd mmmm") & " <-D" & Chr(13)
a = a & Format(DD, "dddd dd mmmm") & " <-DD" & Chr(13)
a = a & DateValue(CStr(D)) & " A" & " <-D" & Chr(13)
a = a & DateValue(CStr(DD)) & " A" & " <-DD"
MsgBox a, vbExclamation, "D=3/10/2019 & DD=10/03/2019... mais VBA dit autre chose"
End Sub
Il semble me souvenir que Cdate convertit en se basant sur les paramètres régionnaux de Windows
(Et l'inversion mois/date avec CDATE est un sujet récurrent sur G..gle et ailleurs)
 

patricktoulon

XLDnaute Barbatruc
re
re
Staple1600
si je ne me trompe pas l'encadrement par les diezes font de la chaîne interprété par vba un numéro de série de date il n'y a donc pas de soucis non?

en plus je crois me souvenir que pour format(d,"......") si d est un string il inverse
après l'aide n'a pas changé pour certaines fonctions depuis 2003 alors en prendre et en laisser comme on dit
ce qui est sur c'est q'un string de date sera mieux interprété converti avec datevalue que le reste elle est conçue pour ca
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

patricktoulon
Bah si justement, avec la macro test, on constate bien l'inversion, non ?
Si je définis D comme le 3 octobre et DD comme le 10 mars, c'est le monde à l'envers ;)

PS: Mon précédent message était purement à caractère illustrafif et ou informatif ;)
 

patricktoulon

XLDnaute Barbatruc
ben oui c'est normal
a la base MS est Americain mm/dd/yyyy
les fonction sont francisées dans les versions francaises mais pas le string un string est un string les fonctions ne peuvent donc pas fonctionner
quand tu injecte dans la fonction format

dans format tu injecte le string d'une date mais aussi en tant que date date sinon walouh !!!!

la tienne avec cdate donc date injecté dans format
ca fonctionne très bien
VB:
Sub test()
Dim D
Dim DD
Dim a$
D = CDate("3/10/2019")
DD = CDate("10/3/2019")

a = D & " <-D" & Chr(13)
a = a & DD & " <-DD" & Chr(13)
a = a & Format(D, "dddd dd mmmm") & " <-D" & Chr(13)
a = a & Format(DD, "dddd dd mmmm") & " <-DD" & Chr(13)
a = a & DateValue(CStr(D)) & " A" & " <-D" & Chr(13)
a = a & DateValue(CStr(DD)) & " A" & " <-DD"
MsgBox a, vbExclamation, "D=3/10/2019 & DD=10/03/2019... mais VBA dit autre chose"
End Sub

pour le problème de notre ami
il a envoyé un STRING!!!! de date en A1 formaté en texte ben a tout les coup vba va inverser
autrement dit tu a "3/10/2019" inscrit dans la cellule mais excel converti en US puisque pas de précision (string ou date)

pour quoi je dis toujours de formater les cellules AVANT !!! D'INJECTER UNE DATE et je dis bien injecter une date pas le string de celle ci
voila pourquoi j'ai demandé de regarder dans la barre de formule en sélectionnant la cellule voir si il y avait pas déjà inversion excel

donc vba inverse le string mais excel aussi et plutôt 2 fois qu'une
je sais c'est un truc dingue
c'est pour cela que j'ai mes à priori sur certaines fonctions Dates
les seules en qui je fait confiance c'est datevalue , dateserial , timevalue le reste par exemple cdate c'est juste pour tester la validité de la structure de chaine("xx/xx/xxxx" ou un des 3 format gérée nativement par vba) et non la validité de la date même si sur certains pc ça fonctionne
c'est mon point de vue en tout cas

edit
sans parler que office en dessous de 1901 gere tres mal

un exemple (bon d'accords il fallait aller la chercher celle la ;) )
Code:
Sub test2()
MsgBox IsDate("29/02/0004") 'vrai alors que faux les années bissextiles commencent en 104 after petit bébé tout rose 
MsgBox Year(CDate("29/02/0004")) 'réponse fausse car de toute manière ca n'est pas une date valide
MsgBox Month(CDate("29/02/0004")) 'réponse fausse car de toute manière ca n'est pas une date valide
MsgBox IsDate("29/13/0004") 'donne faux donc réponse correcte

'encore plus rigolo  du au calcul interne
MsgBox Year(DateSerial(2019, 15, 1))

End Sub

et j'en ai d'autre comme ça
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

[aparté]
En résumé trop de string tue le string ;)
[/aparté]
Ceci dit la piste que je préconisais Données/Convertir évite bien des ecueils ;)
Et elle a l'avantage de permettre de donner un peu de tendresse à sa souris (en la caressant un tant soit peu)
et/ou d'exercer sa mémoire et de partiquer l'art du raccourci-clavier
ALT+D ALT+N ALT+S ALT+S ALT+D ALT+T
(fonctionne sur Excel 2003, la séquence pourrait être différente dans les versions supérieures)
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Si l'on veut qu'il y ait parfaite cohérence entre le VBA et la feuille de calcul il faut utiliser la fonction Excel DATEVAL.

Même si du coup la date du 29/02/1900 est valide bien que l'année 1900 ne soit pas bissextile (erreur Microsoft bien connue).

Voyez le fichier (2) avec cette macro :
VB:
Sub Convertir()
Dim c As Range
For Each c In [A1].CurrentRegion.Columns(1).Cells
    c(1, 2) = "=IFERROR(DATEVALUE(" & c.Address & "),""N/C"")" 'fonction DATEVAL
    c(1, 2) = c(1, 2)
Next
End Sub
A+
 

Pièces jointes

  • Dates(2).xlsm
    16 KB · Affichages: 12

patricktoulon

XLDnaute Barbatruc
re
@job 75
je suis plutôt friand de l'utilisation de formule en VBA avec ou sans evaluate pour le sport dans la syntaxe ;)
mais la dans le cas pressent ...ben non
en vba l'erreur peut être géré avec la même en vba (datevalue)

VB:
Option Explicit
Sub Convertir()
    Dim c As Range
    For Each c In [A1].CurrentRegion.Columns(1).Cells
        c(1, 2) = "=IFERROR(DATEVALUE(" & c.Address & "),""N/C"")"    'fonction DATEVAL
        c(1, 2) = c(1, 2)
    Next
End Sub
Sub Convertir2()
    Dim c As Range
    For Each c In [A1].CurrentRegion.Columns(1).Cells
        On Error Resume Next
        c(1, 2) = "N/C"
        c(1, 2) = DateValue(c.Text)
        On Error GoTo 0
        '"=IFERROR(DATEVALUE(" & c.Address & "),""N/C"")" 'fonction DATEVAL
        'c(1, 2) = c(1, 2)
    Next
End Sub
en vba le 29 février 1900 ne passe pas ,avec la formule ça passe
 

JBARBE

XLDnaute Barbatruc
Bonsoir à tous,
Puisque nous somme dans les dates, permettez moi d'y apporter ma contribution dans les formats qui a été commencé ici :

Le résultat de ces explications sont fournies par le bouquin Excel VBA 2003 de Micro Application !


Bonne soirée !
dates.jpg
 

Discussions similaires

Statistiques des forums

Discussions
312 079
Messages
2 085 131
Membres
102 789
dernier inscrit
raoul6768