Avoir un message qui s'affiche si

bonjour a tous

je sais mettre un message quand un textbox n'est pas rempli

If Me.TBqtevente.Value = "" Then
  MsgBox "Entrer une quantité,svp"
  Exit Sub

mais quand il s'agit de l'heure qui n'est pas rentrée comme il faut soit 00:00 afficher le message de rentrer l'heure au format 00:00

dans l'initialisation de l'userform il y a pourtant ceci

Private Sub UserForm_Initialize()
    UserForm1.H_Arrivee = Format("", "hh:mm")
    UserForm1.H_Depart_Dejeuner = Format("", "hh:mm")
    UserForm1.H_Retour_Dejeuner = Format("", "hh:mm")
    UserForm1.H_Sortie = Format("", "hh:mm")
    UserForm1.Total_Heure = Format("", "hh:mm")

End Sub

Bonjour,

Peut-être ( IsDate) peut répondre en partie à ton besoin.

Gelinotte

bonsoir gelinotte

et je mets ou "isdate" dans les lignes de l'intialisation

autrement grace a google j'ai trouvé un code qui interdit + de 4 chiffres et mets automatiquement 2 : entre les 2 parties

voila adadapter pour un seul textbox

Private Sub H_Arrivee_Afterupdate()
Dim tString As String
With H_Arrivee
    'Vérifie si l'utilisateur met les deux-points ou non
   If InStr(1, .Value, ":", vbTextCompare) = 0 Then
        'Sinon, faites la série de 4 chiffres et insérez des deux-points
       tString = Format(.Value, "0000")
       'autrement le code insère les ":"entre les 2 chiffres
        tString = Left(tString, 2) & ":" & Right(tString, 2)

        H_Arrivee.Value = Format(TimeValue(tString), "HH:MM")
    Else
        'Autrement, prenez la valeur comme donné
       .Value = Format(.Value, "hh:mm")
    End If
End With
End Sub

Bonjour,

Ceci fonctionne...

If Not IsDate(Me.TextBox1) Then

MsgBox " Saisir une date s.t.p. "

Else

' blablabla

End If

Un label peut, en plus, monter le format à saisir.

Gelinotte

Bonjour,

Ton initialisation est inutile ! Tu peux toujours formater une chaîne vide, cela restera une chaîne vide. En aucun cas une valeur date, et IsDate renverra faux, tu peux tester.

Si tu veux assurer la saisie de l'heure, tu assistes la saisie avec l'évènement Change qui pour une TextBox intervient à chaque caractère tapé, tu mets la valeur dans une variable, tu contrôles, tu modifies et tu réaffectes la variable.

Tu empêches tout autre caractères que les chiffres et : en suivant selon nombre de caractères. L'opérateur Like est parfait pour ça :

1 caractère : la chaîne doit correspondre au modèle : "[0-9]"

