Bonjour à tout,
J'ai formaliser un format d'un TextBox qui se nomme "MaDate" afin que l'on puissent rentré juste une date. Cette date par la suite est comparé à celle d'aujourd’hui et un Msgbox apparaît ou non suivant plusieurs possibilité.
je vous insert le code ici :
Ce code à été principalement inspiré de ce que j'ai trouver sur internet. il fonctionne comme je l'entend. Cependant je voudrais appliquer tout se code à d'autre TextBox (au moin 10 autre) du même format avec un name identique ou presque "MaDate1", 'Madate2". (ici je prend un exemple)
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
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 Const chainevide = "__/__/____" Dim pointeur As Long Dim chaine As Variant Sub MSGbox1() MsgBox "La date d'entrée ne respecte pas le Masque jj/mm/aaaa" SendKeys "+{TAB}", False End Sub Private Sub MaDate_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'Dim Ys As Integer, Ya As Integer, Ms As Integer, Ma As Integer, Js As Integer, Ja As Integer Dim Dtoday As Date, Darrive As Date, Ddiff As Integer If MaDate.Value = "__/__/____" Then Exit Sub If InStr(1, MaDate.Value, "_") <> 0 Then Call MSGbox1 If InStr(1, MaDate.Value, "_") = 0 Then Call Verifdate End Sub Sub Verifdate() Dtoday = Date Darrive = MaDate.Value Ddiff = DateDiff("d", Dtoday, Darrive) If Ddiff < -20 Then MsgBox "Attention la date saisie est enterieur à 20 jours" SendKeys "+{TAB}", False End If If Ddiff > 30 Then MsgBox "Attention la date saisie est posterieur à 30 jours" If Ddiff > -20 And Diff < 30 Then Exit Sub End Sub Private Sub userform_initialize() MaDate.Text = chainevide End Sub Private Sub MaDate_change() chaine = "" For i = 1 To Len(MaDate) If IsNumeric(Mid(MaDate, i, 1)) Then chaine = chaine & Mid(MaDate, i, 1) If Len(chaine) = 2 Or Len(chaine) = 5 Then chaine = chaine & "/" ' attribue / entre les dd,mm,yy Next If Len(chaine) > 10 Then chaine = Left(chaine, 10) MaDate = chaine & Mid(chainevide, Len(chaine) + 1, 10 - Len(chaine) + 1) End Sub Private Sub MaDate_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) ' positionne le cusseur au bonne endroit Dim ind As Long, X As String 'Si le keycode = 8 soit backspace et que le Textox3 ne contient pas un chiffre de 0 a 9 If KeyCode = 8 And Not MaDate Like "*0-9*" Then 'Le keycode est zero KeyCode = 0 'Ind = recherche de la position du 1er "_" dispo dans le texte du textbox ind = InStr(1, MaDate, "_") 'si ind = 0 alors il n'y a plus de "_" donc ind=len(textbox) If ind = 0 Then ind = Len(MaDate) Else 'sinon ind = emplacement du "_" -1'oui!!!! ind = InStr(1, MaDate, "_") - 1 'si le caractère suivant le "_" est "/", on retourne sur le caractère précédent!!!!! pas tout a fait comme ca qu'il faut l'interpréter If ind > 0 Then 'si la position ind est plus grand 0 oui!!!! 'Si celui ci est égal à "-" alors ind = ind-1 If Mid(MaDate, ind, 1) = "/" Then ind = ind - 1 End If End If 'si "_" n'est pas en position 0 alors X = texte entré, on cherche ensuite le "_" suivant dans X, 'on passe au caractère suivant If ind <> 0 Then X = MaDate.Text: Mid(X, ind, 1) = "_": MaDate.Text = X End If End If 'Si "_" n'est pas en position 0 alors le curseur va se placer sur le caractère précédent le dernier "_", 'sinon sur le dernier caractère de la textbox MaDate.SelStart = IIf(ind <> 0, ind - 1, Len(MaDate)) End Sub 'Evalue la touche au moment où on la relache Private Sub MaDate_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Dim l As String, ind As Long, X As String, Today As String, D As String 'Si la touche retournée n'est pas numérique,alors elle est nulle et on sort de la fonction If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0: Exit Sub 'De base, l renvoie la touche renvoyée. Elle est nulle au début l = Chr(KeyAscii): KeyAscii = 0 'ind est la place du "_" dans la MaDate ind = InStr(1, MaDate, "_") 'Si le "_" est en position 1 et que la touche renvoyée est supérieure à 3 alors la touche renvoyée est nulle 'paramétrage jour If ind = 1 And l > 3 Then KeyAscii = 0: Exit Sub If ind = 2 And Mid(MaDate, 1, 1) = 3 And l > 1 Then KeyAscii = 0: Exit Sub If ind = 2 And Mid(MaDate, 1, 1) = 0 And l < 1 Then KeyAscii = 0: Exit Sub 'paramétrage mois If ind = 4 And l > 1 Then KeyAscii = 0: Exit Sub If ind = 5 And Mid(MaDate, 4, 1) = 1 And l > 2 Then KeyAscii = 0: Exit Sub If ind = 5 And Mid(MaDate, 4, 1) = 0 And l < 1 Then KeyAscii = 0: Exit Sub 'Le code ci dessus te donne la possibilité de traiter via des jours. Je lui ai dit avec les deux lignes du dessus 'que le premier caractère ne peut être au dessus de 3 (on ne peut pas aller au delà du 31). 'si ind est different de zero x=textbox.text:on remplace le (ind)eme caractere par un dans la variable x:on met la chaine x dans le textbox If ind <> 0 Then: X = MaDate.Text: Mid(X, ind, 1) = l: MaDate.Text = X 'si le textbox contient un "_" If MaDate Like "*_*" Then 'On recherche la position du "_" oui!!! ind = InStr(1, MaDate, "_") 'Et si la position du "_" n'est pas 0 alors on place le curseur sur l'emplacement précédent, oui!!!! 'Sinon sur le dernier caractere de la MaDate MaDate.SelStart = IIf(ind <> 0, ind - 1, Len(MaDate)) End If End Sub
C'est ici ou je bloque. Après recherche j'ai eu connaissance des Module de classe qui m'ont semblé bien utile dans se cas la.
J'ai donc créer un TextBox "MaDate1" et un Textbox "Madate2"
j'ai ensuite créer le module de classe "MaDate" où j'ai écris le code suivant :
Par la suite dans l'userform1 (ou se trouve les TextBox) j'ai déclaré :
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 Option Explicit ' Objet Textbox source des événements Public WithEvents oTextbox As MSForms.TextBox ' Sur changement de la TextBox Private Sub oTextBox_Change() ' Notifie l'événement au formulaire parent de la textbox oTextbox.Parent.MaDate_change oTextbox End Sub Private Sub oTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean) oTextbox.Parent.MaDate_Exit oTextbox End Sub Private Sub oTextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) oTextbox.Parent.MaDate_KeyDown oTextbox End Sub Private Sub oTextBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) oTextbox.Parent.MaDate_KeyPress oTextbox End Sub Sub oTextBox_clic() oTextbox.Parent.Madate_clic oTextbox End Sub
Je vois bien l'incrémentation des deux textbox MaDate 1 et 2 se faire dans le module de classe sauf que le format quand je lance l'userform1 avec F5 je ne retrouve pas le format dans les deux Textbox alors que tout etait parfais sans module de classe. /Help
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 Private Sub userform_initialize() Dim loCtl As Control Dim loTextBox As Madateclasse ' Initialise la collection Set OTextboxes = New Collection ' Boucle sur les contrôles For Each loCtl In Me.Controls If loCtl.Name Like "MaDate*" Then ' Nouvelle instance de classe Set loTextBox = New Madateclasse ' Initialise la TextBox dans l'instance de classe Set loTextBox.oTextbox = loCtl ' Ajoute l'instance de classe à la collection ' Etape importante pour qu'elle ne soit pas détruit ensuite OTextboxes.Add loTextBox End If Next End Sub
Je peux vous joindre les fichier à votre demande mais je préfère que vous m'indiqué mes erreur afin que je puissent les modifier.
Je sais que cela représente un sacrée travail pour vous et je vous remercie par avance de votre aide. Il faut savoir que je début en VBA et que jusqu’à présent votre forum et les aide mon fournis l’ensemble des informations donc j'avais besoin. Cette fois-ci je ne comprend pas assez les informations pour les utilisé c'est pour cela que je vous demande de l'aide.
Cordialement,
Passepartout007
Partager