Le selecteur d'heure

Bonjour à tous, et au secours !!!!!!!

Je cherche depuis longtemps une sélecteur horaire pour compléter les saisies de formulaires. Pourquoi me direz vous puisqu'il suffit de taper 11:40 et le tour est joué !

Justement j'en ai marre de taper de cette façon j'ai donc tenté de reformuler ça à partir de différends modèles mais c'est galère et j'arrive pas à gérer mes toupies et la saisie manuelle. L'option AM/PM est pas obligatoire mais j'ai trouvé que c'était un plus.je vous joint mon fichier excel en espérant que vous pourrez m'aider.

Merci d'avance,

cordialement

Bonsoir,

une proposition en passant avec une scrollbar :

Private Sub ScrollBar1_Change()
    TextBox1 = Format(CDate(ScrollBar1.Value) / 1440, "hh:mm")
End Sub

et son paramétrage :

ScrollBar1.Min = 1
ScrollBar1.Max = 1440
ScrollBar1.LargeChange = 1

Le fichier :

@ bientôt

LouReeD

Bonsoir,

pour ceux qui se demandent : mais pourquoi 1440 ? C'est juste qu'il y a 1440 minutes dans une journée, d'où le déplacement de minute en minute grâce à la scrollbar.
Si une précision à 10 minutes suffit alors 144... 5 minutes ? je suppose 288...

@ bientôt

LouReeD

Bonjour à tous, Bonjour Jean-Jacques
Quand vous programmez faites très attention au nom de vos variables.
Pour ne pas casser l'encapsulation du formulaire il vaut mieux utiliser une propriété :
Private mSelectedTime As String

Public Property Get SelectedTime() As String
    SelectedTime = mSelectedTime
End Property
' // Vous pouvez utiliser aussi la propriété Let si vous voulez renseigner une heure
'Public Property Let SelectedTime(ByVal NewValue As String)
'
'End Property

J'ai modifier votre code et mis des commentaires d'explication pensez à gérer aussi l'évènement 'QueryClose' de la fenêtre si vous la cachez...

Voici le code du formulaire :

Option Explicit
' Déclare une variable pour stocker l'heure sélectionnée

Private heure As String
Private minute As String
Private AmPm As String
Private mSelectedTime As String

Public Property Get SelectedTime() As String
    SelectedTime = mSelectedTime
End Property

' // Vous pouvez utiliser aussi la propriété Let si vous voulez renseigner une heure
Public Property Let SelectedTime(ByVal NewValue As String)
    Dim tempString As Variant
    If InStr(1, NewValue, ":", vbTextCompare) Then

        tempString = Split(NewValue, ":", -1, vbTextCompare)
        heure = Format$(tempString(0), "00")

        If InStr(1, tempString(1), " ", vbTextCompare) Then
            Dim tempMinute As Variant
            tempMinute = Split(tempString(1), " ", -1, vbTextCompare)
            minute = tempMinute(0)
            AmPm = tempMinute(1)
        End If
        heureSaisie.Value = heure
        minuteSaisie.Value = minute
        Cmb_AMPM.Value = AmPm

        mSelectedTime = NewValue
    End If
End Property

' // Initialiser le sélecteur d'heure lors du chargement du formulaire
Private Sub UserForm_Initialize()
    ' Définir l'heure par défaut à 12:00 AM
    heureSaisie.Value = "12"
    minuteSaisie.Value = "00"
    ' Remplir la liste déroulante AM/PM
    With Cmb_AMPM
        .List = VBA.Array("AM", "PM")
        .ListIndex = 0                                          ' Par défaut AM
    End With

    ' // Définir les propriétés des boutons Spin
    ' // L'utilisation de 'With' rends le code plus lisible
    With selecteurHeure
        .Min = 0
        .Max = 12
        .Value = 12
    End With
    With selecteurMinute
        .Min = 0
        .Max = 59
        .Value = 0
    End With

End Sub

' // Gérer le clic sur le bouton Annuler - Fermer sans sauvegarder
Private Sub btn_Cancel_Click()
    mSelectedTime = vbNullString                                ' Réinitialiser l'heure
    Me.Hide
End Sub

' // Gérer le clic sur le bouton OK - Sauvegarder l'heure sélectionnée
Private Sub Btn_OK_Click()
    mSelectedTime = Format$(heureSaisie.Value) & ":" & Format$(minuteSaisie.Value) & " " & Cmb_AMPM.Value
    Me.Hide
End Sub

' // Gérer la saisie manuelle dans la TextBox des heures
Private Sub heuresSaisie_Change()
    Dim h As Integer
    If IsNumeric(heureSaisie.Text) Then
        h = CInt(heureSaisie.Text)
        If h >= 1 And h <= 12 Then
            selecteurHeure.Value = h
        Else: heureSaisie.Text = "12"
        End If

    End If
End Sub

Private Sub minuteSaisie_Change()
    Dim m As Integer
    If IsNumeric(minuteSaisie.Text) Then
        m = CInt(minuteSaisie.Text)
        If m >= 0 And m <= 59 Then
            minuteSaisie.Value = m
        Else: minuteSaisie.Text = "00"                          ' Réinitialiser si la saisie est invalide
        End If
    Else: minuteSaisie.Text = "00"
    End If
End Sub

