Problème de reconnaissance de date sous VBA Excel 2007
tykenta83
Messages postés
4
Statut
Membre
-
cs_Le Pivert Messages postés 8437 Statut Contributeur -
cs_Le Pivert Messages postés 8437 Statut Contributeur -
Bonjour
Je n'arrive pas à comprendre pourquoi le contrôle suivant ne marche qu'à moité :
Dim sdate as string
If Not Date(sdate) Then
MsgBox "Date non conforme"
EndIf
Le message est bien renvoyé pour
sdate = "35/10/2015" ou "29/02/2015",
Mais il n'est pas renvoyé pour
Sdate = "01/14//2015 ou "01/02/1032"
Quelqu'un peut-il m'expliquer ce que j'ai mal fait?
Je n'arrive pas à comprendre pourquoi le contrôle suivant ne marche qu'à moité :
Dim sdate as string
If Not Date(sdate) Then
MsgBox "Date non conforme"
EndIf
Le message est bien renvoyé pour
sdate = "35/10/2015" ou "29/02/2015",
Mais il n'est pas renvoyé pour
Sdate = "01/14//2015 ou "01/02/1032"
Quelqu'un peut-il m'expliquer ce que j'ai mal fait?
A voir également:
- Problème de reconnaissance de date sous VBA Excel 2007
- Save as pdf office 2007 - Télécharger - Bureautique
- Liste déroulante excel - Guide
- Nombre de jours entre deux dates excel - Guide
- Reconnaissance musique en ligne sans télécharger - Guide
- Word et excel gratuit - Guide
10 réponses
Bonjour,
Merci de ta réponse, mais c'est effectivement ce que j'avais fait. J'aurais dû faire un copier coller de mon programme au lieu de le recopier "à la main" (oublié le "Is"). Donc cela ne marche toujours pas, as-tu une autre solution?
Merci de ta réponse, mais c'est effectivement ce que j'avais fait. J'aurais dû faire un copier coller de mon programme au lieu de le recopier "à la main" (oublié le "Is"). Donc cela ne marche toujours pas, as-tu une autre solution?
Chez moi cela fonctionne très bien!
Pourquoi voudrais tu qu'il te renvoie non conforme pour cette date?
"01/02/1032"
Pourquoi voudrais tu qu'il te renvoie non conforme pour cette date?
"01/02/1032"
Je pensais qu'excel ne prenait en compte que les années à partir de 1900. Comme j'avais un problème sur le test du mois, je voulais voir si'il y avait un problème sur le test de l'année. En ce qui concerne le test sur le mois, cela ne marche pas comme cité dans mon 1er message. c'est d'autant plus surprenant qu'en fait, le mois et l'année sont pris en compte, car si je tape 29/02/2015, il me dit que ce n'est pas conforme et pour 29/02/2106, il ne me le dit pas; il a donc reconnu le mois de février et l'année. D'autre part, si je tape 01/14/2015 dans une cellule excel, il me la cale à gauche, ce qui signifie qu'excel ne la considère pas comme une date, mais comme une chaîne de caractères.
Je suis dans une impasse
Je suis dans une impasse
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
comme ceci:
Dim sdate As String
sdate = "29/02/2016"
If Not IsDate(sdate) Then
MsgBox "Date non conforme"
Else
Range("A1") = Format(sdate, "dd/mm/yyyy")
Selection.NumberFormat = "dd/mm/yyyy;@"
End If
Bonjour,
Effectivement avec ce nouveau code , ça marche. Mais 4 interrogations:
1. Je ne comprends pas comment le programme après être arrivé dans "Else", puisse remonter pour afficher le message.
2. Cela ne résous pas complètement mon problème, car je ne veux pas afficher la date dans une cellule; je suis dans une "userbox" et je veux simplement vérifier qu'une date saisie dans une de ses text.box est bien une date effective.
3. Peux-tu me confirmer que le code sans le bloc "Else" marche dans ton excel?
4. Pourquoi, sans le bloc "Else", VBA considère que 29/02/2016 est un bonne date, 01/35/2015 une mauvaise, 35/12/2015,une mauvaise et que 01//14/2015 est une bonne?
Effectivement avec ce nouveau code , ça marche. Mais 4 interrogations:
1. Je ne comprends pas comment le programme après être arrivé dans "Else", puisse remonter pour afficher le message.
2. Cela ne résous pas complètement mon problème, car je ne veux pas afficher la date dans une cellule; je suis dans une "userbox" et je veux simplement vérifier qu'une date saisie dans une de ses text.box est bien une date effective.
3. Peux-tu me confirmer que le code sans le bloc "Else" marche dans ton excel?
4. Pourquoi, sans le bloc "Else", VBA considère que 29/02/2016 est un bonne date, 01/35/2015 une mauvaise, 35/12/2015,une mauvaise et que 01//14/2015 est une bonne?
A mettre dans un bouton
Dim sdate As String sdate = TextBox1.Value If Not IsDate(sdate) Then MsgBox "Date non conforme" Else TextBox1.Value = Format(TextBox1.Value, "dd/mm/yyyy") End If
Bonjour
Non cela ne marche pas chez moi. En fait la commande "Format" me transpose ma date 02/14/2015 en 14/02/2015 et bien sûr cette date est valide! A bout d'arguments j'ai opté pour le code suivant :
If Not IsDate(sdate) Or Mid(sdate, 4, 2) > 12 Then
MsgBox "Date non conforme"
End If
Mais je suis frustré, intellectuellement parlant.
Merci beaucoup de m'avoir aidé, en tous cas.
Non cela ne marche pas chez moi. En fait la commande "Format" me transpose ma date 02/14/2015 en 14/02/2015 et bien sûr cette date est valide! A bout d'arguments j'ai opté pour le code suivant :
If Not IsDate(sdate) Or Mid(sdate, 4, 2) > 12 Then
MsgBox "Date non conforme"
End If
Mais je suis frustré, intellectuellement parlant.
Merci beaucoup de m'avoir aidé, en tous cas.
Pour être sur que la saisie d'une date est valide, il y a le contrôle datepicker:
http://www.excelabo.net/excel/datepicker_2010
http://www.excelabo.net/excel/datepicker_2010
voici un exemple pour forcer la saisie d'une date dans un TextBox:
Option Explicit
Dim Masque, Caractère, Séparateur, St As String
Dim ChrsAffichés, Compteur, Longueur, i, Rt As Integer
Dim ToucheSupp As Boolean
Private Sub CommandButton1_Click()
Dim sdate As String
sdate = TextBox1.Value
If Not IsDate(sdate) Or Mid(sdate, 4, 2) > 12 Then
MsgBox "Date non conforme"
Else
TextBox1.Value = Format(TextBox1.Value, "dd/mm/yyyy")
Me.Caption = "La date saisie " & TextBox1.Tag & " est correcte"
End If
End Sub
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
SelectNext
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If IsNumeric(Chr(KeyAscii)) = True Then
TextBox1.Tag = TextBox1.Tag & Chr(KeyAscii)
Formate
End If
KeyAscii = 0
End Sub
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 46 Then
Formate
ElseIf KeyCode = 8 Then
St = TextBox1.Tag
If Len(St) > 0 Then
St = Replace(St, Séparateur, "")
St = Left(St, Len(St) - 1)
TextBox1.Tag = St
Formate
End If
End If
SelectNext
End Sub
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
SelectNext
End Sub
Private Sub SelectNext()
St = TextBox1.Tag
St = Replace(St, Séparateur, "")
Compteur = 0
'On sélectionne le prochain emplacement
For i = 1 To Len(TextBox1.Text)
If Mid(TextBox1.Text, i, 1) <> Séparateur Then
Compteur = Compteur + 1
If Compteur > Len(St) Then
TextBox1.SetFocus
TextBox1.SelStart = i - 1
TextBox1.SelLength = 0
Exit For
End If
End If
Next i
'Le contenu de textbox1.Tag est prêt à être utilisé
If Len(TextBox1.Tag) = Len(Masque) Then
TextBox1.SelStart = Len(TextBox1.Text)
TextBox1.SelLength = 0
End If
End Sub
Private Sub Formate()
i = 0
St = ""
'On supprime les séparateurs
TextBox1.Tag = Replace(TextBox1.Tag, Séparateur, "")
'On remet le tout au format pré-défini
For Rt = 1 To Len(Masque)
If Mid(Masque, Rt, 1) = "#" Then
i = i + 1
If i > Len(TextBox1.Tag) Then Exit For
St = St & Mid(TextBox1.Tag, i, 1)
Else
St = St & Séparateur
End If
Next Rt
TextBox1.Tag = St
'Affichage du chiffre à titre d'exemple
Me.Caption = "La date saisie est: " & TextBox1.Tag
'On remet le textbox1 au même format mais avec les caractères de
'subtituition et en tenant compte des chiffre qui doivent rester visibles
St = ""
TextBox1.Text = ""
i = 0
For Rt = 1 To Len(TextBox1.Tag)
If Mid(TextBox1.Tag, Rt, 1) = Séparateur Then
St = St & Séparateur
Else
i = i + 1
If i > ChrsAffichés Then
St = St & Caractère
Else
St = St & Mid(TextBox1.Tag, Rt, 1)
End If
End If
Next Rt
'On remplit le restant du textbox1 conformément au masque
If Len(TextBox1.Tag) < Len(Masque) Then
For Rt = Len(TextBox1.Tag) + 1 To Len(Masque)
If Mid(Masque, Rt, 1) = Séparateur Then
St = St & Séparateur
Else
St = St & Caractère
End If
Next Rt
End If
TextBox1.Text = St
End Sub
Private Sub CompteChiffres()
Longueur = 0
For i = 1 To Len(Masque)
If Mid(Masque, i, 1) = "#" Then Longueur = Longueur + 1
Next i
End Sub
Private Sub UserForm_Initialize()
Masque = "##/##/####"
ChrsAffichés = "10"
Séparateur = "/"
CompteChiffres
Formate
TextBox1.SelStart = 0
TextBox1.SelLength = 0
TextBox1.MaxLength = Len(Masque)
TextBox1 = Masque
End Sub