Problème sur un Class_Terminate
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:
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:
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:
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:
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:
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