Userform : Quel est le code pour mettre en FORMAT DATE une Textbox ?

  • Initiateur de la discussion Manuella
  • Date de début
M

Manuella

Guest
Bonjour,

quel code dois-je écrire pour avoir un format date de type dd/mm/yyyy dans une textbox et qu'il comprenne bien que c'est une date (car ensuite j'ai des calculs à faire).

Merci d'avance de votre aide,

Manuella
 
A

Arnaud

Guest
salut,

tu peux à la suite de la saisie vérifier si ce qui a été saisi est une date grace a la fonction IsDate(expression) qui te renvoi true si c'est une date et false sinon.
et le plus simple est que tu stock cette valeur dans une variable de type variant comme ça la variable s'adaptera a ton type de donné pour éviter que ça plante si c'est pas une date.
 
@

@+Thierry

Guest
Bonjour Manuella, Arnaud, le Forum

Je ne partage pas l'avis de mettre en déclaration de Variable "As Variant" dans le simple but d'éviter un plantage si la valeur initialisée ne correspond pas au type attendu.

Sinon alors on mets tout en Variant, (ou carrément on ne déclare plus rien du tout) et par conséquent on ne s'étonne pas d'avoir des résultats on ne peut plus aléatoire dans la fiabilité de la petite application que l'on espère développer.

Non, pour ce cas de figure Format Date dans une TextBox avec un retour de Date Valide dans une cellule par exemple (qui est largement commenté dans un tas de Fils de Discussion de ce Forum, faire une recherche...) On doit prendre la responsabilité de déclarer la Valeur attendue, on a deux choix :

Dim TheDateDansLaTextBox As Date

ou

Dim TheDateDansLaTextBox As Long

C'est un peu en fonction des besoins, en général le premier choix est adéquate.

Maintenant une démo toute simpliste :

Matériel Nécessaire
1 UserForm => UserForm1
1 TextBox => TextBox1
1 CommandButton

Option Explicit

Private TheDateDansLaTextBox As Date 'Variable Publique niveau UserForm


Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  With Me.TextBox1
   If .Value = "" Then Exit Sub 'On sort si Vide

    If Not IsDate(.Value) Then
      .SelStart = 0
      .SetFocus
      .SelLength = Len(.Text)
      Cancel = True
    Else
      TheDateDansLaTextBox = .Value
      .Text = Format(.Value, "DD/MM/YYYY")
    End If
End With
End Sub

Private Sub CommandButton1_Click()
If TheDateDansLaTextBox = 0 Then Exit Sub 'On sort si non initialisée

Range("A1") = TheDateDansLaTextBox

MsgBox "Pour Vérifier La Valeur Date, vous venez de Saisir " & _
       Format(TheDateDansLaTextBox, "DDDD, DD MMMM YYYY") & vbCrLf & _
       "Soit " & Date - TheDateDansLaTextBox & " jours de différence avec aujourd'hui"

End Sub


Voilà, là on ne risque pas de planter, vu que l'on ne peut pas sortir de la textBox tant que l'on n'a pas saisi une date correcte...

Bon Appétit
@+Thierry
 
A

Arnaud

Guest
re,

j'avoue utiliser assez frécament des variant et je ne rencontre pas de problème particulier. Après c sur cela dépend des cas mais je trouve que cela t'évite de faire une multitude de test pour détermnier ton type pour ensuite pouvoir l'affecter a la bonne variable ( ce qui n'est pas forcement plus rapide a l'execution ).
Ici je veux bien admettre que vu qu'elle ne souhaite QUE des dates, l'utilisation du variant n'est pas forcement la meilleur solus.....
pour ce qui est de la non déclaration des variables ça je ne fais jamais vu que le code devient vite illisible.....
 
M

Manuella

Guest
J'ai essayé le code mais j'ai toujours le même problème à savoir :

lorsque je saisis une date dans un userform, elle n'est pas dans tous les cas retranscrites de la même manière dans un classeur Excel.
Par exemple :
Si je tape 01/09/2004 => dans le classeur Excel : il interprète 09/01/2004.
Si je tape 15/12/2004 => dans le classeur Excel, il remet bien 15/12/2004.

Pour retrouver le problème, j'ai même inséré une Msgbox pour voir ce qu'il gardait comme info dans le userform avant la copie dans le classeur Excel.
Or dans la msgbox, la date est bonne. Donc c'est uniquement lors de la copie de l'info que j'ai un souci.

Merci d'avance de votre aide ,
 
@

@+Thierry

Guest
Re bonjour Arnaud, Manuella,

En fait, il ne risque pas d'y avoir de ralentissement d'exécution dans ce genre de cas, on parle bien d'un UserForm de saisie. Par contre vu que la fiabilité est entre les mains du User, c'est par une multitude de tests qu'on rendra impossible toute erreur de saisie. Tests qui seront forcément plus rapides que ce que le User peut arriver à saisir.

Pour d'autres cas de figures, (e.g. une boucle sur un grand tableau sur feuille) je ne vois pas non plus où est l'avantage d'utiliser des Variants alors que on est déjà souvent contraint à y faire recours dans les Arrays et autre Items de Collection, mis bout à bout tous ces Variants sont gourmants, selon ce dont on a besoin on peut arriver à "gaspiller " plusieurs fois l'espace de stockage... (Lien supprimé.

Mais comme je dis souvent aussi, VBA offre cette grande souplesse de permettre à tout un chacun de développer selon son style, ses moyens et ses connaissances.

Bon Après Midi
@+Thierry
 

Discussions similaires