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 :

erreur avec withevents dans un module de classe


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut erreur avec withevents dans un module de classe
    bonsoir,

    j utilise le tres bon faq http://sinarf.developpez.com/access/vbaclass/#L0
    pour mieux apprehender les modules de classes.

    je rencontre un pb lors de la gestion des evenements, d apres la comprehension que j en ai eu, on peut dans une classe créer ces propres evenements.

    Vous pouvez aussi ajouter à vos classes des événements personnalisés (à partir de Office 2000 seulement). Nous allons ajouter un événement que l'on appelera Completed qui se produira lorsque les propriétés Nom, Prenom et DateNaissance auront été renseignés. Commençons par ajouter la déclaration de l'événement :
    precision : j ai office 2003 et je teste le code sous vba xl

    le code se presente de cette maniere

    dans un module normal
    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
    Option Explicit
     
    Sub testPerson()
    Dim objperson  As New person
    'création du pointeur vers l'objet
     
     
    Dim strNom     As String
    Dim strPrenom  As String
    Dim dtmNaissance As String
     
        strNom = "Blavin"
        strPrenom = "Michel"
        dtmNaissance = #9/14/1969#
        With objperson
            .Nom = strNom                       'provoque la création de l'objet
            .Prenom = strPrenom
            .DateNaissance = dtmNaissance
            Debug.Print "La méthode age renvoie : "; .Age; _
                        " ans, pour "; .NomComplet; " né le : "; _
                        Format(.DateNaissance, "dddd d mmmm yyyy")
     
     
        End With
        Set objperson = Nothing
    End Sub
    dans le module de classe person
    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
    Option Explicit
    Private WithEvents mobjPerson As person 'Provoque une erreur si placé ailleurs que
                                            'dans un module de classe
     
     
     
     
     
    Private mstrNom As String                'Nom de la personne
    Private mstrPrenom As String             'Prénom de la personne
    Private mdtmDateNaissance As Date        'Date de naissance de la personne
     
     
     
    Private mblnNom As Boolean                  'est à vrai lorsque le nom a été renseigné
    Private mblnPrenom As Boolean               'est à vrai lorsque le prénom a été renseigné
    Private mblndateNaissance As Boolean        'est à vrai lorsque la date de naissance a été renseignée
     
     
    Private Sub class_Initialize()
        Debug.Print "Evénement Initialize - Création d'un objet Person"
    End Sub
     
    Private Sub class_Terminate()
        Debug.Print "Evénement Terminate - destruction d'un objet Person : " & Me.NomComplet
    End Sub
    Private Sub mobjPerson_Completed()
        Debug.Print "l'Evénement Completed vient de se produire !"
    End Sub
    Private Sub IsCompleted()
        If mblnNom And mblnPrenom And mblndateNaissance Then
            'Si les 3 propriétés privées sont vrai alors l'événement se produit
            RaiseEvent Completed
        End If
    End Sub
     
     
     
     
    Public Function Age() As Integer
        'on calcule le nombre d'années entre l'année de naissance et aujourd'hui
        Age = DateDiff("yyyy", DateNaissance, Now, vbMonday, vbFirstFourDays)
        'si la jour de l'anniversaire n'est pas passé on retire 1 an
        If DateAdd("yyyy", Age, Me.DateNaissance) > Now Then
            Age = Age - 1
        End If
    End Function
    ' Propriété Nom
    Property Let Nom(strNom As String)
        If Len(strNom) = 0 Then
            MsgBox "Le nom ne peut pas être vide."
            Exit Property
        Else
            mstrNom = strNom
            mblnNom = True
        End If
        IsCompleted
    End Property
    Property Get Nom() As String
        Nom = mstrNom
    End Property
     
    ' Propriété Prenom
    Property Let Prenom(ByVal strPrenom As String)
        If Len(strPrenom) = 0 Then
            MsgBox "Le prénom ne peut pas être vide."
            Exit Property
        Else
            mstrPrenom = strPrenom
            mblnPrenom = True
        End If
        IsCompleted
    End Property
    Property Get Prenom() As String
        Prenom = mstrPrenom
    End Property
     
    ' Propriété DateNaissance
    Property Let DateNaissance(ByVal dtmDateNaissance As Date)
        If dtmDateNaissance > Now Then
            MsgBox "Une date de naissance ne peut être dans le futur."
            Exit Property
        Else
            mdtmDateNaissance = dtmDateNaissance
            mblndateNaissance = True
        End If
        IsCompleted
    End Property
     
     
    Property Get DateNaissance() As Date
        DateNaissance = mdtmDateNaissance
    End Property
     
    ' Propriété NomComplet en lecture seule
    Property Get NomComplet() As String
        NomComplet = Me.Prenom & " " & Me.Nom
    End Property
    lors du lancement de la procedure j ai une erreur
    avec ce message :

    erreur de compilation
    l objet n est pas source d evenements automation


    est ce que quelqu un a testé tout le code avec "vba xl"?

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 1 399
    Points : 2 220
    Points
    2 220
    Par défaut
    bonjour,

    le système fonctionne comme ceci sauf erreur :

    Code à placer dans un module d'une feuille, ou de ThisWorkbook ou d'un UserForm (ne fonctionne pas dans un module standard) :
    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
     
    Private WithEvents objPerson As Person 'Déclare la variable objet objPerson qui gérera les évènements
     
    Private Sub objPerson_Completed() 'Evènement
        Debug.Print "l'Evénement Completed vient de se produire !"
    End Sub
     
    Sub testPerson()
    Set objPerson = New Person 'Initialise la variable déclarée en en-tête
    'création du pointeur vers l'objet
     
    Dim strNom     As String
    Dim strPrenom  As String
    Dim dtmNaissance As String
     
        strNom = "Blavin"
        strPrenom = "Michel"
        dtmNaissance = #9/14/1969#
        With objPerson
            .Nom = strNom                       'provoque la création de l'objet
            .Prenom = strPrenom
            .DateNaissance = dtmNaissance
            Debug.Print "La méthode age renvoie : "; .Age; _
                        " ans, pour "; .NomComplet; " né le : "; _
                        Format(.DateNaissance, "dddd d mmmm yyyy")
     
     
        End With
        Set objPerson = Nothing
    End Sub
    Et le code de la classe
    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
     
    Option Explicit
    Public Event Completed()
     
    Private mstrNom As String                'Nom de la personne
    Private mstrPrenom As String             'Prénom de la personne
    Private mdtmDateNaissance As Date        'Date de naissance de la personne
     
    Private mblnNom As Boolean                  'est à vrai lorsque le nom a été renseigné
    Private mblnPrenom As Boolean               'est à vrai lorsque le prénom a été renseigné
    Private mblndateNaissance As Boolean        'est à vrai lorsque la date de naissance a été renseignée
     
    Private Sub class_Initialize()
    Debug.Print "Evénement Initialize - Création d'un objet Person"
    End Sub
    Private Sub class_Terminate()
    Debug.Print "Evénement Terminate - destruction d'un objet Person : " & Me.NomComplet
    End Sub
     
    Private Sub IsCompleted()
       If mblnNom And mblnPrenom And mblndateNaissance Then
          'Si les 3 propriétés privées sont vrai alors l'événement se produit
          RaiseEvent Completed
       End If
    End Sub
     
     
    Public Function Age() As Integer
       'on calcule le nombre d'années entre l'année de naissance et aujourd'hui
       Age = DateDiff("yyyy", DateNaissance, Now, vbMonday, vbFirstFourDays)
       'si la jour de l'anniversaire n'est pas passé on retire 1 an
       If DateAdd("yyyy", Age, Me.DateNaissance) > Now Then
          Age = Age - 1
       End If
    End Function
    ' Propriété Nom
    Property Let Nom(strNom As String)
       If Len(strNom) = 0 Then
          MsgBox "Le nom ne peut pas être vide."
          Exit Property
       Else
          mstrNom = strNom
          mblnNom = True
       End If
       IsCompleted
    End Property
    Property Get Nom() As String
       Nom = mstrNom
    End Property
    ' Propriété Prenom
    Property Let Prenom(ByVal strPrenom As String)
       If Len(strPrenom) = 0 Then
          MsgBox "Le prénom ne peut pas être vide."
          Exit Property
       Else
          mstrPrenom = strPrenom
          mblnPrenom = True
       End If
       IsCompleted
    End Property
    Property Get Prenom() As String
       Prenom = mstrPrenom
    End Property
    ' Propriété DateNaissance
    Property Let DateNaissance(ByVal dtmDateNaissance As Date)
       If dtmDateNaissance > Now Then
          MsgBox "Une date de naissance ne peut être dans le futur."
          Exit Property
       Else
          mdtmDateNaissance = dtmDateNaissance
          mblndateNaissance = True
       End If
       IsCompleted
    End Property
     
    Property Get DateNaissance() As Date
       DateNaissance = mdtmDateNaissance
    End Property
    ' Propriété NomComplet en lecture seule
    Property Get NomComplet() As String
       NomComplet = Me.Prenom & " " & Me.Nom
    End Property
    Le module de classe est nommé <Person> via les propriétés.

    Philippe

  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
    Points : 2 415
    Points
    2 415
    Par défaut
    Bonjour,
    Je n'ai pas vraiment le temps de debuger ton code mais pour un 1er essais tu à choisi un exemple peut-être un peu trop compliqué, pour que tu puisse assimiler les rudiments des classes charge l'exemple ci-dessous (qui fonctionne) c'est aussi tiré d'une faq de DVP concernant les collections d'objets.
    A+
    Fichiers attachés Fichiers attachés

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    bonsoir,

    Je n'ai pas vraiment le temps de debuger ton code mais pour un 1er essais tu à choisi un exemple peut-être un peu trop compliqué, pour que tu puisse assimiler les rudiments des classes charge l'exemple ci-dessous (qui fonctionne) c'est aussi tiré d'une faq de DVP concernant les collections d'objets.
    j ai deja "exploité" des modules de classes ou des evenements liés a des boutons (textbox,commandbutton etc ..) sont déclenchés.
    par contre la je coince sur la création d evenements propre a une classe.

    VOIR POST plus haut

    sinon j ai essayé le code de philben

    pb withevents n est valable que ds un module objet (classe , userform,feuil ..)
    mais pas ds un module standart

  5. #5
    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
    Points : 2 415
    Points
    2 415
    Par défaut
    OK, mais comme tu avais parlé de tuto j'ai cru que tu débutais dans les classes.
    Une piste...
    Mettre ta macro dans un UF, puisque tu dit que là ca va et quand tu appel ta macro la précéder du nom de l' UF ?
    A+

  6. #6
    Membre éclairé

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

    Informations forums :
    Inscription : mai 2007
    Messages : 514
    Points : 822
    Points
    822
    Par défaut
    Bonsoir,

    Dans un module de classe nommé EventSource:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Event ValueChange(OldValue As Long)
     
    Private clsValue As Long
     
    Property Get Value() As Long
        Value = clsValue
    End Property
     
    Property Let Value(NewValue As Long)
        Dim Old As Long
        Old = clsValue
        clsValue = NewValue
        RaiseEvent ValueChange(Old)
    End Property
    La détection de l'évènement se fait dans un module objet (ThisWorkbook, module de feuille, Userform) ou dans un autre module de classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim WithEvents MonObjet As EventSource
     
    Private Sub WorkBookOpen()
        Set MonObjet = New EventSource
        MonObjet.Value = CLng(Date)'Declenchera l'evenement ValueChange
    End Sub
     
    Private Sub MonObjet_ValueChange(OldValue As Long)
        With MonObjet
            MsgBox "Ancienne valeur" & OldValue & " ,nouvelle valeur" & .Value
        End With
    End Sub
    L'evenement se déclenchera à l'ouverture du classeur, et à chaque fois qu'une valeur sera affectée à la propriété Value de la variable MonObjet.

    Reste à l'exploiter en fonction des besoins de l'application.

    Cordialement,

    Tirex28/

Discussions similaires

  1. Erreurs avec EditMask dans BBDE
    Par Teaniel dans le forum C++Builder
    Réponses: 1
    Dernier message: 06/06/2008, 15h30
  2. Erreur de compilation dans le module caché
    Par Kalvin_20 dans le forum VBA Access
    Réponses: 4
    Dernier message: 27/05/2008, 16h03
  3. Accesseur de collection dans un module de classe
    Par in dans le forum Général VBA
    Réponses: 4
    Dernier message: 17/08/2007, 19h09
  4. [JpGraph] Erreur avec setAngle dans JPGRAPH ?
    Par haffouff dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 23/05/2006, 16h26
  5. [8i][PL/SQL] erreur avec lpad dans une fonction
    Par sali dans le forum Oracle
    Réponses: 3
    Dernier message: 16/03/2006, 07h22

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