FORMAT DATE VBA
Résolu/Fermé
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
-
Modifié par Chris 94 le 27/06/2016 à 16:45
SarahFistol Messages postés 82 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 18 novembre 2022 - 10 juil. 2016 à 20:30
SarahFistol Messages postés 82 Date d'inscription dimanche 6 janvier 2013 Statut Membre Dernière intervention 18 novembre 2022 - 10 juil. 2016 à 20:30
A voir également:
- Vba format date
- Format epub - Guide
- Telecharger format factory - Télécharger - Conversion & Codecs
- Format apfs - Guide
- Hp format tool - Télécharger - Stockage
- Format odt - Guide
9 réponses
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
27 juin 2016 à 17:41
27 juin 2016 à 17:41
Bonjour,
Ce serait plutôt
Non?
Cordialement.
If Len(naval) < 10 Then ctr = False
Ce serait plutôt
If Len(maval) < 10 Then ctr = False
Non?
Cordialement.
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
28 juin 2016 à 16:20
28 juin 2016 à 16:20
Bonjour,
merci à tous les deux mais lorsque je rempli ma textbox je continue d'avoir le message format de date incorrect;
Il doit y avoir une autre erreur dans ma fonction ?
merci à tous les deux mais lorsque je rempli ma textbox je continue d'avoir le message format de date incorrect;
Il doit y avoir une autre erreur dans ma fonction ?
ccm81
Messages postés
10903
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
19 novembre 2024
2 428
Modifié par ccm81 le 28/06/2016 à 16:56
Modifié par ccm81 le 28/06/2016 à 16:56
Bonjour à tous
Peut être plus simple avec la fonction isDate
Dim d As String, OK As Boolean
d = TextBox1.Value
OK = IsDate(d)
MsgBox OK
If OK Then Cells(1, 1) = CDate(d)
Cdlmnt
Peut être plus simple avec la fonction isDate
Dim d As String, OK As Boolean
d = TextBox1.Value
OK = IsDate(d)
MsgBox OK
If OK Then Cells(1, 1) = CDate(d)
Cdlmnt
Merci mais ça ne répond pas a mon besoin :
Il me faut contrôler les fautes de frappes des dates d ou ma fonction.
Mon userform alimente un onglet base de Donnees qui alimente lui même un onglet av des formules.
Pour éviter les erreurs dans mes résultats dues a des erreurs de saisies de dates je dois contrôler à la source (la saisie).
Quelqu un aurait une idée svp pour que la fonction et/ou mas sub fonctionne(nt) ???
Merci par avance
Il me faut contrôler les fautes de frappes des dates d ou ma fonction.
Mon userform alimente un onglet base de Donnees qui alimente lui même un onglet av des formules.
Pour éviter les erreurs dans mes résultats dues a des erreurs de saisies de dates je dois contrôler à la source (la saisie).
Quelqu un aurait une idée svp pour que la fonction et/ou mas sub fonctionne(nt) ???
Merci par avance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
ccm81
Messages postés
10903
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
19 novembre 2024
2 428
Modifié par ccm81 le 30/06/2016 à 18:47
Modifié par ccm81 le 30/06/2016 à 18:47
Déjà la fonction isDate(texte) permet de savoir si texte peut être interprété comme une date ce qui rend inutile
If Len(naval) < 10 Then ctr = False
If Mid(maval, 3, 1) <> "/" Then ctr = False
If Mid(maval, 6, 2) <> "/" Then ctr = False
If CDate(Mid(maval, 4, 2)) > 12 Then ctr = False
sans compter le test sur le jour ...
et si oui, tu es sûr d'avoir une date, tu peux alors affiner sa validité apres l'avoir converti en date avec cdate ....
If Len(naval) < 10 Then ctr = False
If Mid(maval, 3, 1) <> "/" Then ctr = False
If Mid(maval, 6, 2) <> "/" Then ctr = False
If CDate(Mid(maval, 4, 2)) > 12 Then ctr = False
sans compter le test sur le jour ...
et si oui, tu es sûr d'avoir une date, tu peux alors affiner sa validité apres l'avoir converti en date avec cdate ....
ccm81
Messages postés
10903
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
19 novembre 2024
2 428
30 juin 2016 à 19:12
30 juin 2016 à 19:12
par exemple
Private Sub CommandButton1_Click()
Dim dt As String, dok As Boolean
dt = Me.TextBox1.Value
dok = dateok(dt)
MsgBox dok
End Sub
Public Function dateok(dt As String) As Boolean
Dim dok As Boolean, dtest As Date, d As Date
dtest = Sheets(1).Range("A1").Value
dok = True
If IsDate(dt) Then
d = CDate(dt)
If Year(d) > Year(dtest) Then dok = False
Else
dok = False
End If
dateok = dok
End Function
Utilisateur anonyme
30 juin 2016 à 19:16
30 juin 2016 à 19:16
Bonjour SarahFistol,
1) "/" est un seul caractère !
Remplace : If Mid(maval, 6, 2) <> "/" Then ctr = False
par : If Mid$(maval, 6, 1) <> "/" Then ctr = False
2) Test an, mois, jour
' Test du jour : à cause de février, il faut tester si l'année est bissextile
ou non (29 ou 28 jours) ; pour les autres mois, ce sera 31 ou 30 jours.
À toi de faire la suite ! Cordialement. 😊
1) "/" est un seul caractère !
Remplace : If Mid(maval, 6, 2) <> "/" Then ctr = False
par : If Mid$(maval, 6, 1) <> "/" Then ctr = False
2) Test an, mois, jour
Dim an As Integer, mois As Integer an = Val(Right$(maval, 4)): If an < 1900 Or An > WorkSheets("Bd").[A1] Then ctr = False ' remplace 1900 par ton année minimum mois = Val(Mid$(maval, 4, 2)): If mois < 1 Or mois > 12 Then ctr = False
' Test du jour : à cause de février, il faut tester si l'année est bissextile
ou non (29 ou 28 jours) ; pour les autres mois, ce sera 31 ou 30 jours.
À toi de faire la suite ! Cordialement. 😊
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
3 juil. 2016 à 23:56
3 juil. 2016 à 23:56
merci beaucoup pour vos réponses.
comme vous l'aurez remarqué je suis novice. Par soucis de compréhension pouvez-vous m'aider mais à partir de ma proposition car je ne comprends pas toutes les vôtres :-(
@CCM81 : notamment pourquoi parler de commandbutton dans le code alors que j'utilise une textbox !?
@Albkan : J'ai modifié mais ça ne fonctionne toujours pas ! je m'arrache les cheveux :-(
Mon MsgBox revient sans cesse !!!
dans mon user j'ai mis :
Private Sub TextBox1_AfterUpdate()
monctr = verifdate(Me.TextBox1)
If monctr = False Then
Me.TextBox1 = ""
Me.TextBox1.SetFocus '
MsgBox "Veuillez saisir une date au format JJ/MM/AAAA"
End If
End Sub
'jai choisi "AfterUpdate() " car le SetFocus ne fonctionne pas avec "Exit", c'est peut-être ça qui dysfonctionne ?
dans mon module 1 j'ai :
Function verifdate(maval)
Dim monctr As Boolean
Dim an As Integer
Dim mois As Integer
Dim jour As Integer
Dim annee As Integer
If Len(maval) < 10 Then monctr = False
If Mid$(maval, 3, 1) <> "/" Then monctr = False
If Mid$(maval, 6, 1) <> "/" Then monctr = False
an = Val(Right$(maval, 4)):
If an < 2000 Or an > Worksheets("BASE DONNEES").[A1] Then
monctr = False
mois = Val(Mid$(maval, 4, 2)):
If mois < 1 Or mois > 12 Then
monctr = False
jour = Val(Left$(maval, 2)):
If jour < 1 Or jour > 31 Then
monctr = False
Else
Select Case mois
Case Is = 1, 3, 5, 7, 8, 10, 12
If jour > 31 Or jour < 1 Then
monctr = False
End If
Case Is = 4, 6, 9, 11
If jour > 30 Or jour < 1 Then
monctr = False
End If
Case Is = 2
If annee Mod 4 = 0 Or annee Mod 400 = 0 Then
'Annee bisextile
If jour > 29 Or jour < 1 Then
monctr = False
End If
Else
' Annee pas bisextile
If jour > 28 Or jour < 1 Then
monctr = False
End If
End If
End Select
End If
End If
End If
End Function
Merci par avance
comme vous l'aurez remarqué je suis novice. Par soucis de compréhension pouvez-vous m'aider mais à partir de ma proposition car je ne comprends pas toutes les vôtres :-(
@CCM81 : notamment pourquoi parler de commandbutton dans le code alors que j'utilise une textbox !?
@Albkan : J'ai modifié mais ça ne fonctionne toujours pas ! je m'arrache les cheveux :-(
Mon MsgBox revient sans cesse !!!
dans mon user j'ai mis :
Private Sub TextBox1_AfterUpdate()
monctr = verifdate(Me.TextBox1)
If monctr = False Then
Me.TextBox1 = ""
Me.TextBox1.SetFocus '
MsgBox "Veuillez saisir une date au format JJ/MM/AAAA"
End If
End Sub
'jai choisi "AfterUpdate() " car le SetFocus ne fonctionne pas avec "Exit", c'est peut-être ça qui dysfonctionne ?
dans mon module 1 j'ai :
Function verifdate(maval)
Dim monctr As Boolean
Dim an As Integer
Dim mois As Integer
Dim jour As Integer
Dim annee As Integer
If Len(maval) < 10 Then monctr = False
If Mid$(maval, 3, 1) <> "/" Then monctr = False
If Mid$(maval, 6, 1) <> "/" Then monctr = False
an = Val(Right$(maval, 4)):
If an < 2000 Or an > Worksheets("BASE DONNEES").[A1] Then
monctr = False
mois = Val(Mid$(maval, 4, 2)):
If mois < 1 Or mois > 12 Then
monctr = False
jour = Val(Left$(maval, 2)):
If jour < 1 Or jour > 31 Then
monctr = False
Else
Select Case mois
Case Is = 1, 3, 5, 7, 8, 10, 12
If jour > 31 Or jour < 1 Then
monctr = False
End If
Case Is = 4, 6, 9, 11
If jour > 30 Or jour < 1 Then
monctr = False
End If
Case Is = 2
If annee Mod 4 = 0 Or annee Mod 400 = 0 Then
'Annee bisextile
If jour > 29 Or jour < 1 Then
monctr = False
End If
Else
' Annee pas bisextile
If jour > 28 Or jour < 1 Then
monctr = False
End If
End If
End Select
End If
End If
End If
End Function
Merci par avance
Utilisateur anonyme
>
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
Modifié par albkan le 4/07/2016 à 04:18
Modifié par albkan le 4/07/2016 à 04:18
Bonjour SarahFistol,
Tu trouveras ta fonction verifdate dans le Module1 du fichier
Excel 2003 ci-joint : Exercice Sarah Fistol
Voici ton code pour le UserForm :
Private Sub TextBox1_AfterUpdate() If verifdate(Me.TextBox1) Then Exit Sub Me.TextBox1 = "": Me.TextBox1.SetFocus MsgBox "Veuillez saisir une date au format JJ/MM/AAAA", 48, "Date erronée" End Sub
Dis-moi ce que tu en penses, et n'hésites pas à me demander un complément
d'information si nécessaire. Ensuite, si ton problème est réglé, n'oublies pas
d'aller en haut de page pour cliquer sur « Marquer comme résolu », merci !
Cordialement. 😊
Utilisateur anonyme
>
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
4 juil. 2016 à 14:36
4 juil. 2016 à 14:36
Bonjour SarahFistol,
Lis d'abord mon message #12 ; ensuite, j'ai oublié de te préciser ceci :
Quand tu écris une fonction NomX (par exemple), alors :
a) Tu passes à cette fonction tous les arguments que tu veux, comme pour
une sub ; exemple : Function verifdate(maval As String) As Boolean
b) Ta fonction doit retourner une valeur, dont tu indiques le type avec As Type ;
exemple pour verifdate() : Function verifdate(maval As String) As Boolean
c) De plus, comme ta fonction doit retourner une valeur, n'oublies pas de lui
affecter cette valeur de retour avec NomX = ... ; c'est ce que tu as justement
omis de faire : à chaque fois tu affectes monctr = ... mais avant la sortie de
ta fonction, tu aurais dû mettre verifdate = monctr ; cependant, tu verras que
dans mon propre code, je n'ai pas eu besoin d'utiliser monctr car j'affecte
directement verifdate ; en principe, une fonction ne comporte qu'une seule
instruction d'affectation NomX = ... mais compte tenu des spécificités de
cette fonction, il y a plusieurs instructions d'affectation verifdate = ...
N'oublies pas de me dire ce que tu penses de mon code VBA ; si tu as besoin
de plus d'infos, n'hésites pas ; si ton problème est réglé, merci d'aller en haut
de page pour cliquer sur « Marquer comme résolu ».
Cordialement. 😊
Super !!!! c'est exactement ce que je voulais. merciiiii
J'ai plusieurs petites questions :
- Mid$ : à quoi sert le $ ?
- pourquoi déclarer djm en tant que byte et pas integer ou pourquoi ne pas déclarer le mois ... comme byte ?
- pourquoi au sein de "djm = Choose(mois, 31, 0, 31, ..." djm février =0 ?
- "an Mod 4 = 0 And an Mod 400 > 0", je ne comprends pas très bien. "Mod" renvoie à quoi ?
- "If verifdate(Me.TextBox8) Then Exit Sub" comment lis tu ce morceau de Sub ?
- Je dois utiliser cette sub pour plusieurs TextBox. Dois-je répéter le code autant de fois qu'il y a de TextBox ou y a t-il une astuce ?
- par la suite le contenu de mes textbox va alimenter une base de données qui va elle même faire l'objet de calculs poussés du type calculs de délais entre les dates. Les dates vont bien se mettre au format date dans ma base de données ?
Merci bcp
J'ai plusieurs petites questions :
- Mid$ : à quoi sert le $ ?
- pourquoi déclarer djm en tant que byte et pas integer ou pourquoi ne pas déclarer le mois ... comme byte ?
- pourquoi au sein de "djm = Choose(mois, 31, 0, 31, ..." djm février =0 ?
- "an Mod 4 = 0 And an Mod 400 > 0", je ne comprends pas très bien. "Mod" renvoie à quoi ?
- "If verifdate(Me.TextBox8) Then Exit Sub" comment lis tu ce morceau de Sub ?
- Je dois utiliser cette sub pour plusieurs TextBox. Dois-je répéter le code autant de fois qu'il y a de TextBox ou y a t-il une astuce ?
- par la suite le contenu de mes textbox va alimenter une base de données qui va elle même faire l'objet de calculs poussés du type calculs de délais entre les dates. Les dates vont bien se mettre au format date dans ma base de données ?
Merci bcp
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
4 juil. 2016 à 22:32
4 juil. 2016 à 22:32
tout simplement : génial !
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
Modifié par michel_m le 1/07/2016 à 09:01
Modifié par michel_m le 1/07/2016 à 09:01
Bonjour,
source:
https://silkyroad.developpez.com/VBA/ControlesUserForm/#LII-E
le "/" est écrit par le code lors de la saisie
a la rigueur , après
TextBox1 = ""
tu peux programmer un "set focus" pour retourner sur le textbox; tu as les explications sur le lien indiqué
Michel
source:
https://silkyroad.developpez.com/VBA/ControlesUserForm/#LII-E
le "/" est écrit par le code lors de la saisie
Private Sub TextBox1_Change()
Dim Valeur As Byte
TextBox1.MaxLength = 10 'nb caractères maxi autorisé dans le textbox
Valeur = Len(TextBox1)
If Valeur = 2 Or Valeur = 5 Then TextBox1 = TextBox1 & "/"
End Sub
'Ensuite pour vérifier que c'est bien une date qui a été saisie
Private Sub CommandButton1_Click()
If Not IsDate(TextBox1) Then
MsgBox "Format incorrect"
TextBox1 = ""
Exit Sub
Else
MsgBox "Format correct"
'...la suite de la procédure
End If
End Sub
a la rigueur , après
TextBox1 = ""
tu peux programmer un "set focus" pour retourner sur le textbox; tu as les explications sur le lien indiqué
Michel
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
4 juil. 2016 à 00:05
4 juil. 2016 à 00:05
merci Michel !
j'ai téléchargé le fichier à partir du lien indiqué et lorsque j' entre une date la msgbox me dit que la date n'existe pas ...
j'ai téléchargé le fichier à partir du lien indiqué et lorsque j' entre une date la msgbox me dit que la date n'existe pas ...
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
>
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
Modifié par michel_m le 4/07/2016 à 09:34
Modifié par michel_m le 4/07/2016 à 09:34
Bonjour Sarah,
Curieux! je viens d'essayer sur une petite maquette et c'est OK
le piège quand on a pas l'habitude est que les "/" se mettent automatiquement
mais la syntaxe écrite doit être
jjmmaaaa qui renvoie jj/mm/aaaa
A l'époque où l'auteur a écrit cette astuce, il était MVP (Most Valuable Professionnal- titre annuel décerné par MS aux meilleurs exceliens)
remarque "au cas où":
les dates sur XL commencent à partir du 1° janvier 1900
La maquette de W
http://www.cjoint.com/c/FGehavOp7dt
Edit 9h30
si tu n'as pas de commandbutton
tu peux employer
Private Sub TextBox1_AfterUpdate()
au lieu de
Private Sub CommandButton1_Click()
il faudra alors cliquer sur un autre contrôle pour déclencher la vérif
Mais, en général, lorsqu'on saisit une série de données dans un Usf pour les envoyer dans une feuille, il ya un commandbutton "valider"
Curieux! je viens d'essayer sur une petite maquette et c'est OK
le piège quand on a pas l'habitude est que les "/" se mettent automatiquement
mais la syntaxe écrite doit être
jjmmaaaa qui renvoie jj/mm/aaaa
A l'époque où l'auteur a écrit cette astuce, il était MVP (Most Valuable Professionnal- titre annuel décerné par MS aux meilleurs exceliens)
remarque "au cas où":
les dates sur XL commencent à partir du 1° janvier 1900
La maquette de W
http://www.cjoint.com/c/FGehavOp7dt
Edit 9h30
si tu n'as pas de commandbutton
tu peux employer
Private Sub TextBox1_AfterUpdate()
au lieu de
Private Sub CommandButton1_Click()
il faudra alors cliquer sur un autre contrôle pour déclencher la vérif
Mais, en général, lorsqu'on saisit une série de données dans un Usf pour les envoyer dans une feuille, il ya un commandbutton "valider"
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
>
sarahfistol
4 juil. 2016 à 22:36
4 juil. 2016 à 22:36
@Michel :
et oui en effet, j'ai un commandbutton "valider" pour enregistrer toutes les données de mes controls dans ma base de données.
Désolée, je n'avais pas fait le lien ... j'étais restée sur ma TextBox
et oui en effet, j'ai un commandbutton "valider" pour enregistrer toutes les données de mes controls dans ma base de données.
Désolée, je n'avais pas fait le lien ... j'étais restée sur ma TextBox
Pouvez-vous me conseiller des articles ou livres (accessibles aux débutants) à lire ?
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
5 juil. 2016 à 05:38
5 juil. 2016 à 05:38
le + complet mais ca ne se lit pas comme un roman policier:
https://excel.developpez.com/cours/?page=prog#environnement
https://excel.developpez.com/cours/?page=prog#environnement
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
>
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
10 juil. 2016 à 20:29
10 juil. 2016 à 20:29
merci pour les références :-)
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 752
6 juil. 2016 à 08:16
6 juil. 2016 à 08:16
Bonjour tout le monde,
Le sujet est résolu (j'arrive une fois de plus trop tard), mais, voyant que vous utilisez tous un contrôle de saisie à posteriori, j'apporte ma petite contribution pour un contrôle de saisie en temps réel.
Pour cela, il existe la solution d'ucfoutu : ICI. A tester sur un nouvel userform dans un classeur vierge.
Sinon, en passant par des modules de classe (beaucoup plus complexe...), vous pouvez regarder par ICI. Cet exemple implémente plusieurs types de contrôles de saisie pour vos UserForm.
Le sujet est résolu (j'arrive une fois de plus trop tard), mais, voyant que vous utilisez tous un contrôle de saisie à posteriori, j'apporte ma petite contribution pour un contrôle de saisie en temps réel.
Pour cela, il existe la solution d'ucfoutu : ICI. A tester sur un nouvel userform dans un classeur vierge.
Sinon, en passant par des modules de classe (beaucoup plus complexe...), vous pouvez regarder par ICI. Cet exemple implémente plusieurs types de contrôles de saisie pour vos UserForm.
SarahFistol
Messages postés
82
Date d'inscription
dimanche 6 janvier 2013
Statut
Membre
Dernière intervention
18 novembre 2022
10 juil. 2016 à 20:30
10 juil. 2016 à 20:30
merci pijaku !!!
27 juin 2016 à 20:34
D'où l'intérêt de commencer chaque module par :
Cdlt
Patrice
4 juil. 2016 à 22:29