IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Fonction pour formater une Textbox (Date) [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Par défaut Fonction pour formater une Textbox (Date)
    Bonjour à tous,

    Voilà mon problème : je cherche à réaliser une fonction qui me permette de formater une textbox en format Date, car ayant une multitude de formulaires avec des saisies de date, cela devient lourd de réécrire le code pour chaque textbox.

    J'ai donc réussi pour le moment à réaliser la chose de cette manière (le code fonctionne) :

    - Code de ma fonction (dans un module nommé MaFonction) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Public DateSaisie As Control
     
    Public Function FormaterDate()
     
    If IsNumeric(DateSaisie) Then
     
        If Len(DateSaisie) = 1 Then
     
        DateSaisie = "0" & DateSaisie & "/" & Format(Date, "mm") & "/" & Format(Date, "yyyy")
     
            ElseIf Len(DateSaisie) = 2 Then
            DateSaisie = DateSaisie & "/" & Format(Date, "mm") & "/" & Format(Date, "yyyy")
     
            ElseIf Len(DateSaisie) = 4 Then
            DateSaisie = Left(DateSaisie, 2) & "/" & Right(DateSaisie, 2) & "/" & Format(Date, "yyyy")
     
            ElseIf Len(DateSaisie) = 6 Then
            DateSaisie = Left(DateSaisie, 2) & "/" & Mid(DateSaisie, 3, 2) & "/" & Right(DateSaisie, 2)
     
            ElseIf Len(DateSaisie) = 8 Then
            DateSaisie = Left(DateSaisie, 2) & "/" & Mid(DateSaisie, 3, 2) & "/" & Right(DateSaisie, 4)
     
        End If
     
    End If
     
    End Function
    - Code de mon UserForm1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Private Sub UserForm_Initialize()
     
    TextBox1.Value = Date
    Label2.Caption = WorksheetFunction.Proper(Format(TextBox1.Value, "dddd d mmmm yyyy"))
    TextBox1.SelStart = 0
    TextBox1.SelLength = Len(TextBox1.Text)
     
    End Sub
     
    Private Sub TextBox1_Enter()
     
            TextBox1.Tag = TextBox1
     
    End Sub
     
    Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
     
    Set DateSaisie = TextBox1
     
    MaFonction.FormaterDate
     
    If Not IsDate(DateSaisie) Then
     
        MsgBox "Format de date incorrect", vbCritical + vbOKOnly, "Erreur de saisie"
        DateSaisie = DateSaisie.Tag
        Cancel = True
        DateSaisie.SelStart = 0
        DateSaisie.SelLength = Len(DateSaisie.Text)
     
    End If
     
    End Sub
     
    Private Sub TextBox1_AfterUpdate()
     
    TextBox1.Value = Format(TextBox1.Value, "dd/mm/yyyy")
    Label2.Caption = WorksheetFunction.Proper(Format(TextBox1.Value, "dddd d mmmm yyyy"))
     
    End Sub
    Private Sub CommandButton1_Click()
     
    Range("C4") = TextBox1
    Range("C6") = TextBox2
     
    Unload Me
     
    End Sub
     
    Private Sub CommandButton2_Click()
     
    Unload Me
     
    End Sub
    Maintenant, ce que je souhaiterais, c'est que ce bout de code vienne à la suite de ma fonction et non pas dans l'évènement TextBox1_BeforeUpdate, car cela m'oblige à réécrire le code pour chaque textbox à formater :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If Not IsDate(DateSaisie) Then
     
        MsgBox "Format de date incorrect", vbCritical + vbOKOnly, "Erreur de saisie"
        DateSaisie = DateSaisie.Tag
        Cancel = True
        DateSaisie.SelStart = 0
        DateSaisie.SelLength = Len(DateSaisie.Text)
     
    End If
    Or, si j'ajoute ce code dans ma fonction, je n'obtiens pas l'effet escompté. C'est à dire que les propriétés "Cancel", "SelStart" et "SelLength" ne s'appliquent pas (alors que la msgbox s'affiche et le tag fonctionne), et je perds le focus de ma Textbox1 en cas d'erreur de saisie

    Ma question est donc la suivante : Est-il possible d'intégrer ce bout de code à ma fonction ? Ou suis-je obligé de le laisser dans l'évènement BeforeUpdate ?

    J'espère que je me suis fait comprendre et merci d'avance à tous ceux qui liront ce post.

    Japeth

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour JapethTheGoat,

    J'avais réalisé ce bout de code il y a quelque temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Private Sub TextBoxDate_Change()
    Dim strFormat As String
    Dim jour As Integer
    Dim mois As Integer
    Dim annee As Integer
     
    strFormat = "##/##/####"
     
    If Me.TextBoxDate Like strFormat Then
     
        jour = Left(Me.TextBoxDate, 2)
        mois = Mid(Me.TextBoxDate.Value, 4, 2)
        annee = Right(Me.TextBoxDate, 4)
     
        If IsDate(Me.TextBoxDate) Then
            With Worksheets("ma_feuille")
                 'je fais ce que je veux
            End With
        End If
     
    End If
     
    End Sub
    Je ne sais pas si ça peut servir, mais a tout hasard, ça n'a pas l'air très loin de ce que tu veux faire.

    En fait ici, je suis dans le TextBoxDate_Change qui est donc appelé à chaque fois que tu changes ta TextBox (dès que tu insères ou supprimes un caractère quoi ! ).
    L'idée de cette fonction, c'est que tu ne passes dans la condition qu'au moment où tu as une date du type "jj/mm/aaaa".

    Voila, n'hésite pas à revenir vers moi !

    Cordialement,
    Kimy

  3. #3
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Par défaut
    Bonjour Kimy,

    Merci pour ta réponse.

    En fait pour le moment mon code fonctionne et répond à mes attentes, le but étant formater la date sans avoir à la saisir dans sa totalité
    (ex : Si tu tapes 15, le contenu de la textbox devient automatiquement 15/03/2015).

    Ce que je souhaite, c'est plutôt que de devoir retaper le code dans chaque Textbox devant être formatée de la sorte (je dois en avoir au minimum une dizaines !), c'est de passer par une fonction en dehors du code de mon userform.

    J'espère que je me fais comprendre, c'est pas forcément évident !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je comprends pas bien, tu veux valider un textbox pour pour définir si ces une date True/False?

    hors IsDate(1235) retourne true oui c'est un date! If isdate(12345)=true and instr(1,"12345","/")<>0 then msgbox "Oui c'est une date" là ça te dit si c'es vraiment une date.

    et tu parle de format! quel format? le format date dans un contrôle de ton UserForm? ou un format valide pour un cellule Excel? là c'es pas la même chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
    If ValideDate(1235) = False Then MsgBox "ERR"
    If ValideDate("01/01/2015") = False Then MsgBox "ERR"
    If ValideDate("01/01/2015", "yyyy-mm-dd") = False Then MsgBox "ERR" 'Format date pour une cellule Excel!
    End Sub
    Function ValideDate(d, Optional Forma As String = "dd/mm/yyyy")
        If IsDate(d) = True And InStr(1, d, "/") <> 0 Then ValideDate = Format(d, Forma): Exit Function
        ValideDate = False
    End Function

  5. #5
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Par défaut
    Bonjour rdurupt,

    Merci de t'intéresser à mon problème.

    En fait j'ai sûrement embrouiller tout le monde avec mes histoires de dates, car à ce niveau là, mon code fonctionne.

    Ce que je souhaite, c'est qu'en cas d'erreur de saisie, le focus reste dans ma textbox. Donc que le bout de code suivant soit intégré à ma fonction, et pas dans le code de mon userform (car il marche parfaitement dans le Userform):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If Not IsDate(DateSaisie) Then' Ici Isdate mais ça pourrait tout aussi bien être une autre condition
     
        MsgBox "Format de date incorrect", vbCritical + vbOKOnly, "Erreur de saisie"
        DateSaisie = DateSaisie.Tag
        Cancel = True
        DateSaisie.SelStart = 0
        DateSaisie.SelLength = Len(DateSaisie.Text)
     
    End If
    Le problème, c'est que lorsque j'ajoute ce code à ma fonction, il me retourne bien une erreur "Format de date incorrect" en cas d'erreur, il reprend bien le tag du Textbox_Enter, mais perd le focus (comme si les instructions Cancel, SelStart, et SelLenght étaient ignorées) !

    Je peux joindre un fichier si besoin.

    Merci en tout cas pour vos recherches !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Cancel vas annuler la saisie pas redonner le focus a ton contrôle.

    de plus, tu ne peux pas données le focus à un contrôle au moment ou tu choisie dans sortir! tu ne peux pas faire demi-tour dans l'embrasure de la porte.

    fais ta validation sur le bouton validé et redonne le focus à ton contrôle contrevenant! me.textbox1.focus

  7. #7
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2015
    Messages : 9
    Par défaut
    Effectivement c'est ce que j'avais fait au début, contrôler la saisie avec le bouton OK du formulaire.
    Je voulais le faire directement pendant la saisie pour une question d'ergonomie.

    Néanmoins, j'ai quand même du mal à comprendre pourquoi le code fonctionne lorsqu'il est directement exécuté dans l'évènement TextBox1_BeforeUpdate, et pas dans ma fonction, qui pourtant est bien appelée dans ce même évènement.

    Je me laisse encore quelques jours de recherche avant de clôturer ce topic, j'y crois encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 25/06/2014, 16h06
  2. [AC-2003] Problème pour formater une date.
    Par miniwho dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/06/2013, 11h56
  3. [MySQL] une fonction pour décrémenter une date
    Par bigs3232 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/01/2012, 10h17
  4. Fonction pour charger une chaine formaté
    Par dxdiag dans le forum Débuter
    Réponses: 5
    Dernier message: 08/02/2008, 21h35
  5. [langage] cherche script pour formater une chaine
    Par MASSAKA dans le forum Langage
    Réponses: 7
    Dernier message: 12/11/2003, 12h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo