IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème sur un Class_Terminate


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut 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 : 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

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    J'ai trouvé mon erreur : dans la classe Feuille, il manquait le "set" devant ws aux fonctions "get" et "let"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    '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
    Désolé du dérangement

    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 08h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo