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 :

Question sur les classes en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    autre
    Inscrit en
    Octobre 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Octobre 2015
    Messages : 49
    Par défaut Question sur les classes en VBA
    Bonjour,

    Je cherche une information au niveau des classes en VBA excel.

    Mon cas :

    Je crée un module de classe simple (contenant uniquement un constructeur et un destructeur) qui se nomme CBook:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ' Module de classe "CBook"
    ' Constructeur
    Private Sub class_initialize()
    End Sub
     
    ' Destructeur
    Private Sub class_terminate()
    End Sub
    Je crée dans un module une variable globale de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public book = new CBook
    J'initialise à l'ouverture du classeur et je détruit à la fermeture du classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Workbook_Open()
     
        Set book = Nothing
        Set book = New CBook
     
    End Sub
     
     
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
     
        Set book = Nothing
     
    End Sub
    Est-ce une pratique correcte sur vba excel ?
    Si c'est correct, j'ai un problème car en cours d'utilisation d'excel l'objet "book" se perd tout seul en cours de route sans appeler son destructeur (j'ai mis un msgbox dans le destructeur pour être sur) et provoque une erreur.
    Qu'est-ce qui fait (quel événement peut se produire pour) qu'un objet contenant une classe de détruise tout seul sans appeler le destructeur ?

    Merci par avance pour votre aide

    Romain

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Par défaut
    Bonjour,

    n’étant pas un expert du sujet je te propose seulement de regarder cette discussion : à propos de la fonction Class_Terminate

    Par contre je me demande quel est le type de l'object "book" enfin... euh non c'est mal dit ! cette classe doit interagir avec quel type d'objet et dans quel but ?

    Philippe

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 104
    Par défaut
    Salut

    Dans le code que tu donnes, tu crées une instance implicite au moment de l'ouverture du classeur avec la déclaration qui est faite dans le module (à cause de l'utilisation de mot clé "new").
    Puis quand l'événement Open est appelé, tu détruits cette instance et tu en crées une nouvelle.

    Donc, soit dans le code du module tu te contentes de déclarer le type d'objet mais sans créé une instance
    Puis dans le open tu crées l'instance
    Soit tu te contente de la déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Book as new CBook
    Dans le module et tu ne met rien dans le Open.

    Dans le principe c'est fonctionnel maintenant je sais que si Pierre Fauconnier passe ici, il te dirait sans doute qu'il vaut mieux gérer ta variable avec une fonction et une variable static. J'espère qu'il interviendra sur cette discussion, j'utilise souvant les classes pas souvent de cette façon, alors la compréhension que j'ai de cette méthode n'est peut-être pas complète.
    Dans un Module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function Book as book
    Static statBook as CBook
      If statBook is nothing then set statBook = new CBook
      Set Book = statBook
    End if
    N'importe où dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Book.titre = "Les Mots sont des fenêtre. Et parfois se sont des murs"
    Cette ligne de code crée une instance et renseigne le titre de l'ouvrage.
    Quand dans ton code tu fais appelles à Book, il vérifie systématiquement que statBook est bien instancié. Si ça n'est pas le cas, il crée une nouvelle instance.
    Bien sûr si tu détruits ou si ton instance se plante*, les données que tu as stocké dedans sont perdues et lors du prochain appel à Book, tu vas te retrouver avec une nouvelle instance "vierge".

    Je dirais que ça dépend de ce que tu souhaites faire.
    Quand je vois une classe Book, je me dis qu'il doit y avoir une classe Books pour collectionner les Book. Dans ce cas la, l'instance Book sera créée, puis passée à books qui assurera sa destruction. Dans ce cas de figure C'est la classe Books qui sera public (ou static).
    Si tu veux plus d'info sur l'utilisation des classes dans VBA tu as le tuto de Pierre F. sur le sujet (il n'y aborde pas la méthode "Static"). Pierre avait donné un exemple dans une discussion mais je ne remet pas la main dessus...

    * :S'agissant de ton problème de perte d'instance, la comme ça je dirais que si tu es en phase de tests et que lors d'une erreur si à un moment donné tu choisis de terminer l'exécution du code.
    • soit avec le bouton "Fin" dans le message d'erreur
    • soit après avoir choisi débogage puis avoir arrêté l'exécution avec le bouton réinitialiser [le carrè comme sur les lecteur audio])

    Alors les variables sont réinitialisées et ton instance de classe est détruite... d’où l'importance de bien faire sa gestion d'erreur pour éviter que l'utilisateur ne se retrouve fasse à la fenêtre proposant de mettre fin ou de déboguer.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. Questions sur les classes.
    Par DarkSeiryu dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/02/2009, 09h21
  2. Un question sur les classes
    Par willycat dans le forum C++
    Réponses: 10
    Dernier message: 22/08/2008, 17h55
  3. Questions sur les classes en C#
    Par greg2 dans le forum C#
    Réponses: 11
    Dernier message: 05/11/2007, 19h57
  4. Une question sur les objets en VBA
    Par deubelte dans le forum Général VBA
    Réponses: 5
    Dernier message: 12/10/2007, 17h07

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