Problème de reconnaissance de date sous VBA Excel 2007

Fermé
tykenta83 Messages postés 4 Date d'inscription mardi 8 décembre 2015 Statut Membre Dernière intervention 10 décembre 2015 - 8 déc. 2015 à 16:32
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 - 12 déc. 2015 à 12:08
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?
A voir également:

10 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 déc. 2015 à 17:02
Bonjour,

Comme ceci:

If Not IsDate(sdate) Then
MsgBox "Date non conforme"
End If

0
tykenta83 Messages postés 4 Date d'inscription mardi 8 décembre 2015 Statut Membre Dernière intervention 10 décembre 2015
9 déc. 2015 à 09:00
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?
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
9 déc. 2015 à 09:08
Chez moi cela fonctionne très bien!

Pourquoi voudrais tu qu'il te renvoie non conforme pour cette date?
"01/02/1032"
0
tykenta83 Messages postés 4 Date d'inscription mardi 8 décembre 2015 Statut Membre Dernière intervention 10 décembre 2015
9 déc. 2015 à 09:48
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
9 déc. 2015 à 10:25
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

0
tykenta83 Messages postés 4 Date d'inscription mardi 8 décembre 2015 Statut Membre Dernière intervention 10 décembre 2015
10 déc. 2015 à 09:26
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?
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
10 déc. 2015 à 15:41
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

0
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.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
12 déc. 2015 à 08:13
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
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
12 déc. 2015 à 12:08
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

0