Calendrier amovible et inversion jour-mois

Bonjour à tous,

j'ai récupéré un calendrier amovible développé par Leakim et adapté.

Malgré des heures d'essais je ne parviens nullement à récupérer la date au format dd/mm/yyyy :

comme vous le verrez, la valeur de date est affectée à une variable puis une textbox prend la valeur de la variable (pour que k'utilisateur sache ce qu'il a sélectionné), puis enfin ne cellule prend la valeur de la textbox.

Une précision: Le nom de la textbox d'affichage est obligatoirement celui que j'ai donné, je ne peux le changer.

Voici un fichier pour illustrer le propos.

J'ai essayé: utilisation de CDate, en enlevant le format ds cellules de destination, en changeant le format des cellules de destination, en inversant dd/mm/yyyy dans le calendrier, et en testant les combinaisons de ces 4 pistes de solutions.

QQ chose m'échappe!

Merci d'avance de votre aide.

Pierre

Bonsoir,

pour commencer je n'ai pas trouvé de bouton pour lancer un quelconque USF.

Donc j'ai lancé "manuellement" celui de saisie...

J'ai choisi le 13/06/2018 comme date, j'ai répondu "essai" dans les différents ComboBox puis j'ai validé et voilà le résultat :

13 06 2018

La date c'est inscrite correctement...

Il faut peut être que vous alliez voir du coté de la mise en forme des dates de votre OS.

Sous Windows, cliquez sur l'heure en bas à droite de la barre des tâches, "modifier les paramètres dates et heures", "changer les paramètres du calendrier", et là vous pouvez choisir le format date court et long qui vous convient.

Enfin si le problème vient de là...

@ bientôt

LouReeD

Bonjour Pierre, LouReeD,

j'te retourne ton fichier avec plein d'modifs un peu

partout (y compris l'code VBA et ton formulaire) :

à toi de tout vérifier soigneusement !


pour tes erreurs de dates, j'crois qu'c'était juste de mauvaises données en colonne A :

* en A2 : 13/06/2008 ! j'ai mis 2018 ; et pourquoi le 13/06 est avant le 01/06 ? j'ai donc mis : 01/06/2018

* en A9:A12 : 06/01/2018 au lieu de 01/06/2018 (ce 2ème point est bien sûr le plus important ! )


merci de me donner ton avis.

dhany

Bonjour,

merci de vos posts,cependant le problème persiste:

le 2 juin me renvoie toujours le 6 février.

Dhany, les différences entre la ligne 2 et les autres vient du fait que j'ai fait de multiples essais sur les formats de cellules.

LouReed, le pb se pose qd la valeur du jour est <=12!

Pierre a écrit :

le pb se pose qd la valeur du jour est <=12 !

c'est pas plutôt quand la valeur du jour est >12 ? ça signifierait qu'le jour est pris pour le mois, et comme un mois ne peut pas dépasser 12, car mois maxi = 12 = décembre ! exception : y'a parfois un 13ème mois, sur les fiches de paye !!!

dhany

le 1er juin est renvoyé comme 6 janvier, le 2 juin comme 6 février etc...

donc tes dates sont bien inversées :

1er juin = 01/06, qui devient 06/01 = 6 janvier

2 juin = 02/06, qui devient 06/02 = 6 février

etc...

et c'est juste sur la feuille, ou dans le formulaire, ou lors de son utilisation ?

quand c'est sur la feuille, précise sur quelle(s) ligne(s) / colonne(s).

dhany

Bonjour, Salut à tous !

Une solution rustine rapide : tu remplaces = Date_mouvement.Value par = ChoixDate dans ta procédure d'affectation (à deux reprises).

Pas le temps de te modifier tout ce qui justifierait de l'être ! Ni de fournir des explications détaillées! Mais fallait le faire de provoquer l'inversion jour/mois classique avec tout en main pour l'éviter !

Cordialement.

Merci MFerrand, Dhanny et les autres,

j'ai trouvé une solution pr pouvoir utiliser CDate, je nomme mes TextBox ds lesquelles st reportées les dates du calendrier "Date_...." et

avec un If la valeur reportée sera un CDate. Cela me permet de conserver le rapatriement des valeurs de ts les contrôles par boucle.

For Each ctl In Me.Controls

If TypeOf ctl Is MSForms.TextBox Or TypeOf ctl Is MSForms.ComboBox Then

If ctl.Name Like "*date*" Then

MsgBox (ctl.Name)

Sheets("SAISIE QUANTITES QUALITE LAIT").Cells(i, Range(ctl.Name).Column).Value = CDate(ctl.Value)

Else

Sheets("SAISIE QUANTITES QUALITE LAIT").Cells(i, Range(ctl.Name).Column).Value = ctl.Value

End If

Else

End If

Next ctl

merci pour ton retour, et pour avoir passé le sujet en résolu ! bonne continuation !

dhany

Bonjour,

Avec un petit délai (j'étais absent hier...) deux remarques qui me paraissent utiles :

La fonction NO.SEMAINE ne renvoie pas le numéro de semaine selon la norme ISO applicables en Europe, elle est donc à proscrire car elle te renverra un faux numéro en moyenne 3 années sur 7.

Avec 2013, tu disposes d'une fonction dédiée au renvoi du numéro de semaine ISO, c'est cette fonction qu'il faut utiliser.

Le problème des dates se pose lorsque l'on utilise un TextBox pour saisir la date, au sortir de la TextBox, on a une donnée de type texte (par définition) qui, ayant un format de date identifiable par VBA fait l'objet d'une conversion automatique en date, mais 'sauvage' en quelque sorte car VBA utilise alors ses paramètre natifs, américains, et si le jour est inférieur à 13 l'on a toutes les chances de se retrouver avec une inversion jour/mois.

On l'évite en général en opérant explicitement la conversion, ce qui force VBA à passer par les paramètres FR de reconnaissance de date. Ce qui fonctionne lorsqu'on le fait lors de l'affectation à la cellule destinataire.

Difficulté si l'on n'affecte pas directement à la cellule mais qu'on passe par l'affectation à un tableau qui sera ensuite affecté à la plage. VBA trouve alors l'occasion d'opérer une nouvelle reconversion... On y pallie dans un tel cas par une double conversion : conversion en date, et conversion de la date en entier Long (forme sous laquelle sont stockées les dates dans Excel). Le souci d'inversion est alors définitivement évité, mais si la cellule d'affectation n'a pas préalablement un format de date, il conviendra de penser à l'en doter lors de l'affectation, car Excel ne pourra plus l'opérer alors automatiquement.

Evidemment, une solution de saisie de date qui évite la TextBox comme mode de saisie, permettra aussi d'éviter ce problème d'inversion !

Or en fait, en reprenant des éléments d'un fichier de Leakim utilisant lui même un module de Tatiak, tu disposes d'un module calendrier qui te renvoie une donnée de type Date... Et de fait ta saisie ne se fait pas dans la TextBox mais dans le module Calendrier. La TextBox ne devrait te servir que pour l'affichage au regard de l'utilisateur... ainsi tu utiliserais pleinement ton module.

Il est vrai que pour cela il conviendrait alors que lors de la saisie, tu stockes la valeur Date issue du calendrier dans une variable Date (déclarée au niveau module). Lors de l'affectation, tu utilises la variable Date et non la TextBox.

Cela n'a pas d'impact sur ta boucle d'affectation car tu affectes individuellement les cellules et tu peux donc aussi bien affecter la valeur d'une variable en lieu et place du contenu d'une TextBox à ta colonne date.

Au-delà, pour simplifier le code, en utilisant un tableau... cela demanderait un peu plus de modification. Mais pour la date, il est dommage de produire une valeur date en saisie et d'être ensuite réduit à opérer une conversion !

Cordialement et bonne journée.

Merci MFerrand pour ta réponse détaillée, et le conseil supplémentaire sur N0.SEMAINE.

Bonne journée et à très vite.

Pierre

Rechercher des sujets similaires à "calendrier amovible inversion jour mois"