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 -
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?

10 réponses

  1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour,

    Comme ceci:

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

    0
  2. tykenta83 Messages postés 4 Statut Membre
     
    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
  3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Chez moi cela fonctionne très bien!

    Pourquoi voudrais tu qu'il te renvoie non conforme pour cette date?
    "01/02/1032"
    0
  4. tykenta83 Messages postés 4 Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
  7. tykenta83 Messages postés 4 Statut Membre
     
    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
  8. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
  9. tykenta 83@
     
    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
  10. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
  11. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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