Problème Date - inversion jour/mois

Bonjour,

Je fais face à un problème concernant le format d'une date lors d'une saisie dans un textbox.

Je m'explique... quand je saisis une date type 12/04/1972 dans mon textbox, cela affiche dans mon tableur 04/12/1972. Vous vous doutez bien que c'est problématique.

Alors je sais que VBA est "paramétré" au format US mais je n'arrive pas à trouver une parade... J'ai beau utiliser CDate ou DateSerial mais je n'y arrive pas.

Private Sub txtDateNaissance_Change()

   Dim Valeur As Byte
    txtDateNaissance.MaxLength = 10 'nb caractères maxi autorisés dans le textbox
   Valeur = Len(txtDateNaissance)
   If Valeur = 2 Or Valeur = 5 Then txtDateNaissance = txtDateNaissance & "/"

   End Sub 
   

Mais on est bien d'accord qu'avec ce code on inverse pas la saisie. J'ai essayé ce code :

Private Sub txtDateNaissance_Initialize()

    txtDateNaissance = CDate(txtDateNaissance.Value)

End Sub

Mais rien ne se passe...

Voici la suite du code qui me permet d'ajouter un personnel avec la date saisie :

Private Sub btnAjout_Click()

    If txtNom.Value = "" Then
        Else
        Dim Ligne As Integer
        If MsgBox("Confirmez-vous l'ajout des données?", vbYesNo + vbQuestion, "Ajout de personnel") = vbYes Then
            MsgBox "Nouveau personnel ajouté", vbOKOnly + vbInformation, "CONFIRMATION"
            Worksheets("Source").Select
            Ligne = Sheets("Source").Range("A456541").End(xlUp).Row + 1
            Cells(Ligne, 1) = txtNom.Value
            Cells(Ligne, 2) = txtPrénom.Value
            Cells(Ligne, 3) = txtDateNaissance.Value
            Cells(Ligne, 4) = txtLieuNaissance.Value
            Cells(Ligne, 5) = txtSécuritéSociale.Value
            Cells(Ligne, 6) = txtEmbauche.Value
            Cells(Ligne, 7) = cboContrat.Value
            Cells(Ligne, 8) = cboService.Value
            Cells(Ligne, 9) = cboFonction.Value
            Cells(Ligne, 10) = cboCatégorie.Value
            Cells(Ligne, 11) = txtPorteur.Value
            Cells(Ligne, 12) = cboSygid.Value
            Cells(Ligne, 13) = cboFormationRadioprotection.Value
            Cells(Ligne, 14) = cboEtat.Value
            Cells(Ligne, 15) = txtVisiteMédicale.Value

        Else
        End If

Si vous avez une solution je suis preneur Bonne journée

Bonjour,

utilise

DateSerial(an,mois,jour)

avec

an = mid(tontexte,7,4)
mois = mid(tontexte,4,2)
jour = mid(tontexte,1,2)

je n'ai pas essayé mais c'est l'idée

Merci Steelson,

Mais le problème demeure...

Bonjour,

Coller cette fonction dans le code de ton Userform :

Private Function DLNG() As Date
Dim an%, mois%, jour%
an = Split(txtDateNaissance, "/")(2)
mois = Split(txtDateNaissance, "/")(1)
jour = Split(txtDateNaissance, "/")(0)
DLNG = CDate(DateSerial(an, mois, jour))
End Function

puis dans le btnAjout_Click remplacer :

Cells(Ligne, 3) = DLNG

A+

Bonjour galopin01

Il y a t'il obligation de changer le format de cellule en format Anglais (Etats-Unis) pour avoir une saisie jj/mm/aaaa et non mm/jj/aaaa ?

Bonjour,

ou alors au moment ou l'info est renvoyée dans la cellule excel :

Remplacer :

Cells(Ligne, 3) = txtDateNaissance.Value

par

Cells(Ligne, 3) = Format(txtDateNaissance.Value), "mm/dd/yyyy")

Cordialement.

Je ne comprend pas ta question...

Tu as un Excel 2016 FR avec un format de date Excel en français... Pourquoi veux tu le paramétrer en date anglaise.

Ma solution macro ne te satisfait pas ?

Une autre fois tu mets un classeur démo ça évitera de perdre notre temps en demi question et demi réponses...

A+

Bonjour, Salut à tous !

Ce problème de date est récurrent. Il faut garder en mémoire quelques éléments pour comprendre ce que l'on fait et réfléchir dans le bon ordre en la matière :

  • une date est un type de données particulier (type Date), aussi bien pour Excel que pour VBA ;
  • Excel (et également VBA) stocke les dates sous forme numérique, ce numéro (appelé numéro de série) est commun à Excel et VBA (pour Excel : calendrier 1900) à partir du 1er mars 1900 ; pour les dates antérieures à partir du 1er janvier 1900, décalage d'un jour entre les deux (bogue d'Excel qui considère le 29 février 1900, jour n'ayant en fait jamais existé) ; Excel n'identifie pas les dates antérieures à 1900, VBA si, jusqu'au 1er janvier 100 (en calendrier grégorien proleptique, c'est à dire comme si ce calendrier avait existé avant son adoption le 15 octobre 1582) ;
  • les heures sont traitées comme les dates, dans un numéro de série, la partie entière correspond à la date, la partie décimale à l'heure...
  • lors d'une saisie sur feuille de calcul, la date est saisie sous forme de texte, c'est Excel qui reconnaît ce texte comme date (à partir des caractéristiques de format figurant aux paramètres régionaux de Windows, et donc variables selon les pays), le convertit et met un format par défaut à la cellule si celle-ci n'en a pas de spécifique (est au format Standard) ;
  • VBA procède de même et convertit une expression en date, dès lors qu'il l'identifie comme telle, mais contrairement à Excel, sa reconnaissance se fait sur le format américain, ce qui provoque l'inversion jour/mois lorsque le jour est inférieur à 13, sauf si on le force à faire autrement...
  • une TextBox, son nom l'indique, ne contient que du texte, on peut lui affecter n'importe quelle donnée, dès lors qu'insérée dans la TextBox ce sera du texte (il en est de même de tous les contrôles Microsoft Forms qui accueillent des données) ;
  • la fonction Format produit aussi par définition du texte, on peut donc l'utiliser pour mettre un format particulier à une donnée numérique que l'on insère dans une TextBox, mais jamais pour une donnée extraite d'une TextBox et destinée à une cellule ;
  • lors de l'affectation à une cellule, il convient toujours de convertir une date extraite d'une TextBox en Date, au moyen de CDate ou de DateValue, ces fonctions ayant pour effet de contraindre VBA à opérer la reconnaissance de date en utilisant les paramètres régionaux de Windows ;
  • si l'on ne peut procéder à une affectation directe de la TextBox à la cellule, avec conversion (on le constatera en testant...), il reste la ressource d'opérer une conversion en entier long (type Long, fonction CLng), insusceptible d'être reconverti sauvagement par VBA ; dans ce cas, lors de l'affectation, il conviendra de doter la cellule du format de date voulu (si elle ne l'a pas déjà) car il ne sera pas automatique (se souvenir à cet égard, que le format d'affichage est l'affaire du format de cellule, en aucun cas de la fonction Format qui opérerait une conversion en texte...)

- il est aussi loisible pour faire saisir des dates dans un Userform d'utiliser un contrôle type calendrier, qui renverra une valeur de type Date ; à défaut on peut également n'utiliser une TextBox que pour l'affichage et la faire définir au moyen d'autres contrôles (ScrollBar, SpinButton...), en conservant le résultat affectable dans une variable.

En ne perdant pas de vue ces éléments lorsqu'on code en VBA, on rencontrera toujours les mêmes écueils entre VBA et Excel FR, mais on sera en mesure de les surmonter aisément !

Cordialement.

Merci Steelson,

Mais le problème demeure...

et pourtant :

432date-texte.xlsm (13.80 Ko)

ps : bonjour Maître ...

Bonjour, MFerrand.

Concernant ta longue affirmation ( cours sur les texbox inclu ) je ne suis pas du tout d'accord :

la fonction Format produit aussi par définition du texte, on peut donc l'utiliser pour mettre un format particulier à une donnée numérique que l'on insère dans une TextBox, mais jamais pour une donnée extraite d'une TextBox et destinée à une cellule ;

On peut renvoyer la date contenue dans une textbox directement vers une cellule excel.

J'ai de nombreuses "textboxs" dans un userform contenant des dates et au moment ou je valide l'alimentation des cellules

excel par le contenu des "textboxs" : La seule précision du format me permet de récupérer la date dans le format souhaité.

exemple :

Worksheets("FEUILLE1").Cells(1, 1).Value = Format(CDate(TextBox1.Value), "mm/dd/yyyy")

Tu pourrais vérifier si les réponses des autres ne fonctionnent pas avant de lancer des affirmations.

Cordialement.

J'ai de nombreuses "textboxs" dans un userform contenant des dates et au moment ou je valide l'alimentation des cellules

excel par le contenu des "textboxs" : La seule précision du format me permet de récupérer la date dans le format souhaité.

pourquoi cela ne fonctionne pas dans le topic que tu as posté alors ?

en tous les cas, ma solution fonctionnera toujours (idem celle proposée par galopin qui utilise le même procédé mais en splittant le texte -ce qui est plus original-)

Worksheets("FEUILLE1").Cells(1, 1).Value = Format(CDate(TextBox1.Value), "mm/dd/yyyy")

Xmenpl,

oui cela fonctionne, j'ai essayé les différentes solutions y compris CDate(TextBox1.Value)

mais pour répondre à ta première question, comme tu n'as pas posté de fichier excel, difficile à savoir pourquoi ...

hypothèse 1 :

vérifie que la zone d'affectation n'est pas en texte (car dans ce cas tu auras la date au format US)

hypothèse 2 (du reste en corollaire de la 1) :

le résultat est transmis à une zone texte du code VBA ... dans ce cas cela reste du texte et il faut donc triturer ce texte pour le remettre dans l'ordre voulu, le format n'a pas d'effet car txtDateNaissance n'est pas une Range mais une zone texte

essaie

Private Sub txtDateNaissance_Initialize()

txt = CDate(txtDateNaissance.Value)
an = Split(txt, "/")(2)
mois = Split(txt, "/")(1)
jour = Split(txt, "/")(0)
txtDateNaissance = jour & "/" & mois & "/" & an

End Sub

avec sans doute quelques réglages, mais l'idée est de re-ordonner les valeurs pour en faire en apparence une date bien que la zone est et restera en texte ici (encore une fois ce n'est pas une Range)

