Textbox format heure avec module de classe

thombzh

XLDnaute Junior
Bonjour à tous,

Dans un fichier j'ai 18 textbox nommées de Textbox1 à Textbox18.
Toutes ces textbox sont des heures à saisir.

J'ai pu voir qu'avec un module de classe on peu traiter toutes les textbox d'un coup ce qui évite les répétitions de codes.

Ce que j'aimerai c'est que lorsqu'on saisie une heure dans une textbox elle soit de la forme "1400" ou "14:00" et qu'une fois validée elle se transforme en "14:00"

De plus ces enregistrements doivent se faire dans la feuille "Résultat" dans les colonnes de A à R.

Quelqu'un pourrait il m'aider ?
 

Pièces jointes

  • ThomBzh-ModuleDeClasse.xls
    31 KB · Affichages: 47
  • ThomBzh-ModuleDeClasse.xls
    31 KB · Affichages: 53
  • ThomBzh-ModuleDeClasse.xls
    31 KB · Affichages: 51
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Textbox format heure avec module de classe

Bonjour.

Je pense que je le définirait au moins comme ça, cet objet TypeTbxH dans un module de classe de ce même nom:
VB:
Option Explicit
Public WithEvents TBx As MSForms.TextBox

Private Sub TBx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If TBx.TextLength = 2 And InStr(TBx.Text, ":") = 0 Then
   Application.SendKeys Chr$(KeyAscii.Value)
   KeyAscii.Value = Asc(":"): End If
End Sub

Public Property Let Valeur(ByVal D As Date)
TBx.Text = Format(D, "hh:mm")
End Property
Public Property Get Valeur() As Date
Valeur = CDate(TBx.Text)
End Property
 

Dranreb

XLDnaute Barbatruc
Re : Textbox format heure avec module de classe

Bonjour.

Je pense que je le définirait au moins comme ça, cet objet TypeTbxH dans un module de classe de ce même nom:
VB:
Option Explicit
Public WithEvents TBx As MSForms.TextBox

Private Sub TBx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If TBx.TextLength = 2 And InStr(TBx.Text, ":") = 0 And KeyAscii.Value <> Asc(":") Then
   Application.SendKeys Chr$(KeyAscii.Value)
   KeyAscii.Value = Asc(":"): End If
End Sub

Public Property Let Valeur(ByVal D)
On Error Resume Next
TBx.Text = Format(D, "hh:mm")
End Property
Public Property Get Valeur() As Variant
On Error Resume Next
Valeur = CDate(TBx.Text)
End Property
Ce qui pourrait s'utiliser comme ça dans l'Userform :
VB:
Option Explicit
Dim TbxH(1 To 18) As TypeTbxH

Private Sub UserForm_Initialize()
Dim C As Long
For C = 1 To 18
   Set TbxH(C) = New TypeTbxH
   Set TbxH(C).TBx = Me("TextBox" & C)
   Next C
End Sub

Private Sub CommandButton1_Click()
Dim T(1 To 1, 1 To 18), C As Long
For C = 1 To 18: T(1, C) = TbxH(C).Valeur: Next C
With Feuil2.Cells(2, "A").Resize(, 18)
   .NumberFormat = "hh:mm": .Value = T: End With
End Sub
 

thombzh

XLDnaute Junior
Re : Textbox format heure avec module de classe

Bonjour Dranreb et merci de ton aide

Je viens de tester et l'idée est bonne seulement les caractères alphanumériques ne sont pas bloqués et l'affichage des ":" mange une frappe.

Par exemple pour afficher "10:00" on tape 1000 mais là si on tape 1000 apparaît "10:0".

L'idéal serait pour le premier caractère saisie serait d'authoriser uniquement les caractère allant de 0 à 2 et pour les 4 suivant de 0 à 9.

J'ai mis le fichier avec le code que tu m'as en pièce jointe.

Cordialement,
 

Pièces jointes

  • ThomBzh-ModuleDeClasse_2.xls
    38.5 KB · Affichages: 54

thombzh

XLDnaute Junior
Re : Textbox format heure avec module de classe

Effectivement en ajoutant ce code sa règle un des problème.

Mais je peux toujours saisir du texte à la place des heures et le nombre n'est pas limité.

