[RESOLU] Pb VBA date

darkneo51

XLDnaute Nouveau
Bonjour tout le monde, j'ai un petit souci avec une ligne en vba.
Je souhaite inscrire dans un textbox la date, un contrôle m'empêche de saisir autre chose que des chiffres, ainsi que des valeurs absurdes (jour>35 par exemple), cependant, ce bout de code m'empêche de saisir "0" comme premier caractère de mon textbox.
Auriez vous une idée de ce qui cloche svp? Merci beaucoup tout plein d'avance:D

'GESTION DATE
Private Sub TextBox5_Change()
'on veut la date au format "jj/mm/aaaa"
Dim tabVal() As String, jour As String, mois As String, moisS As String, annee As String, mauvaiseSaisie As Boolean
mauvaiseSaisie = False
On Error Resume Next
With TextBox5
'remplace le "." par le "/"
If Mid(.Text, Len(.Text), 1) = "." Then .Text = Mid(.Text, 1, (Len(.Text) - 1)) & "/"
'remplace "X/" par "0X/"
If Mid(.Text, 2, 1) = "/" Then .Text = "0" & .Text
'remplace "XX/X/" par "XX/0X/"
If Mid(.Text, 5, 1) = "/" Then .Text = Mid(.Text, 1, Len(.Text) - 2) & "0" & Mid(.Text, Len(.Text) - 1, 2)
'ajoute le premier "/" si pas présent
If Len(.Text) = 2 And .Text Like "##" Then .Text = .Text & "/"
'ajoute le deuxième "/" si pas présent
If Len(.Text) = 5 And .Text Like "##/##" Then .Text = .Text & "/"
'si ce ne sont pas des chiffres qui ont été saisis
If Not .Text Like Left("##/##/####", Len(.Text)) Then
mauvaiseSaisie = True
End If

'éclater la chaine de caractère
tabVal = Split(.Text, "/")
jour = tabVal(0)
If jour = "" Then jour = "01"
mois = tabVal(1)
If mois = "" Then mois = "01"
moisS = "jan": moisS = Format(DateSerial(2000, mois, 1), "mmm")
annee = tabVal(2)
If annee = "" Then annee = "2000"

'si le mois est supérieur à 12, annuler la dernière saisie
If CLng(mois) > 12 Then
.Text = Left(.Text, Len(.Text) - 2)
Exit Sub
End If
If Len(.Text) = 6 Then .Text = .Text & Year(Date)
'si ce n'est pas une date valide, annuler la dernière saisie
If Not IsDate(DateValue(jour & " " & moisS & " " & annee)) Then
mauvaiseSaisie = True
End If
If mauvaiseSaisie Then
'annuler la saisie du dernier caractère
.Text = Left(.Text, Len(.Text) - 1)
Exit Sub
End If
End With
If Len(TextBox5) = 10 And IsDate(DateValue(jour & " " & moisS & " " & annee)) Then TextBox8.SetFocus
End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Pb VBA date

Bonsoir
'on veut la date au format "jj/mm/aaaa"
À partir de là tout est faux.
Ça n'existe pas une date à un certain format.
On veut une date ou on veut autre chose qu'une date.
À partir du moment où on a réussi à obtenir une date, on peut éventuellement en restituer l'affichage selon un certain format.
Toute cette programmation me semble fortement inutile.
Cordialement.
 

darkneo51

XLDnaute Nouveau
Re : Pb VBA date

Bonjour Dranreb, ce bout de code me sert en fait par la suite à récupérer la date saisie dans ce textbox et à le coller dans une cellule de ma feuille excel. Le but de ce format est d'éviter de récupérer la date avec une inversion des mois et des jours (format US, il me semble).
 

jpb388

XLDnaute Accro
Re : Pb VBA date

Bonjour a vous

Pourquoi ne pas contrôler la textbox a sa sortie ex:

Private Sub TextBox5_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsDate(Me.TextBox1.Value) Then
MsgBox "votre date doit avoir le format jj/mm/aaaa"
End If
End Sub

et pour l'ecriture dans la cellule

[a1].FormulaLocal = Format(Me.TextBox1.Text, "dd/mm/yyyy")

a+
jp
 

CHALET53

XLDnaute Barbatruc
Re : Pb VBA date

bonjour,

Avec ceci, peut-être

Private Sub TextBox5_Change()
Dim Valeur As Byte
Me.TextBox5.MaxLength = 10 'nb caractères maxi autorisé dans le TauxtbAT
Valeur = Len(Me.TextBox5)
If Valeur = 2 Or Valeur = 5 Then Me.TextBox5 = Me.Début & "/"
End Sub


Private Sub TextBox5_AfterUpdate()
If Left(Me.TextBox5, 2) > 31 Or Mid(Me.TextBox5, 4, 2) > 12 Or Not IsNumeric(Right(Me.TextBox5, 4)) Then
réponse = MsgBox("Format Date de fin erroné " & Me.TextBox5 & " Recommencer", vbOK): Me.TextBox5 = ""
End If
Me.TextBox5.SetFocus
End Sub
 

darkneo51

XLDnaute Nouveau
Re : Pb VBA date

Bonjour tout le monde.
Tout d'abord merci pour vos réponses.JPB388, c'est une bonne idée, je vais utiliser cela pour une autre partie de mon appli.
CHALET53, après avoir testé et modifié un peu votre idée, je suis quasi au but, merci beaucoup.
Me reste juste à corriger le textbox.setfocus en fin de sub, placé comme cela, il ne fonctionne pas, mais bon, c'est plus beaucoup de choses à faire, le reste tourne super bien maintenant.
Pour info, voilà le code tel qu'il est maintenant:
'GESTION DATE
Private Sub TextBox5_Change()
Dim Valeur As Byte
Me.TextBox5.MaxLength = 10 'nb caractères maxi autorisé dans le TauxtbAT
Valeur = Len(Me.TextBox5)
If Valeur = 2 Then Me.TextBox5 = Me.TextBox5 & "/"
If Valeur = 5 Then Me.TextBox5 = Me.TextBox5 & "/" & Year(Date)
End Sub
'TESTS DATE
Private Sub TextBox5_AfterUpdate()
If Left(Me.TextBox5, 2) > 31 Or Mid(Me.TextBox5, 4, 2) > 12 Or Not IsDate(TextBox5) Or Not IsNumeric(Right(Me.TextBox5, 4)) Then
réponse = MsgBox("Format Date erroné " & Me.TextBox5 & " Recommencer"): Me.TextBox5 = ""
End If
End Sub
 

CHALET53

XLDnaute Barbatruc
Re : Pb VBA date

Re,

c'est parfait. Tu peux même te faire plaisir en rajoutant le test sur le mois de Février avec jour ne devant pas dépasser 28 ou 29 avec la règle sur l'année :

soit divisibles par 4 mais non divisibles par 100
soit divisibles par 400.

en t'inspirant de cela (aucun contrôle):

Sub macro1()
réponse = InputBox("Merci de saisir l'année")
a = Val(réponse) Mod 4: c = Val(réponse) Mod 100
If réponse Mod 4 = 0 And réponse Mod 100 <> 0 Then MsgBox ("Année bissextile"): GoTo fin
If Val(réponse) Mod 400 = 0 Then MsgBox ("Année bissextile"): GoTo fin
MsgBox ("Année non bissextile")
fin:
End Sub
 

Discussions similaires

Réponses
5
Affichages
244

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz