Userform et format de date

  • Initiateur de la discussion Karine
  • Date de début
K

Karine

Guest
Bonjour tout le monde.

Je dois vraiment etre la dernière de cruche ... mais ça fait près de 3 heures que je me prend la tête pour essayer de rentrer une malheureuse date au format jj/mm/aa dans un tableau à partir d'un Userform

Un coup ça me renvoie du texte... un coup ça me met la date au format mm/jj/aa...

Je viens de me taper un kilo de messages contenant le mot "date" ... et pas un ne répond à la question...

Alors... AU SECOURS SUPER XLD !!! parce que là, la nana elle est à deux doigts de s'agacer :)

Si en plus il y avait un courageux (ou une) pour ajouter une ch'tite validation de la date pour éviter les conneries du genre 31 février, ce serait le nirvana !

Merci d'avance aux super-héros de XLD

K.
 

Pièces jointes

  • Userform_Date.zip
    7.6 KB · Affichages: 21
@

@+Thierry

Guest
Bonjour Karine, le Forum

Mais non tu n'es pas une cruche, ne t'inquiète pas on a tous passé un bon moment (voire des nuits blanches) avec ce problème de Date dans une TextBox !!! (ou de valeur numérique, car c'est idem)

Le principe est simple, si on applique un Format à la textBox, on se retouve avec un sbinz quand on retourne la valeur dans une Cellule... Ma solution perso... passer par une variable Date...

Essaie de remplacer ton Private Module par celui-ci :

Dim TheDate As Date '<<<< variable date publique au niveau Private Module du UserForm

'Test en sortie du TextBox, ce test ne laissera pas sortir le UserTnat qu'il n'a pas saisi une date...
Private Sub TextBox_Date_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With Me.TextBox_Date
If .Value = "" Then Exit Sub 'si vide on ne poursuit pas

If Not IsDate(.Value) Then 'si ce n'est pas une date
Cancel = True ' on annule la sortie
.SelStart = 0 ' on fait la sélection en surbrillance avec ces trois lignes
.SetFocus ' ...Suite
.SelLength = Len(.Text) '...Suite
Else ' sinon
TheDate = .Value ' on initialise la variable TheDate
.Value = Format(.Text, "dd/mm/yy") 'on met la textBox au format voulu qu'APRES car çà devient du Texte
End If
End With
End Sub

Private Sub UserForm_Initialize()
TextBox_Date.Value = Format(Date, "dd/mm/yy")
End Sub


'Bouton "Valider"
Private Sub Bouton_Valider_Click()
If Me.TextBox_Date <> "" Then
Range("B7").Value = TheDate
Else
MsgBox "Pas de date indiquée"
End If
End Sub

'Bouton Annuler
Private Sub Bouton_Annuler_Click()
Unload UserForm_Date
End Sub


Normalement tu n'auras plus de souci, y compris pour la validation ...

Bonne fin de journée
@+Thierry
 
C

Chris35

Guest
Bonjour Karine, @Thierry et les autres,

J'utilise personnellement la routine ci-après (avec CDate et IsDate) qui donne d'assez bons résultats, sans tout résoudre.

En effet, si je saisis 31/02/2004 ... elle signale bien l'erreur.

Mais si on saisit 31/02/04 ... la date est interprétée comme étant le 4/02/1931 !!

La solution de Thierry ne fait pas mieux.

Et si quelqu'un a une meilleure solution, Je suis preneur !!

A+

Chris

=======================


Private Sub UserForm_Initialize()
'initialisation du TexBox "Date"
TextBox_Date.Value = Format(Date, "dd/mm/yy")
End Sub


'Bouton "Valider"
Private Sub Bouton_Valider_Click()

If IsDate(TextBox_Date) Then
Range("B7") = CDate(TextBox_Date)
Else: Msg = MsgBox("Veuillez entrer une date valide.", vbOKOnly, "Erreur")
End If
End Sub

'Bouton Annuler
Private Sub Bouton_Annuler_Click()
Unload UserForm_Date
End Sub
 

Pièces jointes

  • UserformDate.zip
    8 KB · Affichages: 23
  • UserformDate.zip
    8 KB · Affichages: 23
  • UserformDate.zip
    8 KB · Affichages: 24
@

@+Thierry

Guest
Bonjour Chris, Karine (qu'on a plus revue) et le Forum

J'espère que vous passez un bon dimanche !

Ah oui c'est tout a fait exact le coup du 31/02/04 qui se transforme par miracle en 4 février 1931 !! c'est quand même beau !!!

Oui, en fait je pense que cette facilité d'interpréter les dates au format court de deux digits pour les années peut parfois engendrer des surprises. Pour ma part si je dois développer une appli où une date erronée pourrait causer de graves répercussions, j'oblige alors le user à saisir en Format Date Long avec un Label l'indiqunat clairement : "Format à Saisir DD/MM/YYYY"

Et ensuite il n'y qu'à mettre ce code :
Private Sub TextBox_Date_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With Me.TextBox_Date
If .Value = "" Then Exit Sub
If Not IsDate(.Value) Or Len(.Text) = 8 Then
Cancel = True
.SelStart = 0
.SetFocus
.SelLength = Len(.Text)
Else
TheDate = .Value
End If
End With
End Sub

Bien sûr les users ralent de taper 2 chiffres en plus mais au moins comme çà pas de risque de "retour vers le future" inopiné !! lol

Sinon on peut jongler pour se faire copain avec les Users, mais à vos risques et périls....

Dim TheDate As Date

Private Sub TextBox_Date_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Twolast As Byte
With Me.TextBox_Date
If .Value = "" Then Exit Sub

If Len(.Text) = 8 Then
Twolast = Right(.Text, 2)
If Twolast <= Right(Date, 2) Then
.Value = Left(.Text, 6) & "20" & Format(Twolast, "00")
Else
.Value = Left(.Text, 6) & "19" & Format(Twolast, "00")
End If
End If

If Not IsDate(.Value) Then
Cancel = True
.SelStart = 0
.SetFocus
.SelLength = Len(.Text)
Else
TheDate = .Value
End If
End With
End Sub

Et sinon il y a aussi la méthode de Ti que l'on pourrait combiner à ceci !!! et alors le user ne tape que très peu !! lol

Private Sub TextBox_Date_Change()
Dim Texte As String
With TextBox_Date
Texte = .Text
Select Case Len(Texte)
Case 2, 5
Texte = Texte & "/"
End Select
.Text = Texte
End With
End Sub

Bon Dimanche à Tous et Toutes
@+Thierry
 
M

myDearFriend

Guest
Bonjour Karine, Thierry, Chris35 et le Forum.

Pour les problèmes de saisie et d'interprétation de dates dans un TextBox, ci-joint un petit exemple qui pourrait être une solution (c'est ce que j'ai l'habitude d'utiliser pour ma part).


On peut saisir la date sous 3 formats : jjmmaa, jj/mm/aa et jj/mm/aaa.


A l'évènement KeyPress du TextBox, une fonction restreint les caractères saisissables (seuls les caractères numériques et le "/" sont autorisés)

Public Function AutoriseFrappe(ByVal K As Integer) As Integer
'Autorise uniquement les touches numériques et /
Select Case K
Case Is < 47, Is > 58
K = 0
End Select
AutoriseFrappe = K
End Function


Lorsque le TextBox perd le focus, un appel à la fonction "FormatDate" reformate automatiquement la saisie sous la forme jj/mm/aaa :

Public Function FormatDate(D As String) As String
Dim AnneeBascule As Byte
'Siècle = 2000 si année compris entre 00 et 49, sinon siècle = 1900
AnneeBascule = 49
'Reformatage de la saisie
Select Case Len(D)
Case 6 'Saisie sous la forme jjmmaa
D = Left(D, 2) & "/" & Mid(D, 3, 2) & "/" & IIf(Val(Right(D, 2)) > AnneeBascule, "19", "20") & Right(D, 2)
Case 8 'Saisie sous la forme jj/mm/aa
D = Left(D, 6) & IIf(Val(Right(D, 2)) > AnneeBascule, "19", "20") & Right(D, 2)
End Select
FormatDate = D
End Function

Cordialement.
Didier
 

Pièces jointes

  • mDF_txtDATE.zip
    14.6 KB · Affichages: 34
  • mDF_txtDATE.zip
    14.6 KB · Affichages: 34
  • mDF_txtDATE.zip
    14.6 KB · Affichages: 35
@

@+Thierry

Guest
Hello Didier !!

Et bien on s'est télèscop2 à la seconde près, remarque vaut mieux être ponctuel pour des problèmes de dates !!!! lol

Et bien en tout cas même si Karinne ne revient pas, on pourra pas dire qu'on n'a pas de solution sur XLD !!! surtout pour Chris en fait qui avait soulevé ce problème !!

Bon Aprèm
@+Thierry

PS bonne utilisation du IIf
 
E

Eric C

Guest
Bonsoir le forum
Bonsoir Karine (qui n'est tjrs pas revenue), Thierry, Chris35, mDF

En tout cas pour moi ce n'est pas perdu : j'engrange toutes les astuces de professionnels que vous êtes.
Pour Thierry, chaud le match de ce soir....
@ ++ Eric C
 

Statistiques des forums

Discussions
312 502
Messages
2 089 022
Membres
104 006
dernier inscrit
CABROL