Formatage de txtbox en heure

jopont

XLDnaute Impliqué
Bonjour

Dans le fichier ci-joint, j'ai une fonction check_HeureFormat chargée de vérifier l'heure entrée dans un txtbox.
Dans le formulaire sur l'évenement lostfocus du txtbox il ya appel de la fonction est en fonction de se qui est renvoyé par la fonction l'heure du txtbox est formaté ou non

Seulement voila ça fonctionne pas, et je ne trouve pas l'erreur dans mon code
merci pour votre aide
[file name=formatage_heure.zip size=11558]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/formatage_heure.zip[/file]
 

Pièces jointes

  • formatage_heure.zip
    11.3 KB · Affichages: 127

myDearFriend!

XLDnaute Barbatruc
Bonjour jopont, le Forum.

Ton problème vient déjà du fait que tu n'utilises pas un évènement reconnu par VBA. En effet, ta Private Sub Heure_LostFocus() n'est pas une procédure évènementielle prévue pour les TextBox.
Pour rappel, la liste des évènements reconnus et donc utilisables, tu les obtiens dans la liste déroulante en haut à droite de l'éditeur VBE lorsque tu as choisi au préalable le contrôle (txtHeure) dans la liste déroulante de gauche (là où il y a indiqué 'Général').

L'évènement utilisable dans ton cas devrait être Exit(), cet évènement se déclenche dès la perte du focus par le contrôle.

Tu trouveras ci-joint une suggestion de code pour ton fichier :[ol][ul][li]J'ai utilisé d'une part la propriété MaxLength (=5) du TextBox pour 5 caractères maximum (y compris ':').[/li]
[li]J'ai également utilisé l'évènement KeyPress pour n'autoriser que la frappe des caractères numériques (et donc interdire les autres)[/li][/ul][/ol]
Cordialement, [file name=PourJopont.zip size=14726]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/PourJopont.zip[/file]
 

Pièces jointes

  • PourJopont.zip
    14.4 KB · Affichages: 209

jopont

XLDnaute Impliqué
Ok merci pour ces précisions, il est vrai que je n'étais pas sur de lostfocus, vu que j'ai trouvé sur un site plus orienté vb et non vba.

ça fonctionne super bien mais , je ne comprend pas tous (suis débutant) et j'aime pas ça.

pourrais-tu me préciser les points suivants :

Code:
Private Sub txtHeure_Exit(ByVal Cancel As MSForms.ReturnBoolean)

A quoi correspond byval, et cancel ?

Code:
Public Function AutoriseFrappe(ByVal K As Integer) As Integer

je comprend pas la fonction, pourquoi 48 et 57...?

merci de ton aide
 

myDearFriend!

XLDnaute Barbatruc
Re jopont,

A quoi correspond byval, et cancel ?
Contrairement à la fontion personnalisée AutoriseFrappe() créée entièrement, l'évènement txtHeure_Exit() est, comme je te le précisais plus haut, une procédure 'standard' prédéterminée et liée au contrôle TextBox. Cette procédure comprend un argument 'Cancel', lui aussi prédéterminé (valeur False par défaut). L'intérêt de cet argument pointant sur l'objet lui-même, c'est qu'il permet d'annuler l'effet de l'évènement correspondant si tu lui affectes la valeur True.

Autrement dit, lorsque ton TextBox est sur le point de perdre le focus et avant même que ce focus ne passe au contrôle suivant, l'évènement Exit() entre en jeu. Le code de cette procédure est donc exécuté. Si dans ce code, tu donnes la valeur VRAI à cet argument 'Cancel' (en faisant : Cancel = True), alors tu annules l'effet de l'évènement et le TextBox ne perdra pas le focus. Tu retrouveras ce 'Cancel' souvent dans les procédures évènementielles (par exemple dans l'évènement DblClick() des TextBox ou des CommandButton).

En ce qui concerne l'expression 'ByVal', bien que pour les procédures évènementielles la signification soit un peu différente (s'agissant en fait d'un pointeur sur l'objet), il faut savoir que les arguments peuvent être passés à une procédure par valeur (ByVal) ou par référence (ByRef). Par défaut (sans précision By...), un argument est passé à une procédure par référence. Si on souhaite passer l'argument par valeur, il faut le préciser de façon explicite en mettant ByVal devant.

Oui, mais c'est quoi la différence ?
Lorsqu'on passe un argument ByVal,la variable d'origine est copiée dans la procédure. Les modifications apportées ensuite à l'argument au sein de la procédure ne sont pas répercutées sur la variable d'origine. Tu en déduiras donc facilement la différence avec ByRef qui, à contrario, répercutera les modifications de l'argument sur la variable d'origine.
Je te conseille de lire l'aide VBA sur ce sujet en faisant une recherche sur l'expression 'argument'...


Public Function AutoriseFrappe(ByVal K As Integer) As Integer

je comprend pas la fonction, pourquoi 48 et 57...?
Les valeurs 48 à 57 correspondent aux codes ANSI des caractères numériques ('0' = 48, '1' = 49, '2' = 50, etc... jusqu'à '9' = 57).
Je te conseille là aussi une recherche dans l'aide VBA avec l'expression 'Jeu de caractères' pour avoir la correspondance des codes caractères utilisables sous Windows.

Dans l'évènement KeyPress() du TextBox, l'argument 'KeyAscii' contient le code caractère qui vient d'être frappé par l'utilisateur. Je passe ensuite ce code à la Function AutoriseFrappe() qui va contrôler si ce caractère est donc autorisé ou non. Dans la négative, il retourne un code caractère '0' qui annule donc la frappe de l'utilisateur.

J'espère que ces quelques explications auront pu t'éclairer un peu...

Cordialement,
 

myDearFriend!

XLDnaute Barbatruc
Re jopont,

Ben, tu sais, j'ai fait ce que j'ai pu là... et pour info, il m'a fallu quelques mois de pratique avant de comprendre cette notion. Et encore, je suis sûr de ne pas maîtriser la chose encore aujourd'hui ! Aussi, sache quand même qu'on peut faire joujou avec VBA sans forcément tout savoir et l'expérience te démontrera qu'on ne sait jamais tout de toute façon !

Cordialement,
 

Discussions similaires

Réponses
5
Affichages
726

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz