Optimiser la saisie de la date et heure (VBA)

Bonjour à tous !

J'aimerais optimiser la saisie de la date et de l'heure grâce à du VBA. Je m'explique... J'ai un grand tableau de donnée dans lequel l'utilisateur rentre des données dont la date, l'heure de début et l'heure de fin (une colonne par type de donnée). Il s'agit de rendez-vous.

Je recherche à automatiser la saisie de manière à ce que lorsque l'utilisateur rentre par exemple 0800, Excel retranscrive ceci en 08:00

J'ai déjà un code qui fonctionne (ci-après) pour un userform avec des textbox mais je n'arrive pas à le retranscrire et l'adapter dans la feuille. Est-ce qu'une âme charitable viendrait à mon secours ??

Voici le code mentionnée :

Date :

Private Sub TextBox1_AfterUpdate()

Dim b As String
b = Len(Me.TextBox1)

If b = 4 Then
    Me.TextBox1 = Left(Me.TextBox1, 2) & "/" & Right(Me.TextBox1, 2) & ANNEE
ElseIf b = 6 Then
    Me.TextBox1 = Left(Me.TextBox1, 2) & "/" & Mid(Me.TextBox1, 3, 2) & "/" & Right(Me.TextBox1, 2)
ElseIf b = 8 Then
      Me.TextBox1 = Left(Me.TextBox1, 2) & "/" & Mid(Me.TextBox1, 3, 2) & "/" & Right(Me.TextBox1, 4)
End If

    On Error Resume Next
    Me.TextBox1 = Format(Me.TextBox1, "dd/mm/yyyy") 

End Sub

Heure :

Private Sub TextBox2_AfterUpdate()   

Dim a As String
a = Len(Me.TextBox2)

If a <= 2 Then
    On Error Resume Next
    Me.TextBox2 = Left(Me.TextBox2, a) & ":" & 0
ElseIf a = 3 Then
    Me.TextBox2 = Left(Me.TextBox2, 1) & ":" & Right(Me.TextBox2, 2)
Else
    Me.TextBox2 = Left(Me.TextBox2, 2) & ":" & Right(Me.TextBox2, 2)
End If

    Me.TextBox2 = Format(Me.TextBox2, "hh:mm")

End Sub

Une solution équivalente, sans doute à affiner ...

edit : légère modification ci-dessous

Pour l'heure c'est au top ça marche parfaitement tant que l'on met au moins 3 chiffres comme 800 --> 8:00 mais si on écrit 8, on obtient 00:08 et non 8:00 mais c'est déjà un super avancé merci :)

Par contre, pour la date ça ne fonctionne pas... à moins que je n'ai pas compris quelque chose. Mais j'ai bien l'impression qu'Excel retranscris simplement le nombre en date. Par exemple je mets 120420 (essayant de faire le 12 avril 2020), Excel le transforme en 11/09/2229 ce qui correspond au 120'420e jours après le 01.01.1900...

Par ailleurs, je n'ai pas précisé mais il faut que le format soit en date car cette donnée est réutilisée dans des plannings et dans l'idéal dans le format jjj. jj/mm/aaaa ( mar. 15/12/2020)

Pour la date, si en effet tu ne saisis que 2 chiffres pour l'année, il faudrait alors modifier. Mais il y a un problème de décision quand la date est par exemple 41221 qui pourrait être 4/12/2021 ou 8/11/2012 qui correspond au nombre 41221. Donc pour pouvoir décider, il faut mettre l'année à 4 chiffres, ou passer la colonne A en texte ce qui interdit ensuite de l'utiliser comme date.

Et pour l'heure je pourrais adapter, mais dans ce cas on ne pourra pas saisir 0h10 car je ne pourrai pas faire de différence entre 10h et 10mn. Il faut donc mettre 00 pour les minutes.

J'ai modifié, mais je ne vois pas personnellement d'autres solutions que de mettre l'année à 4 chiffres et les minutes a minima à 00.

68date-heure.xlsm (16.31 Ko)

Ok je vois le soucis avec le format date vs texte. Il faut impérativement que cela reste des formats date et heures.
Est-ce possible de mettre la colonne en format texte et d'ajouter à la fin du code une ligne qui modifie le format en même temps que la valeur dans la cellule ?

Ensuite, je me demande si avec des IF et des LEN(), il n'y a pas un moyen de faire quelque chose...

Par exemple, pour l'heure :
Si la longueur est <=2 alors c'est l'heure et 0 minute ( si 8 --> 8:00, si 10 --> 10:00).
Si la longueur est = 3 alors c'est le chiffre à gauche est l'heure et les deux chiffres à droites sont les minutes (800 --> 8:00 ou 845 --> 8:45)
Si la longueur = 4 alors les deux chiffres de gauches sont les heures et les deux chiffres de droites sont les minutes (1000 --> 10:00)

Et pour les dates dans la même idée :
Si la longueur = 6 alors c'est 1et2 sont les jours, 3et4 sont les mois, 5et6 sont l'année
SI la longueur = 8 alors c'est 1et2 sont les jours, 3et4 sont les mois, 5et6et7et8 sont l'année
SI la longueur = 4 alors c'est 1et2 sont les jours, 3et4 sont les mois & Year(now)

OK pour les heures, si tu es sûr de ne pas avoir besoin de saisir une heure entre minuit et 00:59, on peut modifier (ce qui interdit aussi 24)

