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
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 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
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
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
Et mon programme principal (enfin une partie)
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 bug est dans la fonction load(). Ca plante dans le code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
ws.Cells(numLigneEntete, col1eMois_.num).Value
le class_Terminate de la classe Feuille est appelé. Savez-vous pourquoi ?

Merci beaucoup de votre aide

Bonne soirée