Merci Olivier, ça me fait plaisir de voir que ça intérresse quelqu'un d'autre que Jean-Marie et moiSuper travail JNP
.jj/mm/aaaa
Function DateValide(MaChaine As String) As Boolean
Dim oRegExp, Resultat, k, Item
'Application.Volatile 'recalcul automatique
Set oRegExp = CreateObject("vbscript.regexp")
'oRegExp.Pattern = "29/02/((190|210)[48]|(19|20|21)([13579][26]|[2468][048])|200[048])" 'test 29/02
'oRegExp.Pattern = "(0[1-9]|[1]\d|[2][0-8])/02/(190[1-9]|19[1-9]\d|(20|21)\d\d)" 'test février
'oRegExp.Pattern = "(0[1-9]|[12]\d|3[01])/(01|0[3-9]|1[012])/(190[1-9]|19[1-9]\d|(20|21)\d\d)"'autres jours
oRegExp.Pattern = "(0[1-9]|[12]\d|3[01])/(01|0[3-9]|1[012])/(190[1-9]|19[1-9]\d|(20|21)\d\d)|(0[1-9]|[1]\d|[2][0-8])/02/(190[1-9]|19[1-9]\d|(20|21)\d\d)|29/02/((190|210)[48]|(19|20|21)([13579][26]|[2468][048])|200[048])"
oRegExp.Global = True
Set Resultat = oRegExp.Execute(MaChaine)
For k = 0 To Resultat.Count - 1
Set Item = Resultat.Item(k)
Next
If Item = MaChaine Then DateValide = True Else DateValide = False
Set oRegExp = Nothing
Set Resultat = Nothing
Set Item = Nothing
End Function
Function DateValide(MaChaine As String) As Boolean
Dim Resultat, k, Item
'Application.Volatile 'recalcul automatique
With CreateObject("vbscript.regexp")
.Pattern = "(0[1-9]|[12]\d|3[01])/(01|0[3-9]|1[012])/(190[1-9]|19[1-9]\d|(20|21)\d\d)|(0[1-9]|[1]\d|[2][0-8])/02/(190[1-9]|19[1-9]\d|(20|21)\d\d)|29/02/((190|210)[48]|(19|20|21)([13579][26]|[2468][048])|200[048])"
.Global = True
Set Resultat = .Execute(MaChaine)
For k = 0 To Resultat.Count - 1
Set Item = Resultat.Item(k)
Next
End With
If Item = MaChaine Then DateValide = True Else DateValide = False
Set Resultat = Nothing
Set Item = Nothing
End Function
"(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$"
sub isvaliddate {
my $input = shift;
if ($input =~ m!^((?:19|20)\d\d)[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$!) {
# At this point, $1 holds the year, $2 the month and $3 the day of the date entered
if ($3 == 31 and ($2 == 4 or $2 == 6 or $2 == 9 or $2 == 11)) {
return 0; # 31st of a month with 30 days
} elsif ($3 >= 30 and $2 == 2) {
return 0; # February 30th or 31st
} elsif ($2 == 2 and $3 == 29 and not ($1 % 4 == 0 and ($1 % 100 != 0 or $1 % 400 == 0))) {
return 0; # February 29th outside a leap year
} else {
return 1; # Valid date
}
} else {
return 0; # Not a date
}
}
pas plus que les Jean-XXXPS: Apparemment les David sont génétiquement prédisposés au pattern.
La fonction IsDate renvoie la valeur True si l'expression est une date ou peut être reconnue en tant que date ; sinon elle renvoie la valeur False. Dans Microsoft Windows, la plage des dates valides s'étend du 1er janvier 100 au 31 décembre 9999. Les plages varient en fonction des systèmes d'exploitation.
et si on mixait la fonction RegExp avec ce bon vieux VBA pour nous simplifier la tâche ?
Sub test()
If IsDate(ActiveCell.Value) Then MsgBox "date" Else MsgBox "non"
End Sub
Franchement, sans pattern la vie te semblerait bien austèreEt toi, David84, tel Goliath62 (le frère d'Ulysse31), tu veux conjurer le sort en nous faisant miroiter l'an 2199 tout en nous affriolant avec des patterns des plus suggestifs.
Sache que si tel est ton dessein, je veux bien conjurer avec toi et même te faire une place dans mon bunker mais tu devras laisser tes patterns sur le palier.
Function DateValide(MaChaine As String) As Boolean
Dim oRegExp, Resultat
'Application.Volatile 'recalcul automatique
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
.Pattern = "^(0[1-9]|[12]\d|3[01])/(01|0[3-9]|1[012])/(190[1-9]|19[1-9]\d|(20|21)\d\d)|(0[1-9]|[1]\d|[2][0-8])/02/(190[1-9]|19[1-9]\d|(20|21)\d\d)|29/02/((190|210)[48]|(19|20|21)([13579][26]|[2468][048])|200[048])$"
.Global = True
Set Resultat = .Execute(MaChaine)
If .test(MaChaine) = True Then DateValide = True Else DateValide = False
End With
Set oRegExp = Nothing
Set Resultat = Nothing
End Function
Je m'y suis mis et ai fini par comprendre.j'espère que tu as désossé le petit fichier que j'avais commis ICI et qui comprenait un bon nombre de formats de dates ...
Function DateValide(MaChaine As String) As Boolean
'Application.Volatile 'recalcul automatique
With CreateObject("vbscript.regexp")
.Pattern = "^(0[1-9]|[12]\d|3[01])/(01|0[3-9]|1[012])/(190[1-9]|19[1-9]\d|(20|21)\d\d)|(0[1-9]|[1]\d|[2][0-8])/02/(190[1-9]|19[1-9]\d|(20|21)\d\d)|29/02/((190|210)[48]|(19|20|21)([13579][26]|[2468][048])|200[048])$"
.Global = True
DateValide = IIf(.test(MaChaine), True, False)
End With
End Function
Private Sub aquatik(ParamArray MesDates())
Dim i As Byte
For i = 0 To UBound(MesDates)
MsgBox DateValide(CStr(MesDates(i)))
Next i
End Sub
Sub test()
aquatik "David84", "32/02/2011", "29/02/2012", "01/01/2190", "01/01/1901"
End Sub