Ce que j'aimerai c'est limité le nombre de caractères saisis soit à 4 chiffres dont le premier serait limiter entre 0 et 2 et les 3 autre entre 0 et 9. Les ":" se rajoutant après la validation ou alors une saisie classique 5 caractères type 10:00.

Et là je sèche complètement.
 

Dranreb

XLDnaute Barbatruc
Re : Textbox format heure avec module de classe

Je ne vois pas pourquoi quelqu'un essayerait d'entrer quelque chose qui ne pourrait pas être converti en heure. Ce ne serait de toute façon pas restitué par la propriété Valeur et donc pas inscrit dans les cellules. Cela dit il est possible de mettre à 0 KeyAscii.Value, et dans ce cas le caractère frappé n'est pas pris en compte.
 

thombzh

XLDnaute Junior
Re : Textbox format heure avec module de classe

Bah si tu voyais tout ce que j'ai pu voir comme entrée de saisie... il y a comme du j'enfoutisme dans l'air
C'est pour ça que je cherche à blindé la saisie, mais comme je suis novice en vba je bloque

Comment je pourrai dire au 1er caractère KeyAscii.value = 0 si pas compris entre 0 et 2 et les 3 autres entre 0 et 9 puis ramener les ":" après validation ?
 

Dranreb

XLDnaute Barbatruc
Re : Textbox format heure avec module de classe

Ce n'est pas une raison pour leur compliquer la vie. Je ne suis pas du tout d'accord de les obliger à taper le 0 non significatif devant.
Au contraire je propose que 35 soit changé en 3:5
À chercher du coté de :
VB:
If InStr(TBx.Text, ":") = 0 And TBx.SelStart = Len(TBx.Text) And CLng(TBx.Text & Chr$(KeyAscii.Value)) > 23 Then Application.SendKeys Chr$(KeyAscii.Value): KeyAscii.Value = Asc(":")
Par contre il pourrait être utile d'étoffer un peu la Property Get:
VB:
Public Property Get Valeur() As Variant
On Error Resume Next
If CBx.Text = "" Then Valeur = Empty: Exit Property
Valeur = CDate(TBx.Text)
If Err Then Valeur = CVErr(xlErrNum)
End Property
De façon à pouvoir détecter If IsError(T(1, C)) et abandonner la boucle, mais faire un SetFocus sur le Me("TextBox" & C), si ça passe. Pas sûr. Ne peut se faire dans le module de classe, pas plus que de détecter les Exit et Enter car ce sont des méthodes et évènements de l'objet Control et non TextBox.
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Textbox format heure avec module de classe

Bonjour thombzh, Dranreb,
un petit essai incomplet mais juste pour tester et saluer Dranreb.
A+
 

Pièces jointes

  • ThomBzh-ModuleDeClasse.xls
    64 KB · Affichages: 61
  • ThomBzh-ModuleDeClasse.xls
    64 KB · Affichages: 62
  • ThomBzh-ModuleDeClasse.xls
    64 KB · Affichages: 72

Dranreb

XLDnaute Barbatruc
Re : Textbox format heure avec module de classe

Ma dernière proposition pour la Property Get, qui garantira à elle seule qu'une heure valide, à la minute près, pourra être rangée dans les cellules et pas autre chose:
VB:
Public Property Get Valeur() As Variant
If TBx.Text = "" Then Valeur = Empty: Exit Property
On Error Resume Next
Valeur = Int(TimeValue(TBx.Text) * 1440 + 0.5) / 1440
If Err Then Valeur = CVErr(xlErrValue)
End Property
Après qu'on facilite la vie des gens en assumant le ":" sans qu'ils soient toujours obligés de le taper, d'accord. Mais c'est un luxe, ça vient après.
 
Dernière édition:

grisan29

XLDnaute Accro
Re : Textbox format heure avec module de classe

bonsoir dranreb, david84,thombzh et le forum
dranreb il y a un bug car il manque la variable de
Code:
If CBx.Text = "" Then Valeur = Empty: Exit Property
et pourquoi
il n'y a pas de combobox

david84 voici un lien qui correspond a celui que tu a mis en bas de ta réponse

Pascal
 
Dernière édition:

Discussions similaires