174date-texte.xlsm (15.75 Ko)

Bonjour, et salut à tous !

Tu pourrais vérifier si les réponses des autres ne fonctionnent pas avant de lancer des affirmations.

Merci pour la leçon ! Mais je ne t'ai pas attendu pour cela, et je vérifie tout autant mes propres réponses...

Je me permets de te faire d'ailleurs remarquer que je n'ai à aucun moment déclaré que les solutions proposées par Galopin ou Steelson ne fonctionnaient pas... parce qu'elles fonctionnent ! et font bien partie de l'arsenal de solutions utilisables.

L'objet de mon intervention était de faire comprendre à l'intéressé les raisons qui font que l'on rencontre des problèmes avec les dates, pourquoi certaines solutions fonctionnent à peu près dans tous les cas et d'autres seulement de façon aléatoire (apparemment car pas de hasard...)

La fonction Format n'est pas une solution, je le maintiens, car quand cela fonctionne en l'utilisant ce n'est pas dû à cette fonction, et elle peut au contraire faire dysfonctionner ce qui aurait fonctionné sans elle...

Format renvoie du texte (c'est dans sa définition) en appliquant un format à une donnée à caractère numérique. Elle est sans effet sur une donnée texte. Si ce qu'on lui soumet est une donnée Date, elle appliquera le format demandé et produira un texte formaté, non une Date. C'est avant et après son intervention que VBA est susceptible d'intervenir pour convertir... On ne verra pas grand chose si le format demandé est un format de date standard, son intervention sera tout à fait neutre, mais si le format n'est pas un format convertible on aura du texte non identifié comme date.

Et il faut noter aussi que lorsqu'il n'y a pas d'erreur lors de l'affectation, on peut être dans le cas général où la donnée affectée n'était pas susceptible de donner lieu à erreur !

On rencontre également le même type de problème (à un moindre degré certes) avec des données numériques qu'il faut parfois convertir au sortir de TextBox pour ne pas voir arriver du texte dans la cellule, particulièrement lorsqu'on utilise des formats monétaires.

Je n'oserais prétendre qu'en matière de dates j'ai réponse à tout et suis en mesure d'expliciter tous les cas rencontrés, il m'arrive encore de buter sur certains cas qui me paraissent énigmatiques, mais au fil des ans (rien ne se fait en un jour ! ) le nombre de cas explicables, réagissant conformément aux hypothèses d'explication s'avère nettement supérieur à ceux qui résistent encore...

Je t'encourage à multiplier les tests...

Cordialement.

Et bonne journée à tous.

Bonjour à tous,

Private Sub txtDateNaissance_Initialize()
    txtDateNaissance = CDate(txtDateNaissance.Value)
 End Sub

Mais rien ne se passe...

C'est quoi ça ?

Bien évidemment que toute les solutions proposées ne fonctionneront pas.

Un textbox, comme son nom l'indique, contient toujours un texte et tu reviens au problème de départ.

C'est lorsque tu écris dans la cellule qu'il faut convertir puisque c'est là que le soucis se produit :

Private Sub btnAjout_Click()
            '....
            Cells(Ligne, 3) = cdate(txtDateNaissance.Value)

eric

PS : je n'ai pas trouvé ta réponse à MFerrand très plaisante.

Quand on débute et qu'on a affaire à un helpeur avec 14000 posts on se la joue modeste et on y réfléchit à 2 fois avant de dire tu dis des c...ies

Bonjour et merci à tous !

J'ai essayé vos différentes techniques mais lorsque j'ai plusieurs dates à rentrer dans différentes textbox une erreur de débogage s'affiche.

Voici mon code en pièce jointe.

Merci par avance.

Bonjour,

Quelle erreur ? Et où ?

NB- Private Sub txtDateNaissance_initialize()

Private Sub txtEmbauche_Initialize()

Aucun évènement Initialize au niveau des contrôles. Ces procédures n'ont aucune chance de s'exécuter, et elles ne serviraient d'ailleurs à rien car l'insertion des valeurs de cellules en TextBox se fait sans difficulté...

Voir l'intervention d'Eric : C'est quoi ça ?

Cordialement.

Bonjour et merci à tous !

J'ai essayé vos différentes techniques mais lorsque j'ai plusieurs dates à rentrer dans différentes textbox une erreur de débogage s'affiche.

Voici mon code en pièce jointe.

Merci par avance.

Bonjour,

Tu veux sans doute dire : " Quand j'oublie de renseigner une des textbox contenant une date, alors une erreur débogage s'affiche."

Sinon il fonctionne dans l'état ou il est

Merci jeremy253 pour ce retour, ce code fonctionne donc correctement.

essaie

Private Sub txtDateNaissance_Initialize()

txt = CDate(txtDateNaissance.Value)
an = Split(txt, "/")(2)
mois = Split(txt, "/")(1)
jour = Split(txt, "/")(0)
txtDateNaissance = jour & "/" & mois & "/" & an

End Sub

Cela confirme du reste que l'erreur initiale était liée au fait que la fonction remplisse une zone texte et pas une Range

Steelson tu m'effraies avec une telle procédure créant un faux évènement !

Il n'y a pas d'évènement TextBox_Initialize, donc cette procédure ne pourra se déclencher en tant qu'évènement.

N'étant appelée par aucune autre dans le module, c'est du texte mort, elle ne sera pas exécutée.

Et au demeurant, dans les cellules, colonne C, les dates de naissance sont bien au format jj/mm/aaaa. Affectant le contenu de la cellule à une TextBox, il n'y a aucune raison pour que le format se modifie, et lorsqu'il y a une raison, il est plus économique de faire appel à la propriété Text de l'objet Range au lieu de la propriété Value !

Cordialement.

je me disais aussi que cette procédure ... ne servait à rien !

quoiqu'il en soit, il n'en reste pas moins vrai que le problème avait pour origine de "déverser" le résultat dans une zone de texte

il suffit aussi de déverser le résultat de la fonction du début dans une Range déclarée en texte pour se retrouver avec une notation US

Rechercher des sujets similaires à "probleme date inversion jour mois"