Saisie d'heures dans textbox

  • Initiateur de la discussion Initiateur de la discussion zumba
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Z

zumba

Guest
Bonjour, comment éviter une erreur de syntaxe lors de la saisie d'heure et de minute dans une textbox?
Je souhaiterai faire apparaitre un message d'erreur et autoriser une nouvelle saisie.
voici le code actuel. La cellule est au format [h]:mm)
Merci


Private Sub CommandButton1_Click()

x = Split(TextBox1, ":")

Range("j1") = x(0) / 24 + x(1) / 1440
MsgBox ("nbre d'heures=" & x(0))
MsgBox ("nbre de minutes=" & x(1))
Unload Me
End Sub



Private Sub TextBox1_Change()

End Sub

Private Sub UserForm_Click()

End Sub
 
Re : Saisie d'heures dans textbox

Bonsoir zumba,

Essayez cette macro :

Code:
Private Sub CommandButton1_Click()
  Dim x
  If TextBox1 = "" Then TextBox1.SetFocus: Exit Sub
  If [J1].NumberFormat <> "[h]:mm" Then _
    MsgBox "J1 doit être au format [h]:mm !", 48: Exit Sub
  x = Split(TextBox1, ":")
  On Error Resume Next
  [J1] = x(0) / 24 + x(1) / 1440
  If Err Or [J1].Text <> TextBox1 Then
    [J1] = ""
    TextBox1.SetFocus
    TextBox1.SelStart = 0
    TextBox1.SelLength = Len(TextBox1)
    MsgBox "Entrée erronée !", 48
    Exit Sub
  End If
  MsgBox "Nombre d'heures = " & x(0) & vbLf & _
   "Nombre de minutes = " & x(1)
  Unload Me
End Sub
A+
 
Re : Saisie d'heures dans textbox

Bonjour zumba, le forum,

Ceci est sans doute un peu mieux :

Code:
Private Sub CommandButton1_Click()
  Dim m, x
  If TextBox1 = "" Then TextBox1.SetFocus: Exit Sub
  [J1].NumberFormat = "[h]:mm" 'sécurité
  m = [J1] 'mémorise
  x = Split(TextBox1, ":")
  On Error Resume Next
  [J1] = x(0) / 24 + x(1) / 1440
  If Err Or [J1].Text <> TextBox1 Then
    [J1] = m
    TextBox1.SetFocus
    TextBox1.SelStart = 0
    TextBox1.SelLength = Len(TextBox1)
    MsgBox "L'heure doit être au format ""[h]:mm"" !", 48
    Exit Sub
  End If
  MsgBox "Nombre d'heures = " & x(0) & vbLf & _
    "Nombre de minutes = " & x(1)
  Unload Me
End Sub
Notez en passant que le format [h]:mm n'est pas reconnu par VBA :

TextBox1 = Format(Textbox1, "[h]:mm") ne fonctionnera pas.

La solution consistant à tester via une cellule est donc en effet une bonne méthode.

A+
 
Re : Saisie d'heures dans textbox

Bonjour,

Autre idée : compter sur la conversion par cdate() pour éliminer les erreurs :
Code:
Dim h As String, t As String
h = "12:12"
On Error Resume Next
t = CStr(CDate(h))
If Err > 0 Or Len(t) <> 8 Or Len(h) > 5 Or InStr(t, ":") < 1 Then
    MsgBox ("erreur")
End If
On Error GoTo 0
eric
 
Re : Saisie d'heures dans textbox

Re,
Exact, mais j'ai supposé que c'était des heures d'une journée (<24:00) à contrôler.
Pas bon effectivement si c'est une mauvaise supposition.
C'est vrai que le format annoncé [h]:mm peut me faire douter... 🙂

eric
 
Re : Saisie d'heures dans textbox

Re,

On peut éviter le contrôle d'erreur et le message d'erreur par un contrôle serré des entrées dans TextBox1 :

Code:
Private Sub CommandButton1_Click()
  Dim x
  x = Split(TextBox1, ":")
  If UBound(x) < 1 Then TextBox1.SetFocus: Exit Sub
  [J1].NumberFormat = "[h]:mm" 'sécurité
  [J1] = x(0) / 24 + Val(x(1)) / 1440
  MsgBox "Nombre d'heures = " & x(0) & vbLf & _
    "Nombre de minutes = " & Val(x(1))
  Unload Me
End Sub

Private Sub TextBox1_Change()
  Dim t$, p, x$
  t = TextBox1
  t = Replace(Replace(t, ",", ""), ".", "")
  p = InStr(t, ":")
  If p Then
    t = Left(t, p + 2)
    x = Mid(t, p + 1)
    If x <> "" And Not IsNumeric(x) Or x > "59" _
      Then t = Left(t, p)
  Else
    t = Int(Abs(Val(t)))
    If t = "0" Then t = ""
  End If
  TextBox1 = t
End Sub
Mais il y aura problème si l'on entre un texte dans la TextBox par copier-coller...

On pourrait y remédier mais là ce serait de l'acharnement thérapeutique 🙂

A+
 
Re : Saisie d'heures dans textbox

Re,

La macro précédente ne permettait pas d'entrer 0 heure 🙁

Utilisez ce code qui règle aussi le problème éventuel d'un copier-coller :

