XL 2016 Forcer un format nombre après la frappe

ReneDav14000

XLDnaute Occasionnel
Bonjour le forum,
Existe-t-il une méthode qui permettrait d'obliger la saisie d'un format. Je travaille avec un format hh:mm.
Par exemple : Si l'utilisateur tape 6 cela devienne 6:00, si il tape 6,30 cela devienne 6:30, si il tape 6/30 cela devienne 6:30,
si il tape 6.30 cela devienne 6:30. En fait, quel que soit le caractère frappé entre l'heure et les minutes. Cela peut être aussi 6!30 ou 6n30.
Merci par avance pour votre aide
 
Solution
Bonjour à tous,

Toutes les cellules sont au format Texte, voyez le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, x$, i%
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
For Each c In UsedRange 'si entrées multiples
    x = c
    For i = 2 To Len(x)
        If Not IsNumeric(Mid(x, i, 1)) Then
            x = Left(x, i - 1) & ":" & Mid(x, i + 1)
            If IsDate(x) Then c = Format(x, "h:mm")
            Exit For
        End If
Next i, c
Application.EnableEvents = True 'réactive les évènements
End Sub
A+

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour ReneDav,
Un essai en PJ à tester.
VB:
Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Fin: If Target.Count > 1 Then Exit Sub
    Valeur = Target.Value
    For N = 1 To Len(Valeur)
        If Not IsNumeric(Mid(Valeur, N, 1)) Then Exit For   ' On cherche le premier caractère non numérique
    Next N
    Application.EnableEvents = False
    Target = Left(Valeur, N - 1) & ":" & Mid(Valeur, N + 1) ' On reconstruit l'heure
Fin:
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
On cherche dans la chaine le premier caractère non numérique et on lui substitue ":"
Il suffit de taper une chaine dans une cellule quelconque pour faire la traduction.
 

Pièces jointes

  • Gestion heure.xlsm
    13 KB · Affichages: 5

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir,
Exact, j'ai vu, ça le fait avec / et aussi avec -, mais bizarrement pas avec + ou *.
Et je ne vois pas de solution car c'est XL qui le traduit avant que le VBA ne le récupère.
L'autre souci plus gênant est que si vous entrez "titi" alors il le transforme en ":iti" ce qui est logique de par l'algo mais débile dans le fonctionnement.
Et là pour le coup je ne vois pas comment faire. Je ne sais même pas s'il existe une solution.
 

ReneDav14000

XLDnaute Occasionnel
Bonsoir sylvanu,
La solution est peut-être là, donnée par JCGL. Mais je me demande si les ":" passeraient, est-ce considéré comme du numérique ou pas ? Je ferai l'essai plus tard.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour tout le monde,
Sous XL2007, idem, ça marche bien :
20221015_095343.gif
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Toutes les cellules sont au format Texte, voyez le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, x$, i%
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
For Each c In UsedRange 'si entrées multiples
    x = c
    For i = 2 To Len(x)
        If Not IsNumeric(Mid(x, i, 1)) Then
            x = Left(x, i - 1) & ":" & Mid(x, i + 1)
            If IsDate(x) Then c = Format(x, "h:mm")
            Exit For
        End If
Next i, c
Application.EnableEvents = True 'réactive les évènements
End Sub
A+
 

Pièces jointes

  • Classeur(1).xlsm
    16.6 KB · Affichages: 5

Discussions similaires

Statistiques des forums

Discussions
312 242
Messages
2 086 532
Membres
103 243
dernier inscrit
SAH