Bonjour à tous,

je suis en train de construire un outil pour faire des plannings. J'ai déjà été bien conseillé par un membre du site pour faire les soustractions et additions ds un userform -> "Lundi = FinMatin - DebMatin + FinAprem - DebAprem + formation" et cela pour tous les jours de la semaine
Un dernier textbox fait le total des jours de la semaine

Le code du 1er userform (User) est d'ailleurs parfait et j'essaye depuis des jours de le reproduire pour un autre userform (userform2) dans un lequel, il ne faudra faire que des soustractions pour les jours de la semaine -> Lundi = FinMatin - DebAprem" et cela pour tous les jours de la semaine
Un dernier textbox fait le total des jours de la semaine.

Il y aura dans cet userform 21 textbox (7 pour le total jrs semaine + 7 DebMatin + 7 FinAprem) et le 22e pour le total de la semaine.

Je vous donne les lignes de code du premier userform (User) qui fait les soustractions et additions avec un total jour et hebdo.

Dans Projet VBA/Feuilles/User

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
Option Explicit
Dim txt(1 To 42) As New classe1, I As Byte
 
<hr />
 
Private Sub UserForm_Initialize()
 
    For I = 1 To 42
 
        Set txt(I).GroupeTxt = Controls("T" & I)
 
    Next I
    End Sub
 
<hr />
 
Private Sub User_Initialize()
 
For I = 1 To 5: Set txt(I).txt = Controls("T" & I): Next I
 
End Sub

Dans le module de classe 1
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
Option Explicit
Public WithEvents GroupeTxt As MSForms.TextBox
 <hr />
Private Sub GroupeTxt_Change()
 
    Dim DebMatin As Date
    Dim FinMatin As Date
    Dim DebAprem As Date
    Dim FinAprem As Date
    Dim Lundi As Date
    Dim Mardi As Date
    Dim Mercredi As Date
    Dim Jeudi As Date
    Dim Vendredi As Date
    Dim Samedi As Date
    Dim Dimanche As Date
    Dim Formation As Date
    Dim Total As Double
    Dim Total_formation As Double
    Dim I As Integer
 
    For I = 6 To 42 Step 6
 
        'si la longueur du texte est égale à 5 pour tous
        If Len(user.Controls("T" & I - 5).Value) = 5 _
            And Len(user.Controls("T" & I - 4).Value) = 5 _
            And Len(user.Controls("T" & I - 3).Value) = 5 _
            And Len(user.Controls("T" & I - 2).Value) = 5 _
            And Len(user.Controls("T" & I - 1).Value) = 5 Then
 
            'converti en date
            DebMatin = CDate(user.Controls("T" & I - 5).Value)
            FinMatin = CDate(user.Controls("T" & I - 4).Value)
            DebAprem = CDate(user.Controls("T" & I - 3).Value)
            FinAprem = CDate(user.Controls("T" & I - 2).Value)
            Formation = CDate(user.Controls("T" & I - 1).Value)
 
            'totalise en convertissant en double
            Total = CDbl(FinMatin - DebMatin + FinAprem - DebAprem) + CDbl(Formation)
 
            'affiche au format heures : minutes
            user.Controls("T" & I).Value = Application.WorksheetFunction.Text(Total, "hh:mm")
 
        End If
 
    Next I
 
    On Error Resume Next 'permet de totaliser ligne par ligne
 
    'idem, conversion en date
    Lundi = CDate(user.T6.Value)
    Mardi = CDate(user.T12.Value)
    Mercredi = CDate(user.T18.Value)
    Jeudi = CDate(user.T24.Value)
    Vendredi = CDate(user.T30.Value)
    Samedi = CDate(user.T36.Value)
    Dimanche = CDate(user.T42.Value)
 
 
    'puis en double
    Total = CDbl(Lundi + Mardi + Mercredi + Jeudi + Vendredi + Samedi + Dimanche)
    Total_formation = CDate(user.T5.Value) + CDate(user.T11.Value) + CDate(user.T17.Value) + CDate(user.T23.Value) + 
    CDate(user.T29.Value) + CDate(user.T35.Value) + CDate(user.T41.Value)
 
    'au format heures : minutes au delà de 24 h
    user.T43.Value = Application.WorksheetFunction.Text(Total, "[hh]:mm")
    user.T44.Value = Application.WorksheetFunction.Text(Total_formation, "[hh]:mm")
 
 
 End Sub
<hr />
 Private Sub GroupeTxt_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 
    If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
 
End Sub
 
 <hr />
Private Sub GroupeTxt_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 
    If KeyCode <> 8 Then 'suppression !
 
        If Len(GroupeTxt) = 2 Then GroupeTxt = GroupeTxt & ":"
        If Len(GroupeTxt) > 5 Then GroupeTxt = Left(GroupeTxt, 5)
 
    End If
 
End Sub

Puis dans le module 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Sub ouverture()
user.Show 0
End Sub
C'est ballot mais je bloque avec les "Private Sub UserForm_Initialize()" pour nommer l'userform2 dans le module 1 et les valeurs des variables (I dans le 1er userform etc..).
J'ai fais des tas d'essais avec la création d'un second module de classe et en renommant les variables I mais là, je suis arrivé au bout du bout...
J'aurais donc besoin de vos lumières, n'hésitez pas à me dire si un fichier joint serait plus utile...

Je vous remercie par avance pour vos conseils.

Danny