2 caractères : le modèle est : "[0-1][0-9]" ou "2[0-3]" ou bien "[0-9]:" (dans ce dernier cas tu rajoute un 0 devant pour réaffecter.

3 caractères : c'est les2 premiers modèles précédents avec : en 3e caractères. mais là tu peux tester qu'avant : tu as un nombre de 0 à 23.

tu poursuis pour les autres : au 4e tu dois avoir un chiffres de 0 à 5, et au 5e le nombre formé par les 2 derniers chiffres 0 à 59 (en n'omettant pas de vérifier la structure globale à chaque fois et que les chiffres n'ont pas été modifiés).

Sinon, autre méthode : 2 SpinButtons (1 pour les heures, et l'autre pour les minutes) et TextBox pour l'affichage concaténé des valeurs des Spin. Il faut faire varier les valeurs de -1 à 24 pour les heures (proc. Change : si valeur 24 => =00, si valeur -1 => =23, ce qui permet de faire varier dans les deux sens en bouclant entre 0 et 23) ,. Même chose pour les minutes entre 0 et 59 (on fait varier de -1 à 60, et même méthode). Et à chaque Change, on met à jour l'affichage TextBox.

D'ailleurs, ma méthode préférée est de traiter numériquement les dates et heures, de garder les valeurs dans des variables numériques, de n'utiliser TextBox que pour affichage utilisateur, et d'affecter à partir des variables, calculs éventuels exclusivement avec DateSerial et TimeSerial...

Cordialement.

bonsoir Mferrand , gelinotte et le forum

bonj'ai essayer avec IsDate et j'ai un bug de manque if endif voici ce que j'ai fait mais les heures ne sont pas marquées

Private Sub H_Sortie_AfterUpdate()
If Not IsDate(Me.H_Arrivee) Then
    MsgBox " Saisir une date s.t.p. "
Else
If Not IsDate(Me.H_Depart_Dejeuner) Then
    MsgBox " Saisir une date s.t.p. "
Else
If Not IsDate(Me.H_Retour_Dejeuner) Then
    MsgBox " Saisir une date s.t.p. "
Else
If Not IsDate(Me.H_Arrivee.Value) Then
    MsgBox " Saisir une date s.t.p. "
End If
    Total_Heure.Value = Format((CDate(H_Depart_Dejeuner.Value) - CDate(H_Arrivee.Value)) + (CDate(H_Sortie.Value) - CDate(H_Retour_Dejeuner.Value)), "hh:mm")
        If CDate(Total_Heure) > "12:00" Then
            MsgBox "le nombre d'heures par jour doit être inférieur ou égal à 12h !", vbCritical
            Me.H_Arrivee.SetFocus
            Exit Sub

        End If
End Sub

je joint le classeur pour voir car ce que tu dits Mferrand me laisse pantois

Si tu leur mets "Saisir une date" , ils vont pas te saisir une heure !

Qu'est-ce qui te chagrine dans les solutions que j'ai évoquées ?


ElseIf s'écrit ainsi.

bonsoir Mferrand

j'ai laisser tel que Gelinotte l'a mis, pour des essais importe peu le résultat compte

bon en revenir a ce qui me chagrine c'est que je nage dans ce que tu dits et en comprends peu

Je vais pas te fabriquer des démos à cette heure-ci ! Et demain indisponibilité médicale...

J'en ai sans doute dans mes archives, mais tant que je n'ai pas réussi à classer efficacement, cela reste plus rapide à écrire qu'à chercher...

bonsoir Mferrand

mon dernier essai avant d'aller au cirque du lion d'or

j'ai fait ceci mais ca me mets 00:00 des que je tapes 12:30 où autre

Private Sub H_Arrivee_AfterUpdate()
    Me.H_Arrivee.Value = Format(Me.H_Arrivee.Value, "hh:mm")
End Sub
Private Sub H_Depart_Dejeuner_AfterUpdate()
    Me.H_Depart_Dejeuner.Value = Format(Me.H_Depart_Dejeuner.Value, "hh:mm")
End Sub

Private Sub H_Retour_Dejeuner_Afterupdate()
    Me.H_Retour_Dejeuner.Value = Format(Me.H_Retour_Dejeuner.Value, "hh:mm")
End Sub
Private Sub H_Sortie_Afterupdate()
    Me.H_Sortie.Value = Format(Me.H_Sortie.Value, "hh:mm")
End Sub

j'ai laisser les codes que j'ai mis dans ma 2ème réponse et essayer de faire le calcul total d'heures comme ceci

Private Sub Total_Heure_AfterUpdate()
  Dim H1 As Date
  Dim H2 As Date
  Dim H3 As Date
  Dim H4 As Date
  H1 = CDate(H_Depart_Dejeuner.Value)
  H2 = CDate(H_Arrivee.Value)
  H3 = CDate(H_Sortie.Value)
  H4 = CDate(H_Retour_Dejeuner.Value)
  Total_Heure.Value = Format(H1 - H2 + H3 - H4, "hh:mm")
  If CDate(Total_Heure) > "12:00" Then
  MsgBox "le nombre d'heures par jour doit être inférieur ou égal à 12h !", vbCritical
            Me.H_Arrivee.SetFocus
End Sub

eh bien sur c'est inopérant

bonne nuit a tous

Essaie de mettre justement : Format(........, "00:00"). TextBox de contient pas de valeur horaire mais une chaîne numérique (pas sûr que ça marche d'ailleurs, il faudra peut-être recomposer entièrement...)

Tu as aussi 2 Afterupdate où le U de AfterUpdate ne s'est pas rétabli (à vérifier).

Je te joins une petite démo remplissage heure par SpinButtons. Tu peux noter que l'affichage en TextBox n'est pas un calcul horaire mais une simple concaténation. Par contre, l'heure affichée dans le MsgBox en fermant est l'heure recalculée en valeur horaire.

C'est une valeur que je peux affecter et qui affichera l'heure si la cellule a un format horaire (sinon faudra que je le mette en même temps).

Quand tu affectes une valeur de TextBox à une cellule, tu affectes une chaîne : c'est Excel qui reconnait cette chaîne comme représentant une heure et qui la convertit en mettant la cellule au format horaire par défaut.

Cordialement.

bonjour MFerrand

tres bien ta solution de spinbutton mais ne correspond pas a la demande qui m'a été faite

ecrit comme ceci ca ne fonctionne pas l'un laisse tout a zero et l'autre aucun effet

Private Sub H_Depart_Dejeuner_AfterUpdate()
    Me.H_Depart_Dejeuner.Value = Format(Me.H_Depart_Dejeuner.Value, "hh:mm")
End Sub
Private Sub H_Depart_Dejeuner_KeyPress(ByVal Touche As MSForms.ReturnInteger)
   If InStr(Touche, Chr(KeyAscii)) = 0 Then KeyAscii = 0 Else _
       KeyAscii = Asc(Mid(ToucheMaj, InStr(Touche, Chr(KeyAscii)), 1))
End Sub

bonjour Mferrand, Gelinotte et le forum

bon comme le code que j'ai mis dans le post du 05 Juin 2016, 19:52 fonctionne pour inscrire le chiffre au format heure

il n'y a que le total des heures qui ne se fait pas mais j'ai poser un bouton qui le fait bien en cochant commentaire le reste du code correspondant au calcul, voici le code du bouton rien de bien compliqué j'ai repris la ligne du calcul qui était faite

Private Sub CommandButton1_Click()
 Total_Heure.Value = Format((CDate(H_Depart_Dejeuner.Value) - CDate(H_Arrivee.Value)) + (CDate(H_Sortie.Value) - CDate(H_Retour_Dejeuner.Value)), "hh:mm")
End Sub

maintenant je pense qu'il y a mieux qu'un bouton mais en attendant c'est bien

Bonjour,

Pas eu le temps de regarder ton sujet hier... mais je te mets ma 2e démo : saisie d'heure sur TextBox assistée.

Cordialement.

bonjour MFerrant

ne t’inquiète pas pour hier , personnellement je préfère ta version a spinbutton il faudrait que le spinbutton puisse fonctionner pour les 4 textbox

C'est noté ! Elle est en cours...

J'ai présumé... ou plutôt j'ai été quelque peu désorganisé ces derniers jours ! Et pas de chance : je m'étais interrompu sur un détail que je ne savais plus ou reprendre en voulant finir... J'avais loupé quelques maillons et ai dû réanalyser pour retrouver où j'avais laissé des trous. J'espère que je les ai comblés !

Un truc que je voulais ajouter, c'était la réinitialisation des Spin sur la valeur précédente, mais elle l'est de fait si l'utilisateur suit le cheminement sans trop de bavures. Je voulais tout de même ramener le spin minutes à 0, mais pas le temps.

J'ai pas trop testé : ça marche si on suit les consignes dans l'ordre ! Pour les manipulations atypiques, tu me diras !

Bon weekend.

bonsoir Mferrand

ne t’inquiètes surtout pas pour le retard , ton classeur est bien fait merci reste qu'a mettre un bouton d’envois sur feuille

j'aurais bien aimé aussi c'est quand le chantier est loin c'est calculer le temps de route pour justifier d'un frais de déplacement au client

si tu comprends ce que je veux dire, voici ton classeur modifier mais non fonctionnel

car comment faire pour que les 2 textbox soit comptabiliser quand le chantier est loin, j'ai mis les 2 textbox et 1 optinbuton pour les faire apparaitre si besoin car dans l'initialisation de l'userform il n'apparaisse pas

je continue mon test, mais cela peux être un calcul séparé

Bonsoir,

Je vois pas bien ce que tu veux faire... Je n'étais en fait parti que sur l'histoire de message et contrôle de saisie des heures, j'ai fait 2 modèles de dispositifs possibles, tu as relancé sur 4 TB... mais en fait je ne sais pas comment tu veux les utiliser, Il faudrait donc me dire quel dispositif tu souhaites et comment tu veux l'utiliser.

Là, tout ce sur quoi je peux intervenir, ce sont des généralités :

- un OptionButton tout seul, ça marche pas ! une fois qu'il est On, tu peux plus le mettre Off si t'en a pas au moins un autre pour basculer.

ce qui convient le mieux ici c'est ToggleButton, qui fonctionne On/Off alternativement à chaque appui.

- si tes TB additifs doivent être non visibles au départ, tu les mets Visble : False en propriétés, ils seront toujours non visibles à l'ouverture. Pas la peine d'encombrer l'initialisation pour ce qui peut être défini directement.

Après, sur la question du calcul :

Le seul contrôle que je fais, c'est veiller sur les 4 premiers TB à ce que l'heure indiquée ne soit pas inférieure à celle du TB précédent (ça c'était logique, on n'arrive normalement pas avant d'être parti). A partir des heures on peut calculer le temps : aussi d'ailleurs la démo ne comprenant rien d'autre, une fois la dernière heure mise, il me fallait faire cliquer quelque part pour avoir un repère de fin d'opération, parce que l'utilisateur n'intervenant pas directement sur la TB, pour les 3 premiers, la fin de saisie était repérée par le passage à la suivante, mais pour le dernier, il fallait quelque chose !

Donc si tu m'expliques le rôle exact de tes 2 TB ajoutés et les calculs que tu veux obtenir au final, je pourrais mieux cibler...

Cordialement.

bonsoir MFerrand

je revenais juste pour changer de fichier car j'ai modifier mon idée

donc avec l'optionbutton(voir commandbutton) je mets "hide le 1er userform et ouvre un autre qui n'est plus ni moins que celui que tu as mis le 07 Juin 2016, 05:15 mais avec un textbox supplémentaire qui ne veux pas fonctionner pour l'instant


bonsoir Mferrand

après tout c'est s'embêter que d'essayer faire ce que j'ai envie, de toute façon je sais a l'avance si le chantier sera loin où pas

ton dernier fichier est amplement suffisant agrémenter ,du futur bouton pour envoyer sur feuille sous forme de tableau afin de connaitre le temps passer sur le chantier

j'ai créer le code du raz des textbox s'il y a une erreur avant validation

Private Sub cbRaz_Click()
Dim Ctrl As Control
For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.TextBox Then Ctrl.Value = ""
Next
End Sub

mais après essai ca ne fonctionne pas bien car le premier testbox car en mémoire l'heure qui étai inscrite avant le raz

j'ai vu le message que tu as mis dans la "Private Sub cbFerm_Click()" très beau message

merci a toi

Rechercher des sujets similaires à "message qui affiche"