Bonsoir,
j'ai fait du C++ pendant quelques années, et là je me mets à faire de la POO en VBA. J'ai fait 3 classes (mes 3 premières) mais j'ai un Class_Terminate qui est appelé et qui fait planter mon programme. Pourriez-vous donc s'il vous plaît m'aider à corriger ce problème ?
la classe InfoColonne
La classe Feuille
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 'classe contenant les informations sur une colonne (nom, numero et intitule) Private nom_ As String 'nom de la colonne (la lettre) Private num_ As Integer 'numero de la colonne Private intitule_ As String 'intitule de la colonne 'constructeur par defaut Private Sub Class_Initialize() nom_ = "" num_ = 0 intitule_ = "" End Sub 'constructeur Sub create(nom As String, num As Integer, intitule As String) nom_ = nom num_ = num intitule_ = intitule End Sub 'destructeur Private Sub Class_Terminate() End Sub Public Property Get nom() As String nom = nom_ End Property Public Property Let nom(ByVal NewValue As String) nom_ = NewValue End Property Public Property Get num() As Integer num = num_ End Property Public Property Let num(ByVal NewValue As Integer) num_ = NewValue End Property Public Property Get intitule() As String intitule = intitule_ End Property Public Property Let intitule(ByVal NewValue As String) intitule_ = NewValue End Property 'renvoie le nom de la colonne dont l'intitule est intitule 'ws : feuille contenant les donnees 'intitule : intitule de la colonne a chercher 'numLigne : numero de la ligne dans laquelle les entetes sont ecrites Public Sub trouveCol(ws As Worksheet, intitule As String, numLigneEntete As Integer) Dim nom As String Dim num As Integer Dim col As InfoColonne nom_ = trouveColonne(ws, intitule, numLigneEntete, num_) intitule_ = intitule End Sub
La classe FeuilleTAFF (qui "est une" feuille, dit autrement, j'aurai voulu qu'elle hérite de la classe Feuille
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
124
125
126
127
128
129
130
131
132
133
134
135 'classe contenant les informations sur une feuille de donnees Private ws_ As Worksheet 'feuille de donnees Private numLigneEntete_ As Integer 'numero de la ligne contenant les entetes des colonnes de la feuille ws_ Private derLigne_ As Long 'numero de la derniere ligne pleine de la feuille ws_ Private derCol_ As InfoColonne 'informations sur la derniere colonne pleine de la feuille ws_ 'constructeur par defaut Private Sub Class_Initialize() numLigneEntete_ = 0 derLigne_ = 0 'Set ws_ = Nothing Set derCol_ = New InfoColonne End Sub 'constructeur 'ws : feuille de donnees 'colNumLigneEntete : nom de la colonne utilisee pour determiner le numero de la ligne d'entete de la feuille ws 'colDerLigne : nom de la colonne utilisee pour determiner le numero de la derniere ligne pleine de la feuille ws Sub create(ws As Worksheet, colNumLigneEntete As String, colDerLigne As String) Set ws_ = ws numLigneEntete_ = getNumLigneEntete(ws, colNumLigneEntete) derLigne_ = derniereLigne(ws, colDerLigne) Call derniereCol End Sub 'destructeur Private Sub Class_Terminate() Set ws_ = Nothing Set derCol_ = Nothing End Sub 'renvoie le numero de la ligne contenant les entetes des colonnes de la feuille ws_ Public Property Get numLigneEntete() As Integer numLigneEntete = numLigneEntete_ End Property 'assigne le numero de la ligne contenant les entetes des colonnes de la feuille ws_ Public Property Let numLigneEntete(ByVal NewValue As Integer) numLigneEntete_ = NewValue End Property 'renvoie le numero de la derniere ligne pleine de la feuille ws_ Public Property Get derLigne() As Long derLigne = derLigne_ End Property 'assigne le numero de la derniere ligne pleine de la feuille ws_ Public Property Let derLigne(ByVal NewValue As Long) derLigne_ = NewValue End Property 'renvoie la feuille de donnees Public Property Get ws() As Worksheet ws = ws_ End Property 'assigne la feuille de donnees Public Property Let ws(ByVal ws As Worksheet) ws_ = ws End Property 'renvoie les informations sur la derniere colonne pleine de la feuille ws_ Public Property Get derCol() As InfoColonne Set derCol = derCol_ End Property 'assigne la feuille de donnees Public Property Let derCol(ByVal NewValue As InfoColonne) Set derCol_ = NewValue End Property 'ajout d'une colonne dans la feuille ws_ 'intitule : intitule de la colonne 'numLigneEntete : numero de la ligne contenant les entetes des colonnes 'renvoie les informations sur la colonne ajoutee Function ajoutCol(name As String) As InfoColonne ajoutCol.nom = ajoutColonne(intitule, ws_, numLigneEntete_, ajoutCol.num) ajoutCol.intitule = name End Function 'renvoie le nom de la colonne dont l'intitule est intitule 'intitule : intitule de la colonne a chercher 'numLigne : numero de la ligne dans laquelle les entetes sont ecrites 'col : (sortie) la colonne Function trouveCol(intitule As String) As InfoColonne Dim nom As String Dim num As Integer Dim col As InfoColonne nom = trouveColonne(ws_, intitule, numLigneEntete_, num) Set col = New InfoColonne Call col.create(nom, num, intitule) Set trouveCol = col End Function 'renvoie des informations sur la derniere colonne de la ligne d'entete dont la cellule n'est pas vide Public Sub derniereCol() Dim nom As String Dim num As Integer Dim intitule As String num = derniereColonne(ws_, numLigneEntete_, nom) intitule = ws_.Range(nom & numLigneEntete_).Value Call derCol_.create(nom, num, intitule) End Sub
Et mon programme principal (enfin une partie)
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
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 'classe contenant la feuille de la TAFF Private feuille_ As Feuille 'feuille de donnees Private colCAD_ As InfoColonne 'informations sur la colonne contenant les CAD Private colPoidsCAD_ As InfoColonne 'informations sur la colonne contenant la masse des CAD (en tonne) Private colPVT_ As InfoColonne 'informations sur la colonne contenant les PVT Private colUsine_ As InfoColonne 'informations sur la colonne contenant les usines Private colRegion_ As InfoColonne 'informations sur la colonne contenant les regions Private col1eMois_ As InfoColonne 'informations sur la colonne contenant le 1e mois de la TAFF 'constructeur par defaut Private Sub Class_Initialize() Set feuille_ = New Feuille Set colCAD_ = New InfoColonne Set colPoidsCAD_ = New InfoColonne Set colPVT_ = New InfoColonne Set colUsine_ = New InfoColonne Set colRegion_ = New InfoColonne 'Set col1eMois_ = New InfoColonne End Sub 'constructeur 'wbTAff : classeur contenant la TAFF actuelle 'colNumLigneEntete : nom de la colonne utilisee pour determiner le numero de la ligne d'entete de la feuille ws 'colDerLigne : nom de la colonne utilisee pour determiner le numero de la derniere ligne pleine de la feuille ws Public Sub create(wbTAff As Workbook, colNumLigneEntete As String, colDerLigne As String) Dim i As Integer Dim feuilleName As String 'nom de la feuille du classeur wbTaff a lire 'recuperation du nom de la feuille contenant la date la plus recente feuilleName = wbTAff.Sheets(1).name For i = 2 To wbTAff.Sheets.count If (wbTAff.Sheets(i).name > feuilleName) Then feuilleName = wbTAff.Sheets(i).name Next i Call feuille_.create(wbTAff.Worksheets(feuilleName), colNumLigneEntete, colDerLigne) Set colCAD_ = feuille_.trouveCol("CAD") Set colPoidsCAD_ = feuille_.trouveCol("Poids CAD (tonne)") Set colPVT_ = feuille_.trouveCol("PVT") Set colUsine_ = feuille_.trouveCol("Usine") Set colRegion_ = feuille_.trouveCol("Région") Set col1eMois_ = New InfoColonne Call col1eMois_.create(lettreColonne(colRegion_.num + 1), colRegion_.num + 1, colRegion_.intitule) End Sub 'destructeur Private Sub Class_Terminate() Set feuille_ = Nothing Set colCAD_ = Nothing Set colPoidsCAD_ = Nothing Set colPVT_ = Nothing Set colUsine_ = Nothing Set colRegion_ = Nothing Set col1eMois_ = Nothing End Sub 'renvoie le numero de la ligne contenant les entetes des colonnes de la feuille Public Property Get numLigneEntete() As Integer numLigneEntete = feuille_.numLigneEntete End Property 'assigne le numero de la ligne contenant les entetes des colonnes de la feuille Public Property Let numLigneEntete(ByVal NewValue As Integer) feuille_.numLigneEntete = NewValue End Property 'renvoie le numero de la derniere ligne pleine de la feuille Public Property Get derLigne() As Long derLigne = feuille_.derLigne End Property 'assigne le numero de la derniere ligne pleine de la feuille Public Property Let derLigne(ByVal NewValue As Long) feuille_.derLigne = NewValue End Property 'renvoie la feuille de donnees Public Property Get ws() As Worksheet Set ws = feuille_.ws End Property 'assigne la feuille de donnees Public Property Let ws(ByVal NewValue As Worksheet) Set feuille_.ws = NewValue End Property 'renvoie les informations sur la derniere colonne pleine de la feuille Public Property Get derCol() As InfoColonne Set derCol = feuille_.derCol End Property 'assigne la feuille de donnees Public Property Let derCol(ByVal NewValue As InfoColonne) Set feuille_.derCol = NewValue End Property 'renvoie les informations sur la colonne contenant les CAD Public Property Get colCAD() As InfoColonne Set colCAD = colCAD_ End Property 'assigne les informations sur la colonne contenant les CAD Public Property Let colCAD(ByVal NewValue As InfoColonne) Set colCAD_ = NewValue End Property 'renvoie les informations sur la colonne contenant la masse des CAD (en tonne) Public Property Get colPoidsCAD() As InfoColonne Set colPoidsCAD = colPoidsCAD_ End Property 'assigne les informations sur la colonne contenant la masse des CAD (en tonne) Public Property Let colPoidsCAD(ByVal NewValue As InfoColonne) Set colPoidsCAD_ = NewValue End Property 'renvoie les informations sur la colonne contenant les PVT Public Property Get colPVT() As InfoColonne Set colPVT = colPVT_ End Property 'assigne les informations sur la colonne contenant les PVT Public Property Let colPVT(ByVal NewValue As InfoColonne) Set colPVT_ = NewValue End Property 'renvoie les informations sur la colonne contenant les usines Public Property Get colUsine() As InfoColonne Set colUsine = colUsine_ End Property 'assigne les informations sur la colonne contenant les PVT Public Property Let colUsine(ByVal NewValue As InfoColonne) Set colUsine_ = NewValue End Property 'renvoie les informations sur la colonne contenant les usines Public Property Get colRegion() As InfoColonne Set colRegion = colRegion_ End Property 'assigne les informations sur la colonne contenant les regions Public Property Let colRegion(ByVal NewValue As InfoColonne) Set colRegion_ = NewValue End Property 'chargement de la feuille contenant la TAFF Public Sub load() Dim ajd As String 'la date du jour au format AAAAMMJJ Dim moisAjd As String 'le mois d'aujourd'hui au format AAAA-MM 'suppression des colonnes des mois passes ajd = aujourdhui() moisAjd = Left(ajd, 4) & "-" & Mid(ajd, 5, 2) While ws.Cells(numLigneEntete, col1eMois_.num).Value <> moisAjd 'suppression de la colonne ws.Columns(col1eMois_.num).Delete Shift:=xlToLeft Wend End Sub
Le bug est dans la fonction load(). Ca plante dans le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Set fTaff = New FeuilleTAFF Call fTaff.create(wbTAff, "A", "A") Call fTaff.load
le class_Terminate de la classe Feuille est appelé. Savez-vous pourquoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ws.Cells(numLigneEntete, col1eMois_.num).Value
Merci beaucoup de votre aide
Bonne soirée
Partager