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 Subet son paramétrage :
ScrollBar1.Min = 1
ScrollBar1.Max = 1440
ScrollBar1.LargeChange = 1Le 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
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 PropertyJ'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 SubEt 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 SubCet exemple est avec du texte comme vous l'aviez commencé. mais il vaudrait mieux utiliser des dates.