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 avec un module de classe [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut Problème avec un module de classe
    Bonjour tou(te)s,
    Ca fait déjà un bon bout de temps que j'essaye de le résoudre (le problème), et jusqu'à présent j’ai abandonné, cette fois je voudrais arriver au bout. C’est assez pointu et je ne sais pas si vous pourrez m’aider.
    J’ai une Classe nommée CL_Frame, elle me sert à grouper des Frames en collection, là pas de problème ça fonctionne et les événements du groupe fonctionnent parfaitement.
    Seulement, pour ne pas devoir traiter les événements dans la classe je voudrais les renvoyer dans l’appelant, là aussi ça fonctionne bien… mais uniquement pour la dernière instance de la classe ??
    Un peu de code…
    Dans le module de classe,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public WithEvents GroupImages As MSForms.Frame
    Public Event FrameClick(ByVal Index As Integer)
    Private Sub GroupImages_Click()
        RaiseEvent FrameClick(GroupImages.Tag)
    End Sub
    J’ai déclaré l’instance de la classe en Public.
    Dans l’UF
    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
    Dim CollectFrame As Collection
    Private WithEvents mFrame As CL_Frame
    Private Sub UserForm_Initialize()
    Dim Ctl As Control
    'Initialisation de la collection.
        Set mFrame = Nothing
        Set CollectFrame = New Collection
        'boucle sur les objets de l'UF
        For Each Ctl In Me.Controls
            'verifie s'il s'agit d'un Frame
            If TypeOf Ctl Is MSForms.Frame Then
                Set mFrame = New CL_Frame
                Set mFrame.GroupImages = Ctl
                CollectFrame.Add mFrame
            End If
        Next Ctl
    End Sub
    Private Sub mframe_FrameClick(ByVal Index As Integer)
    Stop
    End Sub
    Avec 3 Frames l'événement click n'est généré que pour le Frame3 et pas pour les autres !
    Qu'est-ce que j'oublie ?
    Merci de vos réponses éclairées.
    A+

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 317
    Par défaut
    Bonsoir,

    à tout z'hazard.....

    Dans le code de l'usf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim Fram() As New CL_Frame
    Private Sub UserForm_Initialize()
    Dim Ctl As Control
    Dim NbFrm As Integer
    NbFrm = 0
    For Each Ctl In Me.Controls
        If TypeOf Ctl Is MSForms.Frame Then
            NbFrm = NbFrm + 1
            ReDim Preserve Fram(1 To NbFrm)
            Set Fram(NbFrm).GroupImages = Ctl
        End If
    Next Ctl
    End Sub
    ainsi, tous les frames sont intégrés dans la classe....

    Maintenant, ne sachant trop ce que tu veux en faire....

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    bonjour mapeh,
    Merci de t'intérêssé au problème mais justement, le but d'une collection c'est de garder la même classe pour plusieurs contrôles, si j'indexais la classe ce ne serait plus la même et elles ne renvoyeraient plus les événements dans la même couche.
    Mais plus de problème, j'ai (enfin) trouver la solution.
    Pour ceux que ça intêresse...c'est beaucoup plus simple que ce que j'essayais de faire,
    Il ne fallait pas employer d'événement mais simplement appeller une sub.
    j'ai supprimer les déclarations d'événement dans la classe. et le WithEvents dans l'UF.
    Dans l'UF j'ai garder la sub sans faire référence à la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub FrameClick(ByVal Index As Integer)
    Stop
    End Sub
    Et dans la classe, plutôt que de faire un RaiseEvents j'appel tout simplement la sub..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub GroupImages_Click()
        Call NomUF.FrameClick(GroupImages.Tag)
    'A la place de...
       ' RaiseEvent FrameClick(GroupImages.Tag)
    End Sub
    Et maintenant ça fonctionne pous le 3 frames.
    J'ai donc des Frames indexées comme en VB6. , ce que je cherchais.
    A+

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

Discussions similaires

  1. Probléme avec le module turtle
    Par Newbie46 dans le forum Général Python
    Réponses: 7
    Dernier message: 15/02/2007, 21h03
  2. [POO] Problème avec l'utilisation de classes.
    Par sekiryou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 18h54
  3. [Débutant] J'ai un problème avec la compilation des classes
    Par Paulinho dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/11/2005, 14h23
  4. problème avec le module DBI
    Par vbcasimir dans le forum SGBD
    Réponses: 6
    Dernier message: 08/10/2005, 12h48
  5. problème avec un module
    Par vbcasimir dans le forum Modules
    Réponses: 2
    Dernier message: 29/08/2005, 15h59

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