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 :

Créer un module de classe


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut Créer un module de classe
    Bonjour,

    J´essaie de créer un nouveau type ou nouveau objet (je ne sais pas comment on dit) qui serait de la forme suivante. Ma nouvelle classe serait appelé FICHE et dans cette classe, il y aurait une propriété appelée séquence.

    <souligne>J´écris dans mon module de classe</souligne>:

    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
    Private Type Sequence ' Définition du type "Mot"
        Chaine As String
        Langue As String
        Gram As String
    End Type
     
    Private Type FICHE
        Num As Integer
        Mot As Sequence
        Commentaire As String
     
    Private Sub Class_Initialize()
        FNum = 0
    End Sub
     
    Public Property Let Num(Valeur As Integer)
        FNum = Valeur
    End Property
     
    Private Property Let Mot(Valeur() As Sequence)
        FMot.Chaine = Valeur.Chaine
        FMot.Langue = Valeur.Langue
        FMot.Gram = Valeur.Gram
    End Property
     
    Public Property Let Commentaire(Valeur As String)
        FCommentaire = Valeur
    End Property
     
     
    Public Property Get Num() As Integer
        Num = FNum
    End Property
     
    Private Property Get Fra_mot() As Sequence
        Mot = F.mot
    End Property
     
    Public Property Get Commentaire() As String
        Commentaire = FCommentaire
    End Property
    --------------------------------------------------------------------------------------

    Lorsque dans un module principal, j´essaie de tester mon nouvel objet, j´obtiens un message d´erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test() 
     
    Dim element as New FICHE
     
                        element.Num = 1    'Fonctionne
                        element.Mot.Chaine  = "pomme" ' Me donne un message d´erreur disant qu´il est impossible de trouver la méthode ou la donnée membre
     
    End sub
    Je suis bloqué la dessus depusi toute la matinée. Je sais pas si quelau´un pourrait me donner un coup de main.

    Merci bien

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    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 128
    Par défaut
    Salut
    Dans ton module de classe la property Mot est défini comme Private, donc non accessible a l'extereir de ton modul de class.
    De plus Ta property Mot demande comme paramètre un Object de type Sequence et dans ton code tu essais de lui transmettre une chaine de caractère.
    [Edit]Essai peut être quelque chose comme ça plutôt
    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
    Private Type Sequence ' Définition du type "Mot"
        Chaine As String
        Langue As String
        Gram As String
    End Type
     
    Private FNum As Integer
    Private FMot As Sequence
    Private FCommentaire As String
     
    Private Sub Class_Initialize()
        FNum = 0
    End Sub
     
    Public Property Let Num(Valeur As Integer)
        FNum = Valeur
    End Property
     
    Public Sub SetMot(Chaine As String, Langue As String, Gram As String)
        FMot.Chaine = Chaine
        FMot.Langue = Langue
        FMot.Gram = Gram
    End Sub
     
    Public Property Let Commentaire(Valeur As String)
        FCommentaire = Valeur
    End Property
     
     
    Public Property Get Num() As Integer
        Num = FNum
    End Property
     
    Public Property Get Commentaire() As String
        Commentaire = FCommentaire
    End Property
    Avec l'utilisation suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
     
    Dim element As New TFiche
     
    element.Num = 1    'Fonctionne
    element.SetMot "essai", "LangFr", "GramFr"
    End Sub
    Le module de Classe a été nommé TFiche, attention a tes déclaration de variable, tu utilise des variable déclaré nul part (FMot par exemple) mais c peut être dut a une simplification de ton code afin de le poster ici.

    Regarde également des tutoriels sur le sujet ça devrait t'aider, car je crois que tu te mélanges un peu les pinceaux entre Module et Module de Class, si tu veux créer un Objet Fiche (TFiche pour moi) ce doit être le nom de ton Modul de Class, inutile donc de créer un type Fiche dans ton Module de class.
    [/Edit]
    [Edit2]
    http://fauconnier.developpez.com/art...neral/classes/
    [/Edit]
    A++
    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

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Le code que tu donnes pose problèmes. Je passe outre le problème des déclarations de variables privées au sein du module de classe, estimant que tu n'as pas donné le code de l'ensemble du module de classe, mais il est clair qu'en créant des classes, on a intérêt à forcer la déclaration explicite des variables (Option Explicit en première ligne du module de classe. Une bonne précaution étant de cocher l'option Déclaration des variables obligatoire dans les options du VBE).

    De plus, le bloc Type FICHE n'est pas fermé par un End Type => problème de compilation. L'entête du module de classe devrait être
    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
    Option Explicit
     
    Private FNum As Integer
    Private FMot As Sequence
    Private FCommentaire As String
     
    Private Type Sequence ' Définition du type "Mot"
        Chaine As String
        Langue As String
        Gram As String
    End Type
     
    Private Type FICHE
        Num As Integer
        Mot As Sequence
        Commentaire As String
    End Type
    La propriété Let Mot n'est pas correctement écrite, car Valeur est une variable objet => pas de ()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Property Let Mot(Valeur As Sequence)
        FMot.Chaine = Valeur.Chaine
        FMot.Langue = Valeur.Langue
        FMot.Gram = Valeur.Gram
    End Property
    Mais de toutes façon, ces précautions ne changent rien, car tu ne peux pas utiliser une variable de type défini par l'utilisateur à l'intérieur d'un module objet.

    Si tu veux exposer ton objet Mot au code appelant, tu dois construire une classe de référence englobant deux classes, ta classe Fiche et une autre classe Mot. Tu créeras donc une classe Fiches, une classe Fiche et une classe Mot. Cette construction te permettra d'utiliser un objet de classe Mot comme propriété de la classe Fiche.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Merci beaucoup Qwazerty et Pierre pour vos réponses qui m´ont été d´une grande aide. Comme vous avez pu le voir je suis assez novice dans le domaine de la programation et mes écritures peuvent parfois sembler incohérentes.

    Merci Qwazerty, ton code fonctionne parfaitement. L´unique chose qui me dérange un peu et que je sois obligé de rentrer les trois sous propriétés "essai", "LangFr", "GramFr" de element.SetMot en même temps alors que j´aurais aimé pour voir entrer ces propriétés sous la forme element.SetMot.essai ou element.SetMot.GramFr indépendament les une des autres. En effet, j´obtiendrai les valeur de ces propriétés à des moments différent lors de l´exécution de ma procédure principale. Comment puis- je résoudre ce problème?

    Si j´ai bien compris ce que me dit Pierre, l´unique possibilité de pouvoir utiliser cette syntaxe (element.SetMot.essai) est donc de créer un module de classe Fiche, un module de classe Mot et un module de classe Fiches qui utiliserait les deux modules créés précédement. Est-ce donc l´unique possibilité?

    Merci beaucoup pour vos réponses et pour le tutoriel sur les modules de classe.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    La classe Fiches n'est pas indispensable, en fait.

    Tu peux créer un type personnalisé comme tu l'as fait, mais à l'extérieur de ta classe Fiche

    Tu peux aussi créer ta classe Element avec juste les propriétés utiles, et utiliser une propriété de ta classe Fiche typée sur la classe Element.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 21
    Par défaut
    Pierre,

    Premier point: "Tu peux créer un type personnalisé comme tu l'as fait, mais à l'extérieur de ta classe Fiche"

    Dans mon module de classe, j´ai donc mis pour la définition de la propriété mot:

    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
    Option Explicit
     
    Private FMot As Sequence
     
     Private Property Let Mot(Valeur As Sequence)
        FMot.Chaine = Valeur.Chaine
        FMot.Langue = Valeur.Langue
        FMot.Gram = Valeur.Gram
    End Property
     
     Private Property Get Mot As Sequence
        Valeur.Chaine = FMot.Chaine
        Valeur.Langue = FMot.Langue
        Valeur.Gram = Valeur.Gram
    End Property
     
    Et dans mon module principal, j´écris:
     
    Public Type Sequence ' Définition du type "Mot"
        Chaine As String
        Langue As String
        Gram As String
    End Type
     
    Public Sub Tester()
     
    Dim mot1 As New Fiche
    mot1.Mot.Chaine = "bonjour"
    Debug.print mot1.Mot.Chaine
     
    End Sub

    Cependant a l´exécution j´obtiens le message d´erreur me disant que la méthode ou donné du membre n´est pas trouvée.

    Deuxième point: "Tu peux aussi créer ta classe Element avec juste les propriétés utiles, et utiliser une propriété de ta classe Fiche typée sur la classe Element. "

    Je ne comprend pas trop ce que ça signifie et comment le mettre en oeuvre.

    Troisième point: Qwazerty m´a envoyé un lien trés interessant sur les modules de classe. Où puis-je trouver Création et utilisation de classes personnalisées en VB 6.0 et VBA (partie 2).

    Je vous remercie.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Les propriétés de ta classe sont déclarées Private = > pas exposées au code gérant un objet de cette classe.

    Si tu utilises une variable avec un type perso, tu utiliseras ceci dans ta classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
     
    Private FMot As Sequence
     
    Public Property Let Mot(Valeur As Sequence)
        FMot = Valeur
    End Property
     
    Public Property Get Mot() As Sequence
        Mot = FMot
    End Property
    Et ceci 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
    Option Explicit
     
    Public Type Sequence ' Définition du type "Mot"
        Chaine As String
        Langue As String
        Gram As String
    End Type
     
    Public Sub Tester()
      Dim MaFiche As New Fiche
      Dim MonMot As Sequence
     
      With MonMot
        .Chaine = "Bonjour"
        .Langue = "Français"
      End With
     
      MaFiche.Mot = MonMot
      Debug.Print MaFiche.Mot.Chaine
    End Sub
    Tu pourras utiliser la même logique avec deux classes.


    La partie 2? ... hum... Je suis en train de l'écrire...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Avec deux classes, tu pourras adresser directement les propriétés de la propriété Sequence d'un objet de la classe Fiche

    1. Ta classe Fiche
    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
    Option Explicit
     
    Private FMot As Sequence
     
    Public Property Let Mot(ByRef Valeur As Sequence)
        Set FMot = Valeur
    End Property
     
    Public Property Get Mot() As Sequence
        Set Mot = FMot
    End Property
     
    Private Sub Class_Initialize()
      Set FMot = New Sequence
    End Sub
    2. Ta classe Sequence
    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
    Option Explicit
     
    Private mChaine As String
    Private mLangue As String
    Private mGram As String
     
    Public Property Get Chaine() As String
      Chaine = mChaine
    End Property
     
    Public Property Let Chaine(Chaine As String)
      mChaine = Chaine
    End Property
     
    Public Property Get Langue() As String
      Langue = mLangue
    End Property
     
    Public Property Let Langue(Langue As String)
      mLangue = Langue
    End Property
     
    Public Property Get Gram() As String
      Gram = mGram
    End Property
     
    Public Property Let Gram(Gram As String)
      mGram = Gram
    End Property
    Tu peux alors utiliser ceci dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub Tester()
      Dim MaFiche As New Fiche
     
      With MaFiche.Mot
        .Chaine = "Test"
        .Langue = "Français"
      End With
      Debug.Print MaFiche.Mot.Chaine
    End Sub
    Et si tu ne fais rien d'autre que de recevoir ou d'attribuer des valeurs aux propriétés d'un objet Sequence, tu peux alléger le code de cette classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
     
    Public Chaine As String
    Public Langue As String
    Public Gram As String
    Car passer par des propriétés n'est utile que si tu traites les valeurs au sein des propriétés.

    Tu pourras d'ailleurs alléger aussi celui dans la classe Fiche
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. créer un module de classe pour gérer un textbox
    Par Cybernard dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 21/06/2010, 18h48
  2. Réponses: 4
    Dernier message: 31/03/2006, 15h16
  3. Réponses: 8
    Dernier message: 22/02/2006, 15h09
  4. [HTML/PHP]Créer un module de news
    Par Link14 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 10/02/2006, 21h39
  5. variables publiques ou module de classe ?
    Par niclalex dans le forum Access
    Réponses: 3
    Dernier message: 04/10/2005, 18h49

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