If Not Intersect(Target, Columns("B")) Is Nothing Then
    If IsNumeric(Target) And Target >= 1 Then
        If Target >= 100 Then
            txt = Right("0000" & CStr(Target), 4)
            Target = Mid(txt, 1, 2) / 24 + Mid(txt, 3, 2) / 24 / 60
        Else
            txt = Right("00" & CStr(Target), 2) & "00"
            Target = Mid(txt, 1, 2) / 24 + Mid(txt, 3, 2) / 24 / 60
        End If
    End If
End If

En revanche pour les dates (à noter que tu peux aussi saisir 5 chiffres 10121 ou 7 chiffres 1012021 pour le 1/1/2021 = mais ce n'est pas cela le problème), on ne pourrait pas revenir sur une date qui serait alors déjà passée en numérique. J'avais fait des essais de re-saisie et cela devenait inextricable. C'est pourquoi saisir 4 chiffres pour l'année permettait de bien différentier.

La solution -que je n'ai pas encore réussie à mettre en œuvre- c'est d'ouvrir un textbox lors de la sélection de la zone

Bon, j'ai réussi.

Une variante à partir de laquelle on pourrait travailler ...

21date-heure.xlsm (25.41 Ko)

quoique en l'état cela me plait beaucoup, elle reste pure au sens où la cellule reste en format date et la saisie se fait ne mode texte comme tu le préconisait ... la seule amélioration est de saisir les 2 premiers chiffres de l'année (20xx)

Le code pour la date en colonne A

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Count > 1 Then Exit Sub
    If Target.Row = 1 Then Exit Sub

    If Not Intersect(Target, Columns("A")) Is Nothing Then
        With Me.DateBox1
            .Height = Target.Height + 4
            .Width = Target.Width
            .Top = Target.Top - 2
            .Left = Target.Left
            .Value = Target
            .Visible = True
            .Activate
        End With
    Else
        Me.DateBox1.Visible = False
    End If

End Sub

Private Sub DateBox1_KeyPress(ByVal KeyCode As MSForms.ReturnInteger)
    If DateBox1 = "" Then DateBox1 = "__/__/____": DateBox1.SelStart = 0
    If InStr("0123456789", Chr(KeyCode)) = 0 Then KeyCode = 0
    DateBox1.BackColor = vbWhite
    x = Replace(Replace(DateBox1, "_", ""), "/", "") & Chr(KeyCode)
    Select Case True
        Case Len(x) <= 2
            y = Len(x) + IIf(Len(x) = 2, 1, 0)
            x = Left(x & "__", 2) & "/__/____"
        Case Len(x) > 2 And Len(x) <= 4
            y = Len(x) + 1 + IIf(Len(x) = 4, 1, 0)
            x = Mid(x, 1, 2) & "/" & Left(Mid(x, 3, 2) & "__", 2) & "/____"
        Case Len(x) > 4
            y = Len(x) + 2
            x = Mid(x, 1, 2) & "/" & Mid(x, 3, 2) & "/" & Left(Mid(x, 5, 4) & "____", 4)
    End Select
    DateBox1 = x: DateBox1.SelStart = y: t = Split(Replace(x, "_", ""), "/"): KeyCode = 0
    If t(0) > 31 Then DateBox1.BackColor = RGB(255, 128, 128)
    If t(1) <> "" And t(1) > 12 Then DateBox1.BackColor = RGB(255, 128, 128)
    If t(1) <> "" And t(1) <> 0 Then If Not IsDate(t(0) & "/" & t(1) & "/" & "2000") Then DateBox1.BackColor = RGB(255, 128, 128)
    If t(1) <> "" And t(1) <> 0 And Len(t(2)) = 4 Then If Not IsDate(t(0) & "/" & t(1) & "/" & t(2)) Then DateBox1.BackColor = RGB(255, 128, 128)
End Sub

Private Sub DateBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then
        ActiveCell = CDate(DateBox1.Value)
        ActiveCell.Offset(0, 1).Select
    End If
End Sub

Et pour les dates dans la même idée :

Si la longueur = 6 alors c'est 1et2 sont les jours, 3et4 sont les mois, 5et6 sont l'année
SI la longueur = 8 alors c'est 1et2 sont les jours, 3et4 sont les mois, 5et6et7et8 sont l'année
SI la longueur = 4 alors c'est 1et2 sont les jours, 3et4 sont les mois & Year(now)

je ferai demain matin la version strictement conforme à ton cahier des charges

Je ne savais pas qu'on pouvait intégrer une box dans une cellule, c'est fort ça ! Par contre, ça bloque plein de fonctionnalité, je ne peux pas copier les valeurs par exemple ou me déplacer avec les flèches du clavier. Il faudrait que ça le code agisse directement dans la cellule si c'est possible.

Il faudrait que ça le code agisse directement dans la cellule si c'est possible.

Ce n'est pas possible.

On ne peut pas tout avoir, excel a des limites aussi, mais je peux essayer de n'appliquer le code que sur des cellules vierges.

73date-heure.xlsm (24.93 Ko)

Ok je vois, je vais abandonner pour les dates, la saisie automatique des heures que tu as faites sera déjà bien pratique !

Merci beaucoup !!

Rechercher des sujets similaires à "optimiser saisie date heure vba"