Checker le format d'une TextBox avant fermeture de UserForm
Bonjour a tous !
Si j’en appelle à votre aide aujourd’hui, c’est parce que je n’ai pas trouvé de solution sur Internet...
Mon problème est le suivant : pour déclarer certaines opérations de production j’utilise une macro qui va enregistrer la date et l’heure de l’ouverture du fichier dans deux TextBox, si bien que si l’opérateur a besoin de les modifier, il le peut.
Le format est le suivant : « YYYY-MM-DD » et « HH :MM »
Ce que j’aimerais c’est une procédure qui empêche la fermeture de la fenêtre si l’opérateur a modifié les infos et que le format n’est plus correct. J’ai teste avec CDate et IsDate, mais pas moyen de trouver une solution...
Si quelqu’un aurait une piste, je suis preneur. Merci !
Bonjour,
Une bonne fois pour toute sans fichier joint tu n'auras pas beaucoup d'aide sur aucun forum.
Tu n'es pas obligé de joindre un fichier intégral :
Un fichier avec seulement une ligne de donnée qui permet de nourrir ton UserForm est suffisant.
mais on a besoin que ton code puisse fonctionner.
Tout le reste on s'en fout : Les 99 autres feuilles et milliers de lignes supplémentaires ne servent à rien.
Après à toi de vérifier qu'il ne subsiste pas de liens bloquant ni de macro qui font référence à des feuilles désormais absentes, mais sur tous les forums c'est le même principe. Si tu veux de l'aide il te faut nous aider à y voir clair...
EDIT : Précision le format des TextBox est toujours "Texte" après c'est à vous de traiter la mise à forme et de tester la conversion en date.
Il est souvent nécessaire d'utiliser une variable Long pour mémoriser et transmettre la date sous son SerialNumber... c'est la seule manière que je connaisse pour s'assurer que la date sera bien interprétée par Excel.
A+
Bonjour,
Merci pour la réponse.
Étant en Chine, il m'est impossible de transférer des documents sur ce site (sans doute à cause du pare feux de mon entreprise ?), du coups je dois le faire depuis chez moi. Je n'y étais pas cette semaine, d'où la date de ma réponse.
Ci-joint le fichier Excel. Le but serait lors de l'utilisation de CommandButton_Validate_Click de checker le format des données dans les TectBox liées aux dates. Ces TectBox ont des dates/temps rentrées automatiquement au bon format lors de l'ouverture de l'user form, mais les utilisateurs peuvent décider de rentrer une autre date. Ainsi le but serait de vérifier le format de ces dates rentrées manuellement, voir même d'obliger un format à être rentrer.
Merci !
Bonjour,
Mais c'est du chinois ! (Galopinade...)
Heu... Tout dépend un peu de ton degré d'exigence et de ton degré d'expertise pour appliquer ce que je te propose :
Checker le format de la TextBox serait très lourd et ne servirait pas à grand chose en effet de nombreuses entrées fantaisistes seraient acceptées et pourraient pourtant être valide.
On revient donc à un problème classique de validation de date dans un UserForm :
L'idée est donc de mettre une fonction sur le bouton "Valider", fonction qui testerait que toutes les dates entrées sont valides et que tous les TextBox sont valides :
Private Sub CommandButton_Validate_Click()
Dim ii As Integer
Dim last_line, index_day, virtual_index_machine As Integer
Dim table As ListObject
Dim row1, row2 As ListRow
If YTime(TextBox_RecordTime) And _
YTime(TextBox_TimeStart) And _
YTime(TextBox_TimeFinish) And _
YDate(TextBox_RecordDate) And _
YDate(TextBox_DateStart) And _
YDate(TextBox_DateFinish) Then
'...
End if
End SubEt les fonctions KIVONBIEN avec :
Private Function YDate(D$)
YDate = IsDate(D)
End Function
Private Function YTime(T$)
YTime = Left(T, 2) < 24 And Mid(T, 3, 1) = ":" And Right(T, 2) < 60
End FunctionÇa sera déjà une 'tite amélioration... Pour les heures ce sera suffisamment efficace. Pour les dates, ça ne garanti ni contre le COVID et ça ne peut rien contre les idiots, il y a de toute façon trop de contraintes de validité autour des dates pour faire quoi que ce soit de plus : Ça reste toujours soumis à l'intelligence de l'utilisateur de ne pas saisir sa date de naissance au lieu de celle d'aujourd'hui...
Il y a aussi toutes les solutions qui tournent autour du Date_Picker mais ça n'apportera rien de plus...
Tu me diras
A+
Effectivement il y a un peu de chinois ;)
Merci pour la réponse, je vois ce qu’il y a faire. J’avais déjà teste avec la commande IsDate, ça permet effectivement de vérifier si la date est valide ou non (ça évite de se retrouver avec un 32 décembre quelques part…), cependant je n’arrivais pas à l’utiliser pour forcer un format : « YYYY-MM-DD ». Tu aurais des précisions sur ça ? ou alors il faut peut-être utiliser quelque chose de complètement différent.
Pour le Time je vois très bien, effectivement je n’avais pas pensé à utiliser les commandes Right/Mid/Left, my bad J
Pour le Date_Clicker, c’est un ActiveX je crois, non ? Auquel cas ça pourrait poser des problèmes de sécurité (je crois me souvenir d’avoir lu ca quelque part) ? Je n’en ai jamais utilisé.
Je teste déjà avec la solution proposée. Merci !
Petit update : aucun probleme pour la fonction YTime.
Cependant IsDate ne fonctionne pas par exemple si je rentre 2021-011-31 (au lieu de 2021-11-31), la date est record... De meme si je met 221-11-31... ou encore 2021-04-000000001. C'est considéré équivalent a 2021-04-01. Je vais voir de mon cote si je trouve une maniere de faire.
Bonjour, il suffit peut-être de commencer par vérifier le nombre de caractères dans vos textbox exemple 2021-11-31 = 10
If Len(TextBox_DateStart.value) <> 10 Then
msgbox ("Format date n'est pas accepté")
exit sub
end ifEnsuite le reste du code devrait convenir.
Les Dates_Clicker et autres MonthView ont un petit peu fait long feu... Il est très possible d'utiliser des calendriers embarqués qui n'ont pas d'inconvénient d'autant que des dates seront probablement toujours voisine de la date "courante."
Ce me semble être le seul moyen d'éviter des erreurs "fantaisistes". (ça suppose bien entendu que les TextBox sont visibles mais non Enable)
Je vais essayer de t'en trouver pas trop compliqué à charger.
A+
En pièce jointe ton fichier modifié pour tenir compte de ce qui précède (modification du bouton Validate )
La macro "Initialize" à été remplacée et modifiée pour "Activate"
+ 2 Function additionnelles + 6 Private Sub qui figurent toutes après le "Activate"
Ajouté un UserForm "usfCal" (origine inconnu) à utiliser tel quel.
Ne rien modifier, ne pas chercher à comprendre, c'est pas un modèle d'orthodoxie, il y a des trucs qui dans la situation ne servent à rien, mais ça fonctionne...
Nota : A tester suffisamment, mes essais n'ont surement pas été assez nombreux... Mais avec un peu de chance
A+
Bonjour galopin et Xmenpl, merci pour les suggestions.
Je vais tester les deux méthodes et voir. Ça ne me plait pas trop de devoir utilise quelque chose que je ne comprends pas dans mon code ^^’, mais bon...
Autrement c’est vrai que comme Xmenpl le suggère, faire des tests du style Left(T, 4) = 4 et IsYear(T) peut peut-être bien marcher !
Je teste et je vous tiens au courant.
Si ça peut te rassurer, malgré mon commentaire précédent un peu anxiogène le calendrier proposé est parfaitement sain et compréhensible.
Comme il a été rédigé probablement par quelqu'un de pas trop expert (ou qui n'a pas voulu rendre son code trop incompréhensible), le code fait un peu figure de "vieille brouette" et serait décrié par des puristes de la programmation... Mais dans l'ensemble il fait son boulot très honnêtement ! Surtout dans ce contexte.
A+
Bonjour,
J’ai testé avec le calendrier mais la transposition sur un système chinois a complètement changé les caractères spéciaux tels les accents par des caractères chinois d’erreurs, donc impossible d’utiliser ce calendrier…
Mais bon, en faisant : YDate = Len(D) = 10 And Mid(D, 5, 1) = "-" And Mid(D, 8, 1) = "-" And IsDate(D) , ça marche tout aussi bien ! C’est pas très beau mais ca fait le travail.
Merci en tous les cas pour les conseils !