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 :

Module de classe et imbrication [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut Module de classe et imbrication
    Bonjour à tous,
    Petit nouveau par ici, je suis pourtant un usager quotidien du forum qui me permet de me dépatouiller bien souvent de problèmes de code..
    Si je ne suis pas un débutant en VBA, je n'en suis pas pour autant un bon développeur.
    Je souhaite aujourd'hui progresser en utilisant des modules de classe..pour éviter de recoder 15x les mêmes choses.

    Je n'ai pas manqué de lire de nombreux tutos et en particulier :

    http://sinarf.developpez.com/access/vbaclass/

    http://fauconnier.developpez.com/art...neral/classes/

    S'ils sont très bien construits, je ne suis pas sûr qu'ils soient à ma portée ou répondent à mon interrogation..

    J'ai donc créé un module de classe "cCaténaire" qui possède les attributs suivants :
    • FC
    • PA
    • PP


    Chacun de ces attributs a lui même des attributs d'une autre classe nommée "cConducteur"
    • poids
    • vent
    • tension


    Au final, j'aimerais pouvoir écrire dans mon module tout court (et pas module de classe)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub calcul()
    Dim catenaireType1 as cConducteur
     
    catenaireType1.FC.poids=12
    catenaireType1.FC.vent=15
    catenaireType1.PP.vent=22
     
    etc..
     
    End sub

    J'ai donc créé les variables qui vont bien dans mes modules de classes, mais j'avoue être perdu pour savoir comment imbriquer ma classe cConducteur dans ma classe cCatenaire.

    Merci de votre aide..soyez indulgent svp..je débute en programmation objet
    Bonne soirée à tous,

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour si c'est juste pour attribuer une propriété a une variable et une autre sub propriété a cette propriété
    nul besoins de module classe ,les variables typées font tres bien l'affaire

    exemple :
    dans un simple 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
    Option Explicit
    '-----------------------------------------------
    'ceci dans un module standard
    Public Type PROPERTIE
    poids As Long
    vent As Long
    End Type
    Public Type cConducteur
    FC As PROPERTIE
    PP As PROPERTIE
    End Type
    Public catenaireType1 As cConducteur
    '-------------------------------------------------
    voila c'est fini tu l'a ta pseudo classe
    testons voir dans un autre module celui que tu veux ou meme le meme
    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
     
    'ceci dans n'importe quel module
    Sub calcul()
        catenaireType1.FC.poids = 12
        catenaireType1.FC.vent = 15
        catenaireType1.PP.vent = 22
        'etc..
    End Sub
     
    ' et ceci dans n'importe quel module meme différent de celui de la sub calcul
    Sub controlons_voir_un_peu_si_ca_marche()
        MsgBox catenaireType1.FC.poids
        MsgBox catenaireType1.FC.vent
        MsgBox catenaireType1.PP.vent
    End Sub
    voila
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut
    Merci de ta réponse aussi rapide

    Question bête : quelle est la différence entre un module de classe et des variables typées?
    Ce qui me plaisait bien dans les modules de classe, c'est que j'avais juste à les exporter pour d'autres outils de calculs VBA.

    Saurais-tu me dire quelle aurait été la solution si je voulais conserver des modules de classe?

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    la difference avec les module clsasse c'est avec les module classe tu es obligé de tout construire les propriétés et association avec par exemple les fonction let et get
    mais en terme de poids fichiers et memoire utilisées c'est pas pareille

    quand a l'export qui t'empeche d'exporter le module ou se trouve les variables ?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut
    J'avais commencé à construire toutes les propriétés lecture/écriture de mes attributs mais cela ne fonctionnait pas.
    L'avantage que je voyais avec les classes et sous-classe, c'était de pouvoir créer des évènements au sein même d'une classe.
    De plus, ;'utilisation d'une classe me semblait plus " propre", à tord peut être.

    Tu as raison, je peux toujours exporter mon module normal.

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    ok si tu y tiens tant que ca a ton module classe comm ca vite fait
    dans un module autre que le module 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
    Public catenaireType1 As New cConducteur
    'ceci dans n'importe quel module
    Sub calcul()
        catenaireType1.FC.poids = 12
        catenaireType1.FC.vent = 15
        catenaireType1.PP.vent = 22
        'etc..
    End Sub
     
    ' et ceci dans n'importe quel module meme différent de celui de la sub calcul
    Sub controlons_voir_un_peu_si_ca_marche()
        MsgBox catenaireType1.FC.poids
        MsgBox catenaireType1.FC.vent
        MsgBox catenaireType1.PP.vent
    End Sub
    et dans le module classe nommé "Oconducteur"

    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
    Public FC As New cConducteur
    Public PP As New cConducteur
    Private Lvent As Long
    Private Lpoids As Long
    Property Get poids() As Long
        ' Propriété en lecture
        poids = Lpoids
    End Property
    Property Let poids(poids As Long)
        ' Propriété en écriture
        Lpoids = poids
    End Property
    Property Get vent() As Long
        ' Propriété en lecture
        vent = Lvent
    End Property
    Property Let vent(vent As Long)
        ' Propriété en écriture
        Lvent = vent
    End Property
    le résultat set strictement pareille
    si tu veux des explications n'hésite pas

    pour la faire courte
    tu remarquera que dans le module des subs j'instancie une instance de la classe Occonducteur TOUT EN HAUT DE MODULE
    DONC catenaireType1 est une instance
    jusque la rien de bien compliqué

    dans le module classe tu reparquera les 2 variables (FC et PP) qui sont des variable representant aussi des intances du module classe
    *quézako !!? me dira tu ?
    et bien
    dans les sub on voit catenaireType1.FC.propriéte(poids ou vent)

    autrement dit FC EST UNE INSTANCE DE LA CLASSE REPRESENTANT EN FAIT LA SOUS CLASSE DE catenaireType1

    je sais c'est rigolo ca fait classe.classe.poids ou (.vent)

    autrement dit FC EST une instance de la classe oconducteur enfant de l'instance d'une autre instance de la classe oconducteur nommée catenaireType1

    je supose que c'etait ca ton soucis

    voila voila
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut
    Bonjour Patrick,
    Je vois que tu maitrises ton sujet..Et cela tourne parfaitement.
    Une question néanmoins : Quand j'écris "catenaireType1.FC." j'ai un petit menu déroulant qui s'affiche et qui me repropose "FC" ou "PP" alors qu'il ne devrait me proposer que des propriétés (poids / vent). Est-ce normal ?

    Si je peux me permettre d'abuser de ta bonté, peut-être sauras tu m'aiguiller.
    Je possède un onglet entier avec un type de caténaire et ses propriétés ensuite du genre :
    caténaire1 tension1 tension2 tension3 poids1 poids2 vent1 vent2
    caténaire2 tension1 tension2 tension3 poids1 poids2 vent1 vent2
    caténaire3 tension1 tension2 tension3 poids1 poids2 vent1 vent2
    caténaire4 tension1 tension2 tension3 poids1 poids2 vent1 vent2
    etc..

    Mon but serait donc de mettre en mémoire l'ensemble de ces caténaires et de leurs propriétés en créant pour chaque caténaire une variable de classe cCaténaire.
    Cela me permettrait par la suite dans mon code de calcul de faire des opérations de manière bien plus simple que d'avoir 12 000 variables !
    J'avais initialement opté pour des tableaux, mais je ne m'y retrouvais pas. C'est pourquoi je me tourne aujourd'hui vers des variables typées ou module de classe, qui sont nettement plus intelligibles dans le code.

    Reprenons donc :
    Je créé mon module de classe cCaténaire avec toutes les propriétés dont j'ai besoin.
    Et dans un module classique j'aimerais avoir une variable de type cCaténaire pour chaque type de caténaire. Mais cela, je ne sais pas le faire : en gros création de variable dynamique --> autant que de lignes de mon tableau en somme et dont le nom de variable correspond au nom de ma caténaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
    '-----------------------------------------------
    'ceci dans un module standard
    for ligne=2 to derniere_ligne
       ' je créé une variable de type cCaténaire pour chaque ligne qui s'appelle Caténaire1, Caténaire2, Caténaire3..
       With ma_nouvelle_variable
          .poids=12
          .vent=25
          ' etc
       End with
    next ligne
    '-------------------------------------------------

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    re
    c'est normal pour la proposition de "PP" dans le menu deroulant l'ors de l'ecriture du code
    les deux variable sont enfant dans chaque classe et subclasse
    autrement dit tu a 4 entités
    catenairetype1.FC
    catenairetype1.PP
    catenairetype1.FC.PP
    catenairetype1.PP.FC
    MEME SI CES DEUX DERNIERS NE TE SERVENT PAS


    pour le carenairetype 1 2 ,etc....
    ta variable doit etre une variable tableau tout simplement et tu l'alimente dans une boucle
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re sents bien l'usine a gaz ton truc
    je sents bien l'usine a gaz ton truc
    perso c'est si simple avec des variable typées hein
    pourquoi faire simple quand on peut faire compliqué

    avec des variables typées ca se résume a aca
    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
    Public Type propertie
        tention1 As Long
        tention2 As Long
        tention3 As Long
        poids1 As Long
        poids2 As Long
        vent1 As Long
        vent2 As Long
    End Type
     
    Public Type cConducteur
        FC As propertie
        PP As propertie
    End Type
    Public catenaireType() As cConducteur


    et dans un autre module ou le meme
    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
    Sub test()
        Dim x As Long
        For i = 2 To Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row
            x = x + 1: ReDim Preserve catenaireType(1 To x)
            With catenaireType(x).FC
                .tention1 = Sheets(1).Cells(i, "B").Value
                .tention2 = Sheets(1).Cells(i, "C").Value
                .tention3 = Sheets(1).Cells(i, "D").Value
                .poids1 = Sheets(1).Cells(i, "E").Value
                .poids2 = Sheets(1).Cells(i, "F").Value
                .vent1 = Sheets(1).Cells(i, "G").Value
                .vent2 = Sheets(1).Cells(i, "H").Value
            End With
        Next
    End Sub
    et c'est bouclé
    j'dis ca moi j'dis rien hein


    et dans un autre module ou le meme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub voir()
        MsgBox catenaireType(5).FC.tention1
        MsgBox catenaireType(8).FC.vent1
    End Sub
    Nom : demo2.jpg
Affichages : 464
Taille : 204,7 Ko
    Fichiers attachés Fichiers attachés
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2015
    Messages : 5
    Par défaut
    Bonsoir Patrick,
    Je ne peux te dire qu'un très grand merci pour tes explications et ton implication.
    Franchement ça fait vraiment plaisir car ça va me décoincer, et me permettre d'avoir un code beaucoup plus propre !!
    Je vais donc opter pour la solution que tu préconises : variables typées, cela sera beaucoup plus simple à coder, et moins lourd.
    Je verrai bien à l'usage.

    Je vais donc pouvoir clôturer ce topic.
    Encore merci à toi,
    Bonne continuation !

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

Discussions similaires

  1. [VBA] Module de classe et évènement
    Par Caroline1 dans le forum Access
    Réponses: 9
    Dernier message: 21/03/2013, 00h23
  2. [Module de classe] Fonction non liée à l'instance?
    Par Caroline1 dans le forum Access
    Réponses: 6
    Dernier message: 07/04/2006, 21h13
  3. Réponses: 4
    Dernier message: 31/03/2006, 16h16
  4. Réponses: 8
    Dernier message: 22/02/2006, 16h09
  5. variables publiques ou module de classe ?
    Par niclalex dans le forum Access
    Réponses: 3
    Dernier message: 04/10/2005, 19h49

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