' // Gérer le changement de l'heure avec le bouton Spin
Private Sub selecteurHeure_Change()
    heureSaisie.Value = Format$(selecteurHeure.Value, "00")
End Sub

' // Gérer le changement des minutes avec le bouton Spin
Private Sub selecteurMinute_Change()
    minuteSaisie.Value = Format$(selecteurMinute.Value, "00")
End Sub

' //
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    'vbFormControlMenu  0   L'utilisateur a choisi la commande Fermer dans le menu Système du formulaire utilisateur.
    'vbFormCode         1   L'instruction Unload est appelée à partir du code.
    'vbAppWindows       2   La session active de l'environnement d'exploitation Windows se termine.
    'vbAppTaskManager   3   Le Gestionnaire de tâches de Windows ferme l'application.
     Select Case CloseMode
        Case vbFormControlMenu, vbFormCode
            Cancel = True
            Me.Hide
     End Select

End Sub

Et la procédure d'appel revisitée :(il y avait quelques erreurs).

Sub ShowTimePicker()
    Dim TimePicker As Frm_TimePicker                            '// VBA n'aime pas trop les affectations directe
    Set TimePicker = New Frm_TimePicker ' // Faites le en deux fois
    With TimePicker
        '// On utilise la propriété Let pour mettre le formulaire à jour de l'eure
        .SelectedTime = "10:12 AM"
        ' // Afficher le formulaire
        .Show
        ' // Récupérer l'heure sélectionnée ici on utilis plutôt une propriété pour éviter de casser l'encapsulation.
        If .SelectedTime > vbNullString Then
            MsgBox "Vous avez sélectionné : " & .SelectedTime, vbInformation, "Sélecteur d'Heure"
        Else
            MsgBox "Sélection de l'heure annulée.", vbExclamation, "Sélecteur d'Heure"
        End If
    End With

    ' // Le formulaire est caché on peut maintenant le fermer
    Unload TimePicker

End Sub

Cet exemple est avec du texte comme vous l'aviez commencé. mais il vaudrait mieux utiliser des dates.

Merci Lou Reed,

De mon ancien métier "Horloger" , le décompte des 1440 ne m'a pas surpris. De plus cette méthode aura un intérêt certains dans certaines de mes appli. Merci Beaucoup.

Merci Jean Paul,

cette modification en profondeur de ma première tentative est précieuse. D'autant plus par les nombreux commentaires très pédagogiques qui m'apprennent beaucoup. Ce qui nous manque le plus à nous les novices c'est la connaissance des finesses du langage.

J'avais entretemps progressé sur la mise en ordre des formules et de la méthode de programmation qui au final s'approchait un peu de la tienne. Mais ta version est tellement complète et pédago que du coup j'ai plus rien à faire. Merci Beaucoup

Cordialement à vous deux

Jean-Jacques

Bonsoir Jean-Jacques, le Fil,

Un exemple avec un TextBox renseigné en mode rapide horaire (Survol souris) permettant la sélection d'horaire. Sans sélecteur Spin ou Scrollbar.

Adaptable selon besoin. Voir notes sur la première feuille du fichier ci-dessous.

4rapideheure.xlsm (27.21 Ko)

Bonsoir Jean Paul,

Je ne voudrais pas abuser mais après recherche je ne trouve pas grand chose.

Je bute sur l'utilisation des property let ou get et de cette notion d'encapsulation. Leur fonctionnement efficace m' intéresse beaucoup mais reste abstraite. Pourriez vous m'indiquer un post explicatif parce que je n'ai pas trouvé ?

cordialement

Très puissante cette méthode Bravo Jan Paul,

Par contre je plante à chaque fois sur cette ligne

Bonne journée Bien cordialement

Jean-Jacques

If Len(TbxH.Text) = 5 And X < 40 Then ActiveCell = TimeValue(Hortxt & ":00"): Unload USFrapid

image

Bonsoir Jean-Jacques,

Pour la ligne de code que tu présentes rajoute le caractère = après le caractère <

Sinon montre moi la partie du code surlignée où se produit le bug.

Cordialement.

Bonjour à tous,

Très puissante cette méthode Bravo Jan Paul,

Par contre je plante à chaque fois sur cette ligne

Bonne journée Bien cordialement

Jean-Jacques

If Len(TbxH.Text) = 5 And X < 40 Then ActiveCell = TimeValue(Hortxt & ":00"): Unload USFrapid

image

Concernant, les Instruction Property Get et Let vous avez les explications de Crosoft Ici. Mais imaginez vous contruisez et accédez aux propriétés comme pour un contrôle "Valu par exmple". vous pouvez soit lire 'Get' soit définir 'Let' la valeur de la propriété si vous avez besoin quel garde son état entre les appel déclarez la en 'Static'.
Concernant votre problème, cela vient sûrement du fait que vous voulez assigner une valeur dont le type ne correspond pas. Vba est complaisant mais vous devez apprendre à être strict dans vos déclarations, Utilisez par exemple Cdate, Cstring, Clng.... pour convertir les valeurs de vos variables.

Merci pour votre retour, mais en fait le plantage se produit en utilisant votre exemple sans que j'aie changé quoi que ce soit dans votre code.

Je suppose que j'ai tenté sans le savoir de saisir un horaire incohérent en survolant les différentes options.

Merci pour l'explication et le lien de documentation

Cordialement Jean Jacques

Rechercher des sujets similaires à "selecteur heure"