Code:range("a1") =cdate(me.DATESAISIE)
Version imprimable
Code:range("a1") =cdate(me.DATESAISIE)
Ok !
Moi ce que je voudrais, c'est que dan l'usf le textbox DATESAISIE apparaisse sous forme de date,mais cela ne marche pas ....
..........J'ai vraiment du mal avec la gestion des dates.....Code:DATESAISIE = CDate(Me.DATESAISIE)
Bonjour à tous.
Quelle commande utiliser en VBA pour obtenir une date valide ?
CDate DateValue Format CStr
Voici un démo sur les résultats différents obtenus avec une date en provenance de VBA selon la commande utilisée.
Excel n'interprète pas la valeur reçue de VBA. Si VBA lui envoie une valeur de type DATE, Excel en fait une date.
Si VBA lui envoie une valeur de type STRING, Excel en fait une valeur de type STRING même si ça pourrait être une date valide.
Ce démo montre l'importance de ne jamais permettre à VBA de transmettre une date de type STRING vers Excel. Car ça ne fonctionne jamais sauf si vous êtes américain. Les USA sont le seul pays au monde à utiliser le format MM/JJ/AAAA. Et Visual Basic comporte depuis ses origines une fonction de conversion automatique des STRING en date américaine.
Donc à éviter la commande FORMAT parce que le résultat de cette commande est un STRING, et que l'interprétation automatique d'une date de type STRING par VBA est toujours erronée quand le format de cette date est jj/mm/aaaa. VBA pense que c'est une date au format mm/dd/aaaa.
EDIT: Par la suite, en Visual Basic, Microsoft a ajouté des fonctions de conversion dont certaines sont adaptées aux différents paramètres linguistiques et régionaux concernant par exemple les dates et le séparateur décimal.
Pour les dates, la fonction de conversion CDate permet d'interpréter correctement les différents formats de dates autres que le format américain. Il faut l'utiliser si vous n'êtes pas américain. Il est aussi possible de déclarer une variable de type DATE : une date de type STRING qui lui sera attribuée sera interprétée correctement. Exemple:
Pour les nombres, vous trouverez les fonctions de conversion iciCode:
1
2
3
4
5
6
7
8
9 Sub InterpreterCorrectementUnedateDeTypeString() Dim dt As Date 'Déclarer la variable dt de type DATE dt = "1/12/2014" Cells(1, 1).Value = dt 'Résultat correct parce que de type DATE et non de type STRING Cells(2, 1).Value = CStr(dt) 'Résultat faux car interprété par l'interpréteur de String archaique du langage BASIC originel. End Sub
@ Docmarti .... excellent ton comparatif !!!
Je garde bien au chaud !!
Et tu crois que dans mon pb il faut que j'utilise quoi ?
J'avance J'avance !!!
Cela me parait correct mais cela ne fonctionne pas .....
Code:
1
2
3
4
5
6 Dim a As Date 'Private Sub DATEANNONCE_Change() ' dt = DATEANNONCE.Value 'DATEANNONCE = Format(CDate(dt), "dd/mm/yyyy") 'End Sub
pff..........
Bonsoir,
Je ne sais pas trop si je suis ou pas à coté de la plaque, mais en admetant que dateanonce soit un textbox et que tu souhaite le contrôlé à chaque utilisation de ton clavier donc en "change"
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Private Sub DATEANNONCE_Change() Dim EstDate As Boolean Dim EDaTe As Date EDaTe = DATEANNONCE.Text EstDate = DATEANNONCE.Text Like "##/##/####" If Not EstDate Then 'si tu n'as pas le format date 'rien ne se passe else 'sinon 'ton code 'DATEANNONCE = Format(CDate(dt), "dd/mm/yyyy") End If end sub
Hello
Joli code
mais cela ne fonctionne pas ...
Je me retrouve avec
Pièce jointe 146054
Comment s'en sortir ?
Bonne journée
Seb
ce serait bien si tu remettais une version mise à jour de ton projet!
Hello
Pièce jointe 146060
tu as raison !
Voila la merveille !
Bonne journée
Seb
Ce que tu dois modifier c'est
Il faut que ce soitCode:Range("BB" & L).Value = DATESAISIE
Sinon le convertisseur natif de VBA en fera une date américaine ( MM/JJ/AAAA ) car la valeur de DATESAISIE est de type STRING et VBA convertit toujours les dates de type STRING ayant le format JJ/MM/AAAA en dates américaines.Code:Range("BB" & L).Value = CDate (DATESAISIE)
Tu trouveras beaucoup de notions de base sur VBA très utiles sur ce site.
Mais ne tient pas compte de cette suggestion qui s'y trouve : ici
C'est une erreur très répandue qui cause bien des soucis aux programmeurs en VBA.Code:Range("A1").Value = Format(TextBox1, "mm/dd/yy")
Merci DOCMARTI
Je corrige mon code d'entrée dans la BDD....
2 Questions :
Dois-je corriger toutes mes dates dans excel par CDATE ?
Comment Corriger le retour d'information (et modifications) dans mon usf GESTIONPOSTE ?
Merci encore
Bonne soirée
Seb:lol:
Tout dépend.
Ces dates contiennent-elles des erreurs?
Ces dates ont-elles été obtenues par une commande qui cause des erreurs telle que la commande suivante?
Code:Range("BB" & L).Value = DATESAISIE
Quelle est la ligne de code qui cause un problème de retour d'information vers le Userform ?
Quelle est l'erreur produite ? Donne-nous un exemple.
Bonjour
Avec l'exemple de DATEANNONCE
Je recherche la date avec
Code:GESTIONPOSTE.DATEANNONCE = Application.VLookup(Cells(Target.Row, "I").Value, Worksheets("BASE EMPLOI").Range("A1:BB1000"), 36, False)
Il n'y pas de pb d'erreur de recherche
La date revient sous la forme
Pièce jointe 146350
Dans l'USF
J'ai essayé les code suivant
ouCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Private Sub DATEANNONCE_Change() Dim EstDate As Boolean Dim EDaTe As Date EDaTe = DATEANNONCE.Text EstDate = DATEANNONCE.Text Like "##/##/####" If Not EstDate Then 'si tu n'as pas le format date 'rien ne se passe Else 'sinon 'ton code 'DATEANNONCE = Format(CDate(dt), "dd/mm/yyyy") End If End Sub
Code:
1
2
3 Private Sub DATEANNONCE_Change() DATEANNONCE.Value = Format( DATEANNONCEE.Value, "dd/mm/yyyy") End Sub --> là la date apparaît bien sous la forme 15/05/2014
quel que soit le cas je n'arrive pas à modifier la date .....
Là jeséche
Merci à toi !!
Bonne journée
Seb
Code:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204 Private Sub UserForm_Initialize() ' Met en gras les noms de Sociétés POSTE.Font.Bold = True 'on remplit la liste ZONE par les données de la colonne 4 REMPLIR Me.ZONE, 4 'on remplit la liste TYPESOCIETE par les données de la colonne 5 REMPLIR Me.TYPESOCIETE, 5 'on remplit la liste PRENOMCONTACT par les données de la colonne 8 REMPLIR Me.PRENOMCONTACT, 8 'on remplit la liste VILLESOCIETE par les données de la colonne 17 REMPLIR Me.VILLESOCIETE, 17 'on remplit la liste LOGIN par les données de la colonne 22 REMPLIR Me.LOGIN, 22 'on remplit la liste MDP par les données de la colonne 23 REMPLIR Me.MDP, 23 'on remplit la liste ANNONCESBYMAIL par les données de la colonne 24 REMPLIR Me.ANNONCESBYMAIL, 24 'on remplit la liste POSTE par les données de la colonne 32 REMPLIR Me.POSTE, 32 'on remplit la liste CONTRAT par les données de la colonne 33 REMPLIR Me.CONTRAT, 33 'on remplit la liste LIEU par les données de la colonne 34 REMPLIR Me.LIEU, 34 'on remplit la liste REMUNERATION par les données de la colonne 35 REMPLIR Me.REMUNERATION, 35 'on remplit la liste COMMENTAIRESCANDIDATURE par les données de la colonne 41 REMPLIR Me.COMMENTAIRESCANDIDATURE, 41 End Sub 'On remplit la listbox ou la combobox LST par les données de la colonne COL Private Sub REMPLIR(ByVal LST As Object, ByVal Col As Integer) Dim MonDico As Object Dim F As Worksheet Dim c As Range Dim Temp() Set MonDico = CreateObject("Scripting.Dictionary") Set F = Worksheets("BASE EMPLOI") With F For Each c In .Range(.Cells(2, Col), .Cells(.Rows.Count, Col).End(xlUp)) If c.Value <> "" Then MonDico.Item(c.Value) = c.Value Next c End With Set F = Nothing Temp = MonDico.items Set MonDico = Nothing Call tri(Temp, LBound(Temp), UBound(Temp)) LST.List = Temp End Sub Private Sub tri(a(), ByVal gauc As Long, ByVal droi As Long) ' Quick sort Dim G As Long, d As Long Dim Ref, Temp Ref = a((gauc + droi) \ 2) G = gauc: d = droi Do Do While a(G) < Ref: G = G + 1: Loop Do While Ref < a(d): d = d - 1: Loop If G <= d Then Temp = a(G): a(G) = a(d): a(d) = Temp G = G + 1: d = d - 1 End If Loop While G <= d If G < droi Then Call tri(a, G, droi) If gauc < d Then Call tri(a, gauc, d) End Sub Private Sub ANNONCE_Click() Dim c As Range On Error Resume Next With Sheets("BASE EMPLOI") Set c = .Cells(Application.Match(CODEBASE, .[A:A], 0), "AN") End With c.Hyperlinks(1).Follow True Application.Goto Range(c.Hyperlinks(1).SubAddress) End Sub Private Sub SORTIE_Click() 'Evite le scintillement de l'écran If IsUneDate(DATEREPONSE) = False Then Exit Sub If IsUneDate(DATEANNONCE) = False Then Exit Sub If IsUneDate(RELANCE) = False Then Exit Sub If IsUneDate(DATERETOUR) = False Then Exit Sub If IsUneDate(DATEINSCRIPTION) = False Then Exit Sub If IsUneDate(DATEMAJ) = False Then Exit Sub Application.ScreenUpdating = False Dim L As Integer Dim celluletrouvee As Range Worksheets("BASE EMPLOI").Select If MsgBox("Modifier la Base ? ", vbYesNo, " Demande de confirmation dajout ") = vbYes Then Set celluletrouvee = Range("A2:A1000").Find(CODEBASE, lookat:=xlWhole) L = celluletrouvee.Row Range("A" & L).Value = CODEBASE Range("B" & L).Value = USER Range("C" & L).Value = NOMSOCIETE Range("D" & L).Value = ZONE Range("E" & L).Value = TYPESOCIETE Range("G" & L).Value = NOMCONTACT Range("H" & L).Value = PRENOMCONTACT Range("I" & L).Value = FONCTIONCONTACT Range("J" & L).Value = TELEPHONECONTACT Range("K" & L).Value = PORTABLECONTACT Range("L" & L).Value = MAILCONTACT Range("N" & L).Value = ADRESSESCOCIETE Range("P" & L).Value = CPSOCIETE Range("Q" & L).Value = VILLESOCIETE Range("R" & L).Value = SITESOCIETE Range("T" & L).Value = DATEINSCRIPTION Range("U" & L).Value = DATEMAJ Range("V" & L).Value = LOGIN Range("W" & L).Value = MDP Range("X" & L).Value = ANNONCESBYMAIL Range("Y" & L).Value = COMMENTAIRES Range("AD" & L).Value = COMMENTAIRESACTION Range("AF" & L).Value = POSTE Range("AG" & L).Value = CONTRAT Range("AH" & L).Value = LIEU Range("AI" & L).Value = REMUNERATION Range("AJ" & L).Value = DATEANNONCE Range("AK" & L).Value = DATEREPONSE Range("AL" & L).Value = RELANCE Range("AM" & L).Value = DATERETOUR Range("AO" & L).Value = COMMENTAIRESCANDIDATURE Range("AT" & L).Value = NBENTRETIENS Range("AZ" & L).Value = CRENTRETIENS 'Génére RDV GOOGLEAGENDA If MODIFRDV.Value = True Then Range("AQ" & L).Value = "" End If End If Unload Me 'Evite le scintillement de l'écran Worksheets("GESTION").Select Application.ScreenUpdating = True End Sub Private Sub SUPPRIMER_Click() 'ici on va faire plus simple et plus rapide que ta boucle do/loop If CODEBASE <> "" Then With Sheets("BASE EMPLOI").Range("a2:a" & Sheets("BASE EMPLOI").Cells(Rows.Count, 1).End(xlUp).Row) ' avec la plage a2 jusqu'a la derniereligne rempli _ du sheets "BASE EMPLOI" Set c = .Find(CODEBASE, LookIn:=xlValues) 'on va tester si le nom qui est dans le "CODE EMPLOI" existe If Not c Is Nothing Then 'si il existe Sheets("BASE EMPLOI").Rows(.Find(CODEBASE, LookIn:=xlValues).Row).Delete 'la ligne comportant ce nom sera supprimer Else ' si il existe pas le message box te le signalant MsgBox "ce nom n'existe pas" & vbCrLf & "entrez un nom a nouveau" End If End With End If 'ici on vide les textboxs pour eviter de reloader le userform comme tu le fesait avant For Each ctrl In Me.Controls If TypeName(ctrl) = "TextBox" Then ctrl.Value = "" Next Unload Me End Sub '================================== VALIDATION FORMAT DATE ================================= Private Sub DATESAISIE_Exit(ByVal Cancel As MSForms.ReturnBoolean) IsUneDate DATESAISIE End Sub Private Sub DATEINSCRIPTION_Exit(ByVal Cancel As MSForms.ReturnBoolean) IsUneDate DATEINSCRIPTION End Sub Private Sub DATEMAJ_Exit(ByVal Cancel As MSForms.ReturnBoolean) IsUneDate DATEMAJ End Sub Private Sub DATEANNONCE_Exit(ByVal Cancel As MSForms.ReturnBoolean) IsUneDate DATEANNONCE End Sub Private Sub DATEREPONSE_Exit(ByVal Cancel As MSForms.ReturnBoolean) IsUneDate DATEREPONSE End Sub Private Sub RELANCE_Exit(ByVal Cancel As MSForms.ReturnBoolean) IsUneDate RELANCE End Sub Private Sub DATERETOUR_Exit(ByVal Cancel As MSForms.ReturnBoolean) IsUneDate DATERETOUR End Sub Function IsUneDate(Controle As Control) As Boolean If Trim("" & Controle) = "" Then Exit Function If IsDate(Controle) = False Then MsgBox "Ceci n'est pas une date": Controle = "": Controle.SetFocus: Exit Function Controle.Value = CDate(Format(Controle.Value, "DD/MM/YYYY")) IsUneDate = True End Function
bonjour,
Le code est super mais je me retrouve toujours avec à l'affichage ????
Pièce jointe 146371
Il manque encore qqc .... lol
Merci déjà pour tout ça !
Bonne journée
Seb
Franchement, et la logique ?!
Départ donnée texte -> résultat texte affiché en date …
Donc logiquement : Texte vers Date (via une fonction renvoyant une date) puis Date vers texte via fonction Format …
__________________________________________________________________________________________
Merci de cliquer sur :plusser: pour chaque message ayant aidé puis sur :resolu: pour clore cette discussion …
Bonjour,
Pour l'affichage dans un contrôle, utilise :
Pour l'utilisation en tant que date, comme déjà indiqué :Code:Me.TextBox1.Text = Format(Me.TextBox1.Text, "dd/mm/yyyy")
Code:CDate(Me.TextBox1.Text)
Bonjour Daniel.C , Marc-L
Merci de ces precieux conseils !
Dois-je placé ces codes dans un textbox_change, comme ceci ?
ouCode:
1
2
3 Private Sub DATEMAJ_Change() Me.DATEMAJ.Date = CDate(Me.DATEMAJ.Date) End Sub
Code:
1
2
3 Private Sub DATEANNONCE_Change() Me.DATEANNONCE.Date = Format(Me.DATEANNONCE.Date, "dd/mm/yyyy") End Sub
car dans ce cas la macro plante et ne fontionne pas, elle semble tournée en boucle ......
Code:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229 Private Sub UserForm_Initialize() ' Met en gras les noms de Sociétés POSTE.Font.Bold = True 'on remplit la liste ZONE par les données de la colonne 4 REMPLIR Me.ZONE, 4 'on remplit la liste TYPESOCIETE par les données de la colonne 5 REMPLIR Me.TYPESOCIETE, 5 'on remplit la liste PRENOMCONTACT par les données de la colonne 8 REMPLIR Me.PRENOMCONTACT, 8 'on remplit la liste VILLESOCIETE par les données de la colonne 17 REMPLIR Me.VILLESOCIETE, 17 'on remplit la liste LOGIN par les données de la colonne 22 REMPLIR Me.LOGIN, 22 'on remplit la liste MDP par les données de la colonne 23 REMPLIR Me.MDP, 23 'on remplit la liste ANNONCESBYMAIL par les données de la colonne 24 REMPLIR Me.ANNONCESBYMAIL, 24 'on remplit la liste POSTE par les données de la colonne 32 REMPLIR Me.POSTE, 32 'on remplit la liste CONTRAT par les données de la colonne 33 REMPLIR Me.CONTRAT, 33 'on remplit la liste LIEU par les données de la colonne 34 REMPLIR Me.LIEU, 34 'on remplit la liste REMUNERATION par les données de la colonne 35 REMPLIR Me.REMUNERATION, 35 'on remplit la liste COMMENTAIRESCANDIDATURE par les données de la colonne 41 REMPLIR Me.COMMENTAIRESCANDIDATURE, 41 DATEANNONCE.Value = CDate(Me.DATEANNONCE.Text) End Sub 'On remplit la listbox ou la combobox LST par les données de la colonne COL Private Sub REMPLIR(ByVal LST As Object, ByVal Col As Integer) Dim MonDico As Object Dim F As Worksheet Dim c As Range Dim Temp() Set MonDico = CreateObject("Scripting.Dictionary") Set F = Worksheets("BASE EMPLOI") With F For Each c In .Range(.Cells(2, Col), .Cells(.Rows.Count, Col).End(xlUp)) If c.Value <> "" Then MonDico.Item(c.Value) = c.Value Next c End With Set F = Nothing Temp = MonDico.items Set MonDico = Nothing Call tri(Temp, LBound(Temp), UBound(Temp)) LST.List = Temp End Sub Private Sub tri(a(), ByVal gauc As Long, ByVal droi As Long) ' Quick sort Dim G As Long, d As Long Dim Ref, Temp Ref = a((gauc + droi) \ 2) G = gauc: d = droi Do Do While a(G) < Ref: G = G + 1: Loop Do While Ref < a(d): d = d - 1: Loop If G <= d Then Temp = a(G): a(G) = a(d): a(d) = Temp G = G + 1: d = d - 1 End If Loop While G <= d If G < droi Then Call tri(a, G, droi) If gauc < d Then Call tri(a, gauc, d) End Sub Private Sub DATEMAJ_Change() Me.DATEMAJ.Date = CDate(Me.DATEMAJ.Date) End Sub Private Sub DATEANNONCE_Change() Me.DATEANNONCE.Date = Format(Me.DATEANNONCE.Date, "dd/mm/yyyy") End Sub Private Sub ANNONCE_Click() Dim c As Range On Error Resume Next With Sheets("BASE EMPLOI") Set c = .Cells(Application.Match(CODEBASE, .[A:A], 0), "AN") End With c.Hyperlinks(1).Follow True Application.Goto Range(c.Hyperlinks(1).SubAddress) End Sub Private Sub SORTIE_Click() 'Evite le scintillement de l'écran If IsUneDate(DATEREPONSE) = False Then Exit Sub If IsUneDate(DATEANNONCE) = False Then Exit Sub If IsUneDate(RELANCE) = False Then Exit Sub If IsUneDate(DATERETOUR) = False Then Exit Sub If IsUneDate(DATEINSCRIPTION) = False Then Exit Sub If IsUneDate(DATEMAJ) = False Then Exit Sub Application.ScreenUpdating = False Dim L As Integer Dim celluletrouvee As Range Worksheets("BASE EMPLOI").Select If MsgBox("Modifier la Base ? ", vbYesNo, " Demande de confirmation dajout ") = vbYes Then Set celluletrouvee = Range("A2:A1000").Find(CODEBASE, lookat:=xlWhole) L = celluletrouvee.Row Range("A" & L).Value = CODEBASE Range("B" & L).Value = USER Range("C" & L).Value = NOMSOCIETE Range("D" & L).Value = ZONE Range("E" & L).Value = TYPESOCIETE Range("G" & L).Value = NOMCONTACT Range("H" & L).Value = PRENOMCONTACT Range("I" & L).Value = FONCTIONCONTACT Range("J" & L).Value = TELEPHONECONTACT Range("K" & L).Value = PORTABLECONTACT Range("L" & L).Value = MAILCONTACT Range("N" & L).Value = ADRESSESCOCIETE Range("P" & L).Value = CPSOCIETE Range("Q" & L).Value = VILLESOCIETE Range("R" & L).Value = SITESOCIETE Range("T" & L).Value = DATEINSCRIPTION Range("U" & L).Value = DATEMAJ Range("V" & L).Value = LOGIN Range("W" & L).Value = MDP Range("X" & L).Value = ANNONCESBYMAIL Range("Y" & L).Value = COMMENTAIRES Range("AD" & L).Value = COMMENTAIRESACTION Range("AF" & L).Value = POSTE Range("AG" & L).Value = CONTRAT Range("AH" & L).Value = LIEU Range("AI" & L).Value = REMUNERATION Range("AJ" & L).Value = DATEANNONCE Range("AK" & L).Value = DATEREPONSE Range("AL" & L).Value = RELANCE Range("AM" & L).Value = DATERETOUR Range("AO" & L).Value = COMMENTAIRESCANDIDATURE Range("AT" & L).Value = NBENTRETIENS Range("AZ" & L).Value = CRENTRETIENS 'Génére RDV GOOGLEAGENDA If MODIFRDV.Value = True Then Range("AQ" & L).Value = "" End If End If Unload Me 'Evite le scintillement de l'écran Worksheets("GESTION").Select Application.ScreenUpdating = True End Sub Private Sub SUPPRIMER_Click() 'ici on va faire plus simple et plus rapide que ta boucle do/loop If CODEBASE <> "" Then With Sheets("BASE EMPLOI").Range("a2:a" & Sheets("BASE EMPLOI").Cells(Rows.Count, 1).End(xlUp).Row) ' avec la plage a2 jusqu'a la derniereligne rempli _ du sheets "BASE EMPLOI" Set c = .Find(CODEBASE, LookIn:=xlValues) 'on va tester si le nom qui est dans le "CODE EMPLOI" existe If Not c Is Nothing Then 'si il existe Sheets("BASE EMPLOI").Rows(.Find(CODEBASE, LookIn:=xlValues).Row).Delete 'la ligne comportant ce nom sera supprimer Else ' si il existe pas le message box te le signalant MsgBox "ce nom n'existe pas" & vbCrLf & "entrez un nom a nouveau" End If End With End If 'ici on vide les textboxs pour eviter de reloader le userform comme tu le fesait avant For Each ctrl In Me.Controls If TypeName(ctrl) = "TextBox" Then ctrl.Value = "" Next Unload Me End Sub '================================== VALIDATION FORMAT DATE ================================= Private Sub DATESAISIE_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'IsUneDate DATESAISIE End Sub Private Sub DATEINSCRIPTION_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'IsUneDate DATEINSCRIPTION End Sub Private Sub DATEMAJ_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'IsUneDate DATEMAJ End Sub Private Sub DATEANNONCE_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'IsUneDate DATEANNONCE 'Me.DATEANNONCE.Text = Format(Me.DATEANNONCE.Text, "dd/mm/yyyy") End Sub Private Sub DATEREPONSE_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'IsUneDate DATEREPONSE End Sub Private Sub RELANCE_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'IsUneDate RELANCE End Sub Private Sub DATERETOUR_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'IsUneDate DATERETOUR End Sub Function IsUneDate(Controle As Control) As Boolean If Trim("" & Controle) = "" Then Exit Function If IsDate(Controle) = False Then MsgBox "Ceci n'est pas une date": Controle = "": Controle.SetFocus: Exit Function Controle.Value = CDate(Format(Controle.Value, "DD/MM/YYYY")) IsUneDate = True End Function
non surtout pas DATEMAJ_Change() vas vouloir te convertire en date même le [/] tu dois vérifier ta date quand elle est totalement écrite:marteau:
perso je pige pas ou est le problème je n'es sans doute pas mis le doit dessus!!!!
Je crois que quelqu'un t'a dit d'éviter l'événement "Change"... Pour m'éviter d'éplucher ton code, j'ai préparé un classeur basique pour illustrer ce que j'ai dit plus haut.