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 :

Pointeur public sur objet dumpé lors du débogage


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut Pointeur public sur objet dumpé lors du débogage
    Bonjour a tous,

    j'ai un problème auquel je ne trouve malheuresuement pas de solution intuitive. Je défini un module de classe User :

    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
    ' Module de classe User
    public SurName as String
    public FirstName as String
    Public UserName as String
    private PassWord as String
    public AccessRight as long
     
    public sub GetUser() ...
     
    private sub class_Initialize()
    msgbox("Un user vient d'être instancié")
    end sub
     
    private sub class_Terminate()
    msgbox("Le User "& SurName &", "& FirstName &" vient d'être détruit")
    end sub
     
    ' etc..
     
    'End class définition
    dans un module du workbook je déclare un objet comme étant publique tq :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Module public
    public Moi as User
    une routine qui exploite l'objet User :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set Moi = new User
    ' ...
    une fois le code exécuté, l'objet est toujours en mémoire d'excel (l'événement terminate de ma classe n'a pas été activé), le pointeur 'Moi' est aussi encore en mémoire. Je peux donc y réaccéder en relançant une routine ainsi de suite, autant de fois que je veux dans la vie de mon application excel courante. Cependant, phénomène très étrange, lorsque dans l'éditeur VB, je click sur le bouton stop du debugger, le pointeur publique 'Moi' qui était en mémoire auparavant, disparait. L'événement Terminate de mon objet n'étant même pas exécuté (ce qui prouve que mon objet 'Moi' existe bien en mémoire, mais que tous les pointeurs vers cet objet ont disparu.) Mon intérêt ici, est de pouvoir maintenir un pointeur vers cet objet, en vie tant que l'application est ouverte. (J'ai éventuellement pensé a rattacher mon pointeur à l'objet application d'excel, mais comment faire ? Je ne crois pas que je puisse enrichir le modèle objet d'excel.. )

    Quelqu'un aurait-il une solution je vous prie, ca fait deux jours que je me prends la tête dessus sans solution.

    Merci d'avance,

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonjour,

    Ce que tu décris est un comportement normal, le bouton Stop de l'éditeur equivaut à l'instruction End.

    Citation Envoyé par F1 xl2003
    L'instruction End met immédiatement fin à l'exécution du code, sans appeler d'événement Unload, QueryUnload, ou Terminate, ou tout autre code Visual Basic. Le code que vous avez écrit dans les événements Unload, QueryUnload, et Terminate des feuilles et des modules de classe n'est pas exécuté. Les objets créés depuis les modules de classe sont détruits, les fichiers ouverts au moyen de l'instruction Open sont fermés et la mémoire occupée par le programme est vidée.
    Cordialement,

    Tirex28/

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut
    Comment donc conserver un objet, qui est instancié a un instant t de la vie d'excel, tant que l'application (excel j'entend) n'est pas détruite ???

    (j'essaye d'éviter les solutions du type : sauvegarde des paramètres de mon objet dans un fichier externe ou dans un feuille caché.. solution bcp trop lourde à gérer sachant la taille des infos que mes objets contiennent et au vu du nombre instancié..)

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut
    j'imagine que si j'arrive a trapper l'évenement END déclanché par le débogger, je pourrais gérer la réinstanciation de mon objet après cet évenement.. (je ne sais pas vraiment comment, mais ca doit pouvoir ce faire.. en jettant un oeil dans les fonctions API..).

    Quelqu'un aurait-il une solution ?? please help !!!!!!!!

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonsoir,

    Tu peux recuperer le click sur le(s) bouton(s) stop, la référence Microsoft VBA Extensibility doit etre cochée.

    Dans ton module de classe User:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private EventHandlers As Collection
     
    Private Sub Class_Initialize()
        MsgBox ("Un user vient d'être instancié")
        Dim VBEControls As CommandBarControls, VBEControl As VBEControlEvent
        Dim j As Long
        Set EventHandlers = New Collection
        Set VBEControls = Application.VBE.CommandBars.FindControls(, 228)
        For j = 1 To VBEControls.Count
            Set VBEControl = New VBEControlEvent
            Set VBEControl.Control = Application.VBE.Events.CommandBarEvents(VBEControls(j))
            EventHandlers.Add VBEControl
        Next
    End Sub
    Dans un autre module de classe nommé VbeControlEvent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public WithEvents Control As CommandBarEvents
     
    Private Sub Control_Click(ByVal CommandBarControl As Object, _
        handled As Boolean, CancelDefault As Boolean)
        MsgBox "Click sur stop"
    End Sub
    Il ne te reste qu'a remplacer la msgbox par une procedure de sauvegarde des parametres de ton objet User, et a prevoir sa reconstruction dans une autre procedure que tu programme avec OnTime.

    Cordialement,

    Tirex28/

Discussions similaires

  1. Pointeur constant sur objet constant
    Par escafr dans le forum C++
    Réponses: 4
    Dernier message: 30/06/2008, 17h23
  2. Pointeur sur objet
    Par bubulemaster dans le forum Débuter
    Réponses: 5
    Dernier message: 26/09/2007, 09h10
  3. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  4. [Debutant VC++.net] Obtenir un pointeur sur objet
    Par SteelBox dans le forum MFC
    Réponses: 6
    Dernier message: 17/06/2004, 18h36
  5. pointeur multiple sur un objet
    Par Arnaud-h dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/06/2004, 11h33

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