Code:
Private Sub CommandButton1_Click()
  Dim x
  x = Split(TextBox1, ":")
  If UBound(x) < 1 Then TextBox1.SetFocus: Exit Sub
  [J1].NumberFormat = "[h]:mm" 'sécurité
  [J1] = x(0) / 24 + Val(x(1)) / 1440
  MsgBox "Nombre d'heures = " & x(0) & vbLf & _
    "Nombre de minutes = " & Val(x(1))
  Unload Me
End Sub

Private Sub TextBox1_Change()
  Dim t$, x
  t = TextBox1
  t = Replace(Replace(t, ",", ""), ".", "")
  If InStr(t, ":") Then
    x = Split(t, ":")
    x(1) = Left(x(1), 2)
    If Not IsNumeric(x(1)) Or x(1) > "59" _
      Then x(1) = ""
    t = Abs(Val(x(0))) & ":" & x(1)
  Else
    If IsNumeric(t) Then t = Abs(Val(t)) Else t = ""
  End If
  TextBox1 = t
End Sub
A+
 
Dernière édition:
Re : Saisie d'heures dans textbox

Bonsour®
pourquoi ne pas utiliser 2 texboxes :
le controle en sera facilité,
VarHeures pour les heures
pseudo code :
if isnumeric(texbox1) then varheures=CInt(Texbox1) else Message puis setfocus, Resaisie

VarMinutes pour les minutes
pseudo code :
if isnumeric(texbox2) then if Cint(texbox2)<60 then varminutes=cint(texbox2) else message puis setfocus, resaisie

resultat en type double = VarHeures/24 + VarMinutes/(1440)
 
Re : Saisie d'heures dans textbox

Bonjour Modeste geedee, le fil,

Avec 2 TextBoxes ça ne change pas grand'chose, elles remplacent les items du Split.

Le principe reste le même, par exemple avec la méthode du post #8 (pas de message de contrôle) :

Code:
Private Sub CommandButton1_Click()
  If TextBox1 = "" Then TextBox1.SetFocus: Exit Sub
  [J1].NumberFormat = "[h]:mm" 'sécurité
  [J1] = TextBox1 / 24 + Val(TextBox2) / 1440
  MsgBox "Nombre d'heures = " & TextBox1 & vbLf & _
    "Nombre de minutes = " & Val(TextBox2)
  Unload Me
End Sub

Private Sub TextBox1_Change()
  Dim t$
  t = TextBox1
  t = Replace(Replace(t, ",", ""), ".", "")
  If IsNumeric(t) Then t = Abs(Val(t)) Else t = ""
  TextBox1 = t
End Sub

Private Sub TextBox2_Change()
  Dim t$
  t = Left(TextBox2, 2)
  t = Replace(Replace(t, ",", ""), ".", "")
  If IsNumeric(t) And t <= "59" Then t = Abs(Val(t)) Else t = ""
  TextBox2 = t
End Sub
A+
 
Re : Saisie d'heures dans textbox

Bonsour®
Bonjour Modeste geedee, le fil,

Avec 2 TextBoxes ça ne change pas grand'chose, elles remplacent les items du Split.

Le principe reste le même, par exemple avec la méthode du post #8 (pas de message de contrôle) :

😎
la pierre d'achoppement étant la valorisation d'un nombre d'heures supérieur à 24.
et selon le principe MIMO ( M***e In, M***e Out)

nous sommes donc bien d'accord :
On peut éviter le contrôle d'erreur et le message d'erreur par un contrôle serré des entrées
 
Re : Saisie d'heures dans textbox

Bonjour,

une autre idée adaptée d'une ancienne proposition : pas de saisie mais 2 Toupies pour 2 Textboxes.
On pourrait se contenter d'un contrôle de chaque sorte mais le choix demanderait plus de temps.
 

Pièces jointes

Re : Saisie d'heures dans textbox

Bonjour zumba, le forum,

Une autre proposition qui accepte pas mal de formats dont la virgule, le point ou les deux points comme séparateur et des heures supérieures à 23:59:59

acceptés: 23:45 - 52:45:18 - 52,45 - 52,45:17 - 0,52 - 52,45 - 0,45 - ,45 - 23,45 - ,45:00 - 0,45:17 - 52,45.17 - :45 - 0,52,45 - 00:45 - 52,45:00 - 0,45.17 - 0,0:0 - 0 ,0,3 - 52:45
refusés: ,,3 - 25.89,57

Code:
Private Sub CommandButton1_Click()
Dim DecSep, TxtOri, Hh, Txt
On Error GoTo CommandButton1_Click_Err
   Range("j1").ClearContents
   Range("j1") = Texte_En_Heure(TextBox1)
   Range("j1").NumberFormat = "[h]:mm:ss;@"
   Exit Sub

CommandButton1_Click_Err:
   MsgBox "Erreur n° " & Err.Number & " dans " & Err.Source & vbLf & "=> " & Err.Description
End Sub

Public Function Texte_En_Heure(xRg)
Dim Txt, Hh
On Error GoTo Texte_En_Heure_Err
   Txt = Replace(Replace(Trim("" & xRg), ",", ":"), ".", ":")
   Hh = Val("0" & Txt)
   Txt = "0" & Replace(Txt, Int(Hh), 0, 1, 1)
   Texte_En_Heure = CDate(Txt) + Int(Hh) / 24
   Exit Function
Texte_En_Heure_Err:
   Err.Raise 55555, " <Texte_En_Heure(X)> ", "X n'est pas reconnaissable en tant que hh:mm:ss"
End Function
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
4
Affichages
733
Réponses
3
Affichages
922
Retour