[Excel 2013] Petit souci de date....

10 réponses
Avatar
ThierryP
Bonjour le forum ou ce qu'il en reste !!

Je gal=C3=A8re un peu (beaucoup) avec un souci r=C3=A9current : le formatag=
e des dates dans Excel !!

Je traite un fichier qui contient des dates au format : jj.mm.aaaa

Pour que ma macro fonctionne, je dois transformer ces dates en jj/mm/aaaa.
Jusque l=C3=A0, tout va bien.

Mais o=C3=B9 cela se g=C3=A2te, c'est que Excel prend le format am=C3=A9ric=
ain (m=C3=AAme si j'ai format=C3=A9 ma cellule en date) et donc le 04.02.20=
19 devient le 02/04/2019.... et mes diverses tentatives avec VBA ne donnent=
rien.

Merci d'avance !

ThierryP

10 réponses

Avatar
MichD
Le 22/08/19 à 05:23, ThierryP a écrit :
Bonjour le forum ou ce qu'il en reste !!
Je galère un peu (beaucoup) avec un souci récurrent : le formatage des dates dans Excel !!
Je traite un fichier qui contient des dates au format : jj.mm.aaaa
Pour que ma macro fonctionne, je dois transformer ces dates en jj/mm/aaaa.
Jusque là, tout va bien.
Mais où cela se gâte, c'est que Excel prend le format américain (même si j'ai formaté ma cellule en date) et donc le 04.02.2019 devient le 02/04/2019.... et mes diverses tentatives avec VBA ne donnent rien.
Merci d'avance !
ThierryP

Bonjour,
3 manières de procéder :
Lorsque l'on utilise une variable de type "Date", cette dernière utilise
toujours le format court de date défini dans les paramètres du panneau
de configuration de Windows.
'------------------------------
Sub test()
Dim D As Date
D = Date
Range("A1") = D
End Sub
'------------------------------
Sub test1()
Range("A2") = DateSerial(2019, 8, 22)
End Sub
'------------------------------
Sub test2()
Range("A4") = DateValue("2019/08/22")
End Sub
'------------------------------
MichD
Avatar
ThierryP
Bonjour Denis,
Merci pour ton retour !!!
Il semble que tu sois le dernier gourou à fréquenter ce forum...
Je m'en suis tiré en faisant ceci :
With Range("B:B")
.NumberFormat = "mm/dd/yyyy;@"
.Replace ".", "/"
End With
Il semble que cela fonctionne.... mais pourrait-il y avoir un piège qu e je ne connais pas ?
ThierryP
Avatar
MichD
Le 22/08/19 à 07:37, ThierryP a écrit :
Bonjour Denis,
Merci pour ton retour !!!
Il semble que tu sois le dernier gourou à fréquenter ce forum...
Je m'en suis tiré en faisant ceci :
With Range("B:B")
.NumberFormat = "mm/dd/yyyy;@"
.Replace ".", "/"
End With
Il semble que cela fonctionne.... mais pourrait-il y avoir un piège que je ne connais pas ?
ThierryP

La propriété "NumberFormat" attribue à une cellule un format de date. Si
tu n'es pas certain que la cellule est au format standard, c'est une
manière de s'assure du format de la cellule. De plus, tu peux donner à
la cellule plusieurs formats de date qu'Excel sait reconnaître. Dans un
deuxième temps, tu entres la valeur date que tu veux.
With Range("B:B")
.NumberFormat = "mm/dd/yyyy"
.Value = LaDate
End with
si j'écris une date "02/03/06" comme cela, est-ce que tu sais de quelle
date il s'agit ? Je peux faire référence au 2 mars 2006, 3 février 2006
ou 6 mars 2003. Si tu ne connais pas le format date que j'utilise, cela
laisse plage à interprétation. En vba, c'est la même chose. Par défaut,
en vba, tout est au format américain par défaut. Si tu as une chaîne de
caractère qui représente une date, tu dois lui spécifier le format date
que tu utilises pour qu'il puisse "comprendre" ce à quoi tu fais référence.
Je t'ai donné 3 manières différentes afin de t'assurer qu'Excel
interprète bien la date que tu lui donnes en VBA.
Quand tu donnes à VBA la clé (format date auquel tu fais référence) pour
la chaîne de caractère représentant une "Date", lorsque tu renvoies
cette date dans une cellule au format "STANDARD", Excel va adapter la
date selon le format par défaut défini dans le système d'exploitation de
Windows. Si tu veux obtenir un format date particulier, tu utilises
alors "NumberFormat". Cette propriété est aussi importante à définir si
la cellule n'est pas au format standard ou a un format différent de
celui que tu veux obtenir.
L'utilisation du point dans une date "04.02.2019" n'est pas standard à
tout le monde. Que va-t-il se passer si un autre usager devait ouvrir
ton fichier ayant un autre format de date par défaut dans le panneau de
configuration de Windows?
MichD
Avatar
MichD
Le 22/08/19 à 08:58, ThierryP a écrit :
Merci pour les explications ! Toujours aussi pédagogue :-)
Justement le point vient d'un fichier exporté par une application métier, c'est pour cela que je dois transformer ces dates en un format reconnu !
ThierryP
Le jeudi 22 août 2019 14:32:45 UTC+2, MichD a écrit :

Je ne peux pas t'en dire plus. Peux-tu publier le fichier en retenant
seulement les dates du fichier dans leur format actuel. Définis le
traitement que tu veux apporter à ces dates. Je ne peux pas deviner la
nature du problème avec les informations partielles que tu donnes.
Pour la publication, utilise cette adresse : Cjoint.com et retourne-nous
l'adresse obtenue ici.
MichD
Avatar
ThierryP
Tout va bien Denis !!
Tes explications m'ont largement suffi à me dépêtrer de mon problème !
Encore merci,
ThierryP
Avatar
MichD
Le 22/08/19 à 08:58, ThierryP a écrit :
Merci pour les explications ! Toujours aussi pédagogue :-)
Justement le point vient d'un fichier exporté par une application métier, c'est pour cela que je dois transformer ces dates en un format reconnu !
ThierryP
Le jeudi 22 août 2019 14:32:45 UTC+2, MichD a écrit :

Ok je viens de comprendre :
Tu as ceci dans des cellules d'un fichier, des dates se présentant de
cette manière : 04.02.2019. À l'aide tu désires les transformer...
Si la colonne B ne contient 50 lignes, évite d'utiliser la colonne
complète dans des procédures, car dans certains cas, tu risques
d'accroître le poids du fichier inutilement, et le temps de traitement.
Suppose que tu as ces dates en B1:B6, sauf erreur, ta manière de
procéder ne traite pas adéquatement les dates ayant un astérisque, ces
dernières s'affichent toujours à gauche après traitement. Elles
devraient toutes être à droite.
04.02.2019
13.02.2020 *
04.13.2021
04.02.2022
19.02.2020 *
20.02.2020 *
Pour les transformer en date réelle avec le format désigné:
'----------------------------------
Sub test()
Dim X(), T(), A as Long
With Range("B1:B6") 'à adapter
X = .Value
For Each elt In X
a = a + 1
ReDim Preserve T(1 To a)
T(a) = Replace(elt, ".", "/")
Next
.Value = ""
.NumberFormat = "dd/MM/yyyy"
.Value = T
End With
End Sub
'----------------------------------
MichD
Avatar
MichD
Le 22/08/19 à 10:00, MichD a écrit :
À l'aide

... À l'aide de VBA ...
MichD
Avatar
ThierryP
... Non, à l'aide de MichD !!!!!!!!
Finalement, je me suis servi de dateserial en bouclant sur la plage !
ActiveCell = DateSerial(Right(ActiveCell, 4), Mid(ActiveCell, 4, 2), Left(ActiveCell, 2))
ActiveCell.Offset(0, 2) = DateSerial(Right(ActiveCell.Offset(0, 2), 4 ), Mid(ActiveCell.Offset(0, 2), 4, 2), Left(ActiveCell.Offset(0, 2), 2))
Et tout se passe pour le mieux !
ThierryP
Le 22/08/19 à 10:00, MichD a écrit :
À l'aide

... À l'aide de VBA ...
MichD
Avatar
MichD
Le 22/08/19 à 10:43, ThierryP a écrit :
... Non, à l'aide de MichD !!!!!!!!
Finalement, je me suis servi de dateserial en bouclant sur la plage !
ActiveCell = DateSerial(Right(ActiveCell, 4), Mid(ActiveCell, 4, 2), Left(ActiveCell, 2))
ActiveCell.Offset(0, 2) = DateSerial(Right(ActiveCell.Offset(0, 2), 4), Mid(ActiveCell.Offset(0, 2), 4, 2), Left(ActiveCell.Offset(0, 2), 2))
Et tout se passe pour le mieux !
ThierryP
Le 22/08/19 à 10:00, MichD a écrit :
À l'aide

... À l'aide de VBA ...
MichD


Si l'objectif est seulement de modifier le séparateur de date "." pour
"./" sachant que le format de ces dates est JJ/MM/AAAA, cette formule,
fonctionne très bien, de même que la tienne...
Si tu veux boucler sur chacune des cellules :
'----------------------
Sub Test1()
Dim Rg As Range, C As Range
Set Rg = Range("A1:A6")
For Each C In Rg
C.Value = DateValue(Application.Substitute(C, ".", "/"))
Next
Rg.NumberFormat = "DD/MM/YYYY"
End Sub
'----------------------
MichD
Avatar
ThierryP
Infatigable Denis !!!
Merci pour cette autre approche !
ThierryP
'----------------------
Sub Test1()
Dim Rg As Range, C As Range
Set Rg = Range("A1:A6")
For Each C In Rg
C.Value = DateValue(Application.Substitute(C, ".", "/"))
Next
Rg.NumberFormat = "DD/MM/YYYY"
End Sub
'----------------------
MichD