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 :

Usage et utilite de Class_Initialize() et de Class_Terminate()


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Par défaut Usage et utilite de Class_Initialize() et de Class_Terminate()
    Bonjour at tous,
    Je suis en train d’apprendre a manipuler les modules de classes. Je suis tombe sur les les procedure sub Class_Initialize() et sub Class_Terminate()
    A part le fait qu’elles nous informent de la creation et destruction d’un objet base sur notre clasee , j’ai vraiment du mal a apprehender a quoi elle peuvent concretement servir.
    Excusez-moi d’avance de ma naivete. Ca serait sympa si quelqu’un peut me donner un ou deux exemples de leur utilite.

    Cordialement.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Je ne rentrerais pas dans les détails, mais juste le nécessaire pour te permettre de comprendre et d’utiliser l’événement Initialize et Terminate.

    Effectivement toutes les class dispose d’un constructeur et d’un destructeur. Dans des langages plus évolués que VB il appartient au développeur de les implémentés. Le compilateur de VB, lui, ne l’autorise pas mais il déclenche un événement pour les remplacer.
    Le Initialize et le Terminate permettent l’instanciation et la dé-instanciation d’objet utilisé dans le module de Class.
    Mais un exemple vaut que des long discours.
    Imaginons que je suis professeur des écoles. J’ai un classeur Excel avec un onglet par élève contenant le notes de cet élève. Maintenant, je veux envoyer les notes de chaque élève dans un classeur séparé.
    Dans mon Module1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub TEST()
    Dim F As Integer
    Dim cls As Workbook
    Dim t(3) As New Classe1
     
    Set cls = ActiveWorkbook
    For F = 0 To 2
    t(F).Copy cls.Worksheets(F + 1)
    Next
     
    End Sub
    Dans ma Classe1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim wb As Workbook
    Private Sub Class_Initialize()
    Set wb = Workbooks.Add
    End Sub
     
    Private Sub Class_Terminate()
    wb.Close False
    Set wb = Nothing
    End Sub
    Public Sub Copy(Feuille As Worksheet)
    Feuille.Copy wb.Worksheets(wb.Worksheets.Count)
    End Sub

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    +1 avec rdurupt

    J'ajouterais que quand des objets comprennent d'autres objets, le ramasse-miettes ne marche pas toujours bien. Mettre des "set monObjetLocal = Nothing" dans le terminate est parfois nécéssaire pour des raisons de performances.

    En tous cas en 2003, j'ai eu pas mal de surprises. Je n'ai pas essayé sur des versions plus récentes.

  4. #4
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    vois aussi ce chapitre de tuto DVP, il est ciblé VBA Access, mais certaines choses sont identiques sur le fond

    http://sinarf.developpez.com/access/vbaclass/#L2.4

    cordialement,

    Didier

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Par défaut
    Bonjour Robert et merci pour ton example qui m’a permis de comprendre un peu comment on peut utiliser ces 2 evenements lies a la creation et destruction d’une variable basee sur une classe. Cependant, j’aimerais ceci:
    J’ai compris que juste avant la ligne “End Sub” de la procedure “Sub TEST()” , nos 3 objets issus de la class1 seront tour a tour detruits et ceci va appeler trois de suite la procedure “Sub Class_Terminate()”. Mais je n’arrive pas a comprendre que le code se souvienne que nous avions cree 3 classeurs et qu’il faille les fermer et detruire a tour de role. Selon moi, l’objet wb dans la procedure “Private Sub Class_Terminate()” devrait uniquement se rapporter au dernier classeur cree auquel cas les 2 premiers classeurs resteraient ouverts.
    J’espere que je me suis bien fait comprendre et espere une explication svp.
    Cordialement.

    ps. merci a Ormonth, je vais lire ton tuto pendant le weekend.
    ps. je n'ai pas compris la remarque de el_slapper , peux tu me donner un petit exemple stp ?

  6. #6
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    @ Bonero pourquoi attendre pour lire LE chapitre indiqué qui est en plein dans le cœur du problème

    ... / L'événement Initialize se produit lors de la création de l'objet et l'événement Terminate se produit lors de sa destruction. Il est indispensable de savoir quand un objet est créé et quand il est détruit car si, à première vue, cela à l'air évident mais si les pointeurs ne sont pas bien libéré il se peut qu'un objet ne soit pas détruit et donc que le code de l'événement Terminate ne soit jamais exécuté.
    Pour prendre conscience du moment exact ou ces événements se produisent, nous allons ajouter le code suivant à notre classe : .../
    cordialement,

    Didier

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    grillé par Ormonth. Mais je vais détailler quand même

    En gros, j'ai eu des problèmes dans des cas du genre :

    j'ai une classe batiment
    j'ai une classe planete qui contient une collection de batiments
    j'ai une classe galaxie qui contient une collection de planètes

    Je faisais tourner ma macro plusieurs fois, et c'était de plus en plus lent.

    J'ai rajouté des set * = nothing en masse dans les terminate, et le phénomène de ralentissement a cessé.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Dans mon exemple, j’ai un tableau de trois classes.
    Le constructeur appel l'événement intitalize qui fait pointer wb sur un nouveau classeur.
    Cette variable est encapsulée dans la classe quand je fais appel à wb c'est à ce classeur que je fais appel pas aux autre qui ont été instanciés dans une autre instance de la classes.
    En d'autre terme, classe(0)=classeur1
    Classe(1)=classeur2...
    L'événement terminate referme le wb de ça class.
    Tu ne fais pas le distinguo entre module et module de classe!

    Un module de classe est un modèle et chaque instance sur cette classe est unique les variables et les fonctions lui sont propres et uniques il existe donc bien 3 variables wb uniques dans chaque sinstances.
    Il y a déjà bien longtemps que le clonage est autorisé en informatique.
    Dernière modification par Invité ; 09/10/2013 à 19h51.

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/06/2011, 17h23
  2. class_Initialize et class_Terminate
    Par cluis dans le forum Access
    Réponses: 2
    Dernier message: 20/02/2006, 17h09
  3. utilité du binaire et hexadecimaux?
    Par souris78 dans le forum C
    Réponses: 9
    Dernier message: 01/07/2003, 15h08

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