Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
J’ai trouvé sur le FORUM ce vieux fil sur la transformation d’un chiffre en date.
Le code que vous proposez est très intéressant et j’aimerais l’adapter.
J’ai essayé une paire d’heures hier mais sans résultats probants.
C’est pourquoi je fais appel à votre aide aujourd’hui :
-Ce que je voudrais c’est convertir un nombre de 6 (au lieu de 7) ou 8 chiffres
_Le formats de date attendu est de type JJMMAA (bon ça je suis arrivée à le modifier comme une grande)
-Le truc qui me bloque c’est lorsque la valeur de la cellule est différente de ###### ou de ########.
Ce que je souhaiterais dans ce cas c’est donner l’ordre de refuser la valeur saisie avec un msbox d’alerte par exemple.
Par contre comme il n’y a plus d’exit sub il va falloir limiter cette macro aux plages où j’attends une saisie de date (ex colonne 3, 4, 5 et 6).
J’espère que vous pourrez vous pencher sur cette question et m’aider à adapter ce code à mon projet.
Cordialement
Private Sub Worksheet_Change(ByVal Target As Range)
'---Convertit un nombre de 7 ou 8 chiffres en date---
Dim d As Variant
Set Target = Target.Cells(1, 1) 'une seule cellule
d = Target.Value2 'l'idéal serait de connaître la frappe exacte...
If Not (d Like "#######" Or d Like "########") Then Exit Sub
d = Left(Right(d, 6), 2) & "/" & Left(Right(0 & d, 8), 2) & "/" & Right(d, 4) 'mm/dd/yyyy
d = ExecuteExcel4Macro("DATEVALUE(""" & d & """)")
If IsNumeric(d) Then
Target.NumberFormat = "dd/mm/yyyy"
Target = d
Else
Target.NumberFormat = "General"
End If
End Sub
-Ce que je voudrais c’est convertir un nombre de 6 (au lieu de 7) ou 8 chiffres
Dim d As Variant
Set Target = Target.Cells(1, 1) 'une seule cellule
d = Target.Value2 'l'idéal serait de connaître la frappe exacte...
If Not (d Like "#######" Or d Like "########") Then Exit Sub
d = Left(Right(d, 6), 2) & "/" & Left(Right(0 & d, 8), 2) & "/" & Right(d, 4) 'mm/dd/yyyy
d = ExecuteExcel4Macro("DATEVALUE(""" & d & """)")
If IsNumeric(d) Then
Target.NumberFormat = "dd/mm/yyyy"
Target = d
Else
Target.NumberFormat = "General"
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
'---Convertit un nombre en date---
Set Target = Target.Cells(1, 1) 'une seule cellule
If Not IsDate(Target.Value) Then
MsgBox ("ceci n'est pas une date")
Exit Sub
Else
Target.Value = CDate(Target.Value)
Target.NumberFormat = "dd/mm/yy"
End If
End Sub
Je viens de tester ta proposition mais cela ne fonctionne pas chez moi.
Le MSGBOX s'affiche systématiquement (quel que soit la valeur saisie et m^me lorsque je fais un suppress dans une cellule vide). La macro ne transforme pas le chiffre en date et ne positionne pas les / attendus.
Private Sub Worksheet_Change(ByVal Target As Range)
'---Convertit un nombre de 6 ou 8 chiffres en date---
Dim t As Variant, d As Variant
If Intersect(Target, [C2:F65536]) Is Nothing Then Exit Sub 'plage à adapter
Set Target = Target.Cells(1, 1) 'une seule cellule
t = Target.Value2
If IsError(t) Then Exit Sub
If t = "" Then Exit Sub
d = Mid(t, 3, 2) & "/" & Left(t, 2) & "/" & Mid(t, 5) 'mm/dd/yy(yy)
d = ExecuteExcel4Macro("DATEVALUE(""" & d & """)")
Application.EnableEvents = False 'désactive les événements
If IsNumeric(d) And (t Like "######" Or t Like "########") Then
Target.NumberFormat = "ddmmyy" 'le format date qu'on veut
Target = d
Else
MsgBox "Entrée refusée !": Application.Undo 'annule l'entrée
End If
Application.EnableEvents = True
End Sub
Cela fonctionne nickel. Un seul bémol toutefois : lorsque le jour ne comporte qu'un chiffre la macro ne reconnaît pas la date (que l'on mette un zéro ou pas).
Ex 05122010
Je n'arrive pas voir pourquoi.
Il faut dire que cette macro est vraiment très complexe et en même temps géniale
Je vais creuser.
Si une personne du FORUM trouve la solution qu'il n'hésite pas à me la faire savoir.
Cordialement
Merci encore à JOB75 d'avoir pris le temps de répondre à ma demande
Oui, même si l'on entre un 0 en 1er il n'est pas pris en compte (sauf si la cellule est au format Texte).
Il faut ajouter cette ligne :
Code:
If Len(t) = 5 Or Len(t) = 7 Then t = 0 & t
On contrôle donc l'entrée de 5, 6, 7 ou 8 chiffres.
La macro corrigée :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
'---Convertit un nombre de 5, 6, 7 ou 8 chiffres en date---
Dim t As Variant, d As Variant
If Intersect(Target, [C2:F65536]) Is Nothing Then Exit Sub 'plage à adapter
Set Target = Target.Cells(1, 1) 'une seule cellule
t = Target.Value2
If IsError(t) Then Exit Sub
If t = "" Then Exit Sub
If Len(t) = 5 Or Len(t) = 7 Then t = "0" & t
d = Mid(t, 3, 2) & "/" & Left(t, 2) & "/" & Mid(t, 5) 'mm/dd/yy(yy)
d = ExecuteExcel4Macro("DATEVALUE(""" & d & """)")
Application.EnableEvents = False 'désactive les événements
If IsNumeric(d) And (t Like "######" Or t Like "########") Then
Target.NumberFormat = "ddmmyy" 'le format date qu'on veut
Target = d
Else
MsgBox "Entrée refusée !": Application.Undo 'annule l'entrée
End If
Application.EnableEvents = True
End Sub
1) Le test t Like "######" Or t Like "########" est inutile.
En effet il est toujours vrai quand IsNumeric(d) est vrai, donc utiliser :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
'---Convertit un nombre de 5, 6, 7 ou 8 chiffres en date---
Dim t As Variant, d As Variant
If Intersect(Target, [C2:F65536]) Is Nothing Then Exit Sub 'plage à adapter
Set Target = Target.Cells(1, 1) 'une seule cellule
t = Target.Value2
If IsError(t) Then Exit Sub
If t = "" Then Exit Sub
If Len(t) = 5 Or Len(t) = 7 Then t = "0" & t
d = Mid(t, 3, 2) & "/" & Left(t, 2) & "/" & Mid(t, 5) 'mm/dd/yy(yy)
d = ExecuteExcel4Macro("DATEVALUE(""" & d & """)")
Application.EnableEvents = False 'désactive les événements
If IsNumeric(d) Then
Target.NumberFormat = "ddmmyy" 'le format date qu'on veut
Target = d
Else
MsgBox "Entrée refusée !": Application.Undo 'annule l'entrée
End If
Application.EnableEvents = True
End Sub
2) Si l'on entre (ou revalide) de vraies dates (avec slash /), par exemple :
Je viens de tester votre nouvelle proposition c'est vraiment bien.
Par contre votre remarque 2 est effectivement gênante et du coup rend mon projet inexploitable.
Si les utilisateurs ne font pas attention et entrent une date en dur qui se transforme, cela devient dangereux pour la fiabilité des données.
N'existe-t-il pas un moyen d'interdire la saisie de caractères autres que numériques dans cette plage?
Affichage d'un MSGBOX au moment de la frappe par exemple?
En fin j'imagine que si vous m'annoncez que l'anomalie est incontournable c'est que je ne dois pas me faire trop d'illusion.
Merci quand même d'avoir pris du temps.
Cordialement
1) Le test t Like "######" Or t Like "########" est inutile.
En effet il est toujours vrai quand IsNumeric(d) est vrai, donc utiliser :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
'---Convertit un nombre de 5, 6, 7 ou 8 chiffres en date---
Dim t As Variant, d As Variant
If Intersect(Target, [C2:F65536]) Is Nothing Then Exit Sub 'plage à adapter
Set Target = Target.Cells(1, 1) 'une seule cellule
t = Target.Value2
If IsError(t) Then Exit Sub
If t = "" Then Exit Sub
If Len(t) = 5 Or Len(t) = 7 Then t = "0" & t
d = Mid(t, 3, 2) & "/" & Left(t, 2) & "/" & Mid(t, 5) 'mm/dd/yy(yy)
d = ExecuteExcel4Macro("DATEVALUE(""" & d & """)")
Application.EnableEvents = False 'désactive les événements
If IsNumeric(d) Then
Target.NumberFormat = "ddmmyy" 'le format date qu'on veut
Target = d
Else
MsgBox "Entrée refusée !": Application.Undo 'annule l'entrée
End If
Application.EnableEvents = True
End Sub
2) Si l'on entre (ou revalide) de vraies dates (avec slash /), par exemple :
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD