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.