Textbox Heure au format 00:00

Fermé
Stef - Modifié par pijaku le 5/04/2016 à 08:59
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 6 avril 2016 à 11:28
Bonjour,

J'imagine bien qu'il existe une solution un peu plus smart et plus adaptée et m'en remet donc à votre savoir !

Je m'explique :
_Nous avons 8 textbox consécutives indexées qui doivent impérativement contenir une heure au format "00:00".
_Lorsque l'on saisie les deux premiers chiffres, la TB ajoute automatiquement les ":"
_une fois les 5 caractères atteints, on passe à la TB suivante.

Ma solution actuellement:


Private Sub TextBox1_Change()
i = 1
If Len(Me.Controls("TextBox" & i).Value) = 2 Then Me.Controls("TextBox" & i).Value = Me.Controls("TextBox" & i) & ":"
If Len(Me.Controls("TextBox" & i).Value) = 5 Then Me.Controls("TextBox" & i + 1).SetFocus
End Sub

Private Sub TextBox2_Change()
i = 2
If Len(Me.Controls("TextBox" & i).Value) = 2 Then Me.Controls("TextBox" & i).Value = Me.Controls("TextBox" & i) & ":"
If Len(Me.Controls("TextBox" & i).Value) = 5 Then Me.Controls("TextBox" & i + 1).SetFocus
End Sub

et ceux jusqu'à la dernière TB.

Auriez vous une solution plus adaptée ?

Merci !

A voir également:

5 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
4 avril 2016 à 17:30
Bonjour Stef, bonjour le forum,

Tu pourrais avoir un seul code général et huit codes (1 pour chaque TextBox) :
Private I As Byte

Sub Macro1()
If Len(Me.Controls("TextBox" & I).Value) = 2 Then Me.Controls("TextBox" & I).Value = Me.Controls("TextBox" & I) & ":"
If Len(Me.Controls("TextBox" & I).Value) = 5 Then Me.Controls("TextBox" & I + 1).SetFocus
End Sub

Private Sub TextBox1_Change()
I = 1
Call Macro1
End Sub

Private Sub TextBox2_Change()
I = 2
Call Macro1
End Sub

'etc...


Si tu veux utiliser le même code pour toutes les TextBoxes il te faudra passer par un Module de Classe. Mais pour huit TextBoxes seulement, ton code peut faire l'affaire sans la variable i qui n'a plus d'intérêt...
Si tu souhaites malgré tout te mettre au module de classe, je pourrai te proposer une méthode relativement simple...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
5 avril 2016 à 09:04
Bonjour Stef, bonjour Thautheme,

Je me suis permis de changer le titre du sujet pour qu'il soit plus explicite.

Ceci dit, peu importe la manière, module de classe ou module d'UserForm, l'inconvénient de cette façon de procéder (saisie automatique de : dans la procédure Change()) ne règle en rien la question qui est :
Nous avons 8 textbox consécutives indexées qui doivent impérativement contenir une heure au format "00:00"

Pour obtenir cela, il faut obligatoirement contrôler la saisie et empêcher l'utilisateur de saisir certains caractères. Seuls les chiffres doivent être acceptés.

Si tu es d'accord, on peut trouver une solution.

Cependant, il faudra plus de détails. L'heure saisie est une heure du jour ou une durée? (oui, une durée peux excéder 24:00)...
Comment est saisit minuit (s'il se peut qu'il le soit)?
0
StefOff Messages postés 1 Date d'inscription mercredi 6 avril 2016 Statut Membre Dernière intervention 6 avril 2016
6 avril 2016 à 09:31
Re tout le monde et merci pour vos réponses,

Après m'être enregistré sur le site, je vous notifie le changement de pseudo -> Stef -> StefOff (oui, c'est toujours moi !)


Pour ne plus rien vous cacher des mes plans diaboliques, voici le Userform :



En réalité ce ne sont donc pas 8 Textbox mais 24 (ce qui rend le code peu ergonomique et vu la lourdeur de celui-ci, je me doute qu'il doit y avoir une solution plus "smart").

Process:
L'utilisateur saisie une plage horaire en définissant une heure de début (TB1) et une heure de fin (TB2), et ainsi de suite pour les plages suivantes (ce process se répète pour chaque Frame).
Lorsque l'on saisie une plage (ex : TB1 = 10:00 // TB2 = 20:00), un label vient s'afficher à côté de la TB4 pour donner le nombre d'heures effectives (dans notre ex : Label = 10:00).
Lorsque l'on saisie une nouvelle plage, le label se met à jour en ajoutant les heures effectives de la plage 2.


Les valeurs saisies ne doivent pas excéder les fameuses 24 heures (format jour)
Le format saisie dans une TB doit impérativement être "##:##" (Les valeurs des TB sont ensuite inscrites dans une cellule formatées "[h]:mm").



ThauTheme :
C'est déjà un peu mieux en faisant un "Call" et en changeant la valeur de "i" effectivement, mais avec 24 TB, c'est long quand même :p !
Du coup tu as sans doutes raison au sujet du module de classe.. (mais je suis pas trop à l'aise avec ces derniers ! :p)


pijaku :
Aucun souci pour le changement de titre, j'avoue l'avoir écrit sans trop de conviction (malgré un moment de réflexion).
Je suis d'accord pour le contrôle de saisie mais mes connaissances modeste en VBA m'obligeaient à écrire une procédure lourde pour chaque TB.
Idéalement j'aurais voulu créer un Sub commun à tous que je puisse appeler pour chaque TextBox à condition qu'elle ne soit pas vide.


Je vous remercie tous deux pour votre aide en tous cas !
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
6 avril 2016 à 09:40
Bonjour le fil, bonjour le forum,

Plutôt qu'une image, le fichier ne semble indispensable. Regarde du coté de https://www.cjoint.com/ (ou autre je n'ai pas d'actions chez eux...) et surtout pense a zipper le fichier avant sinon il est in utilisable.
De mon coté je te propose un petit document que j'ai fait car, comme toi, je ne suis pas très à l'aise avec les modules de classe et ce document m'est précieux.
https://www.cjoint.com/c/FDghM7DWstI
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
6 avril 2016 à 09:58
Bonjour,

Je vais regarder cela dans la journée.
Je pense revenir sous peu avec une solution "aux petits oignons" utilisant un module de classe.
Cependant, comme dit par ThauTheme (salutations), il nous manque des éléments.
Notamment :
1- le nom de l'userform
2- le nom des frame
3- le nom des textbox.
Par nom, j'entend le contenu de la propriété Name de ces contrôles.

ps : ton image représente l'intégralité de ton userform?
Il n'y a pas d'autres contrôles?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
6 avril 2016 à 11:28
ça a été plus vite que prévu.
A tester

En cas de souci pour adapter au classeur, n'hésitez pas.
Il se peut que de copier-coller le code de la classe cTB_Heure de mon classeur au votre ne fonctionne pas correctement (le code ne fera plus effet en raison de lignes de code cachées).
Dans ce cas exportez puis importez le module de classe dans votre classeur.
0