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 se référant à un autre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut Module de classe se référant à un autre
    Bonjour tout le monde,

    Je m'intéresse à un type particulier.
    Je vais exposer mon problème par un exemple.
    Soit un TextBox dans un UserForm.
    Il possède des propriétés : Height, Width, font, etc...
    Certaines de ses propriétés possèdent également des propriétés : Font.Size, Font.Bold, etc...

    Comment réaliser cet "héritage" avec des modules de classe?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    tout simplement en creant des modules de classe

    un exemple : des personnes et des voitures
    Module de niveau 0 : clsVoiture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private pMarque As String
    private pCouleur as String
    Public Property Get Marque()
        Marque=pMarque
    End Property
    Public Property Let Marque(newMarque As String)
    pMarque = newMarque
    End Property'etc.
    Module de niveau 1 : ClsPersonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private NomPrenom As String 'etc.
    Private pVoiture as clsVoiture
    dans ta Syntaxe dans le module ClsPersonne, tu pourras taper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pVoiture.Marque="Pioumobile"
    et meme profiter de l'intellisense.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour pijaku,

    bien que VBA dispose de module de classe, il reste cependant embryonnaire! pas d'héritage, de surcharge et de polymorphisme!

    on simule le surcharge par des paramètres optionnels, le polymorphisme par d'autre classe approchante mais prenant en charge les variantes!

    pour ce qui concerne l'héritage nous utiliserons une variable objet de la classe à hériter que nous instancierons à Private Sub Class_Initialize() de la classe1 et vue qu'il n'est pas possible de surcharger les constructeur (Donc pas d’accesseur pour remonter les paramètres la classe hérit" ) nous utiliserons une sub et des proprety!
    Code Classe1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public cls2 As Classe2
     
    Private Sub Class_Initialize()
    Set cls2 = New Classe2
    End Sub
    Public Sub Param(Param1, Param2, Param3)
    cls2.Param1 = Param1
    cls2.Param2 = Param2
    cls2.Param3 = Param3
    End Function

    Code Classe2 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Property Let Param1(value)
     
    End Property
    Public Property Let Param2(value)
     
     
    End Property
    Public Property Let Param3(value)
     
     
    End Property
    notes qu'il est possible de faire des collections de classe dans une collection de classe!

    CollectionClass1(1).collectionClass2(1)https://www.developpez.net/forums/d1...a/#post8397306

  4. #4
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Merci à tous deux pour vos réponses.
    Je regarderai ça demain, à tête reposée car là, j'ai les cheveux qui poussent à l'envers...

    Bonne soirée.

  5. #5
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Les tests sont très concluants!
    Merci à vous deux !!

    Pour info, voici comment j'utilise vos méthodes :

    Code de l'UserForm (appel) :
    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
     
    Dim T As New CTextbox
     
    Private Sub UserForm_Initialize()
        TextBox1 = "Toto"
        Set T.TB = TextBox1
        With T.Police
            .Gras = True
            .Taille = 16
            .Souligne = True
            .Italique = False
        End With
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        Set T.TB = Nothing
        Set T.Police = Nothing
        Set T = Nothing
    End Sub
    Code de la classe CTextbox :
    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
     
    Public Police As ClaPolice
    Public WithEvents TB As MSForms.TextBox
     
    Private Sub Class_Initialize()
        Set Police = New ClaPolice
        Set Police.Tbox = Me
    End Sub
     
    Private Sub Class_Terminate()
        Set Police = Nothing
    End Sub
    Le code de la classe ClaPolice :
    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
    Option Explicit
     
        Public Tbox As CTextbox 'permet de faire "la liaison" avec le textbox "réel"
     
        Public Property Let Gras(B_Bold As Boolean)
            Tbox.TB.Font.Bold = B_Bold
        End Property
     
        Public Property Let Italique(B_Italic As Boolean)
            Tbox.TB.Font.Italic = B_Italic
        End Property
     
        Public Property Let Taille(B_Size As Integer)
            Tbox.TB.Font.Size = B_Size
        End Property
     
        Public Property Let Souligne(B_Underline As Boolean)
            Tbox.TB.Font.Underline = B_Underline
        End Property
     
        Private Sub Class_Initialize()
     
        End Sub
     
        Private Sub Class_Terminate()
            Set Tbox = Nothing
        End Sub
    Mon unique regret est de devoir, pour "fermer" correctement, faire :

  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
    bonjour
    pour un simple paramétrage de ctrl j'utilise des variables typées pas la peine d'engager deux modules classe
    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
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Salut Patrick,

    pour un simple paramétrage de ctrl j'utilise des variables typées
    Oui, je sais car je t'ai déjà lu à ce sujet.
    Cependant, tu te doutes que mon projet est un poil plus compliqué que le sujet exposé ici.
    J'avais juste besoin de cette base.
    Pour ton info, j'en suis déjà à "imbriquer" 3 modules de classe et ce n'est pas fini...

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

Discussions similaires

  1. module de classe trie d'un tableau par rapport à un autre
    Par gregos123 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 29/09/2015, 09h18
  2. [AC-97] Propagation d'erreurs d'un module de classe à l'autre
    Par mkl238 dans le forum VBA Access
    Réponses: 3
    Dernier message: 29/06/2010, 16h14
  3. Connaître la taille d'un module avec une macro VBA ou autre
    Par beegees dans le forum Général VBA
    Réponses: 15
    Dernier message: 22/11/2005, 09h47
  4. Réponses: 4
    Dernier message: 08/11/2005, 15h10
  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