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 :

Imbrication sélective de Classe


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur amateur VBA Excel
    Inscrit en
    Janvier 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur VBA Excel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 69
    Par défaut Imbrication sélective de Classe
    Bonjour,

    J'ai un doute sur la faisabilité de ce que je veux faire avec des Classes.

    Le code que je tente de développer va utiliser plusieurs userform qui s’appellent en cascade a savoir : "Nouvelle construction" -> on clique sur porte on ouvre l'userform "Portes", dans lequel il y des frames et dans certaines frames il y a le bouton "Finition" qui ouvre un autre userform ou l'on a des choix de finition.

    Mon idée c'est qu'as la création de chaque "porte" on crée uns classe qui s’appellerait lesportes() dans lequel il y a des classes lesframes qui s'ajouterais dynamiquement a mon objet lesportes.

    Voici ce que j'essai de faire :

    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
    '----DANS LE MODULE NORMAL-----
     
    Public LesFrames() As LesFrames, CompteurFrame As Integer
    Public USF As UserForm
    Sub Acceuil()
        Set LaPorte = New LesPortes
        PorteV2.Show 0
    End Sub
    Sub IntegrerTousLesControl()
     
    Dim ctu As MSForms.Control
     
    For Each ctu In USF.Controls
        Select Case TypeName(ctu)
            Case Is = "Frame"
                If Left(ctu.Tag, 1) = "F" Then Call ClasseDeFrame(ctu)
        End Select
    Next ctu
     
    End Sub
     
    Sub ClasseDeFrame(ctu As MSForms.Control)
    ReDim Preserve LesFrames(0 To CompteurFrame)
    Set LesFrames(CompteurFrame) = New LesFrames
    With LesFrames(CompteurFrame)
        .Caption = ctu.Caption
        .Tag = ctu.Tag
        .Name = ctu.Name
    End With
    End Sub
     
    '----DANS LE USERFORM-----
     
    Private Sub UserForm_Initialize()
    Set USF = Me
     
    Call IntegrerTousLesControl
     
    End Sub
     
    '----DANS LE MODULE DE CLASSE LesFrames-----
    Private mTag As String
     
     
    Property Get Tag() As String
        ' Propriété en lecture
        Tag = mTag
    End Property
     
    Property Let Tag(Tag As String)
        ' Propriété en écriture
        mTag = Tag
        Dim InfosTag() As String, i As Integer
        If InStr(Tag, ",") > 0 Then
            InfosTag = Split(Tag, ",")
            If UBound(InfosTag) > 1 Then
                For i = 2 To UBound(InfosTag)
                    Select Case InfosTag(i)
                        Case Is = "Finitions"
                            Public Finitions As New DoneesFinition ' <------ Ca veux pas !!!
                    End Select
                Next i
            End If
        Else
            Debug.Print ("Probleme avec le Tag du frame " & mCaption & " qui devrait avoir une virgule !!!!")
        End If
     
    End Property
    Voila, j'ai essayé d'expurger un max de code inutile à la compréhension du problème qui est double :

    Je n'arrive pas à déclarer dynamiquement Finitions As New DoneesFinition et je ne sais pas du tout comment lui demander de mettre les variables frame dans LaPorte.
    L'idéal serait de pouvoir aller rechercher plus tard une info dans LaPorte.Leframe(2).Finition.Laque par exemple.

    Le truc en plus c'est que je pourrait fort bien le faire non-dynamiquement mais je risque d'avoir plein de cas (et autant de frame/userform) différent et ce n'est surement pas moi qui vais les créer et j'aimerais donc "soulager" mon ami qui devra lui, uniquement créer des userform et mettre ce qu'il faut dans les tag des différents contrôles et ne pas entrer de code.

    Bon désolé si mon explication est très fouillies, c'est que ma compréhension de "comment je devrait faire" l'est aussi.

    MErci d'avance si vous avez lu jusque la

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je ne suis pas du tout expert dans les modules de classe VBA, mais je vais essayer. Au pire, il va y avoir quelques correcteurs qui devraient passer plus tard.

    Tout d'abord, il ne faut pas oublier que VBA a bien souvent une implantation incomplète, même erratique, de la programmation-objet.

    [
    Mon idée c'est qu'as la création de chaque "porte" on crée uns classe qui s’appellerait lesportes() dans lequel il y a des classes lesframes qui s'ajouterais dynamiquement a mon objet lesportes.
    Tu ne peux pas inclure une classe dans une autre classe. Même que tu n'en as pas besoin.
    Tu as besoin de créer des classes uniques (programmer un/des module de classe) que, tu peux utiliser (instancier) autant de fois que tu veux. Même que tu peux l'utiliser 2 ou plusieurs fois simultanément, pour autant que tu utilises des noms d'objet différents.

    Je n'arrive pas à déclarer dynamiquement Finitions As New DoneesFinition
    Toujours en principe, cela devrait ressembler à cela, et dans un module standard

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim finitions as doneesfinitions 'En principe c'est donneesfinition.
    set finitions = new doneesfinitions
    et je ne sais pas du tout comment lui demander de mettre les variables frame dans LaPorte.
    L'idéal serait de pouvoir aller rechercher plus tard une info dans LaPorte.Leframe(2).Finition.Laque par exemple.
    Les propriétés sont pour cela

    Ton module de classe sert à obtenir un nouvel objet VBA, similaire à un objet Excel existant. Mais tu ne peux pas en faire une boîte de dialogue, ni un userForm. C'est le même principe que ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("a1").value = UserForm1.textbox1.value
    Disons que tu as une classe qui s'appelle porte.

    Tu crées un objet Laporte basé sur la classe Porte et tu décides que la finition de ta porte, ce sera de la laque


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim Laporte as Porte
    set laporte = new Porte
    Laporte.finition=Laque (En supposant que tu aies une propriété Finition dans un objet (basé sur une classe) nommé LaPorte
    Puis tu fais du zèle et tu décides de faire deux portes en même temps

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim LaporteAvant as Porte
    dim LaPorteArrière as Porte
    set laporteAvant= new Porte
    Set LaPorteArrière = new porte
    LaporteAvant.finition=Laque (En supposant que tu aies une propriété Finition dans la lasse Porte
    LaporteArrière.finition=Peinture
    Mais là, il est trop tard (22h20 chez-moi) pour corriger ton code qui a besoin d'être réécrit considérablement.

    L'idée de base c'est que tu construis un ou des UserForm comme normalement que tu appelles de la manière habituelle à partir d'un module standard.

    Tu programmes un/des module(s) de classe.

    Soit dans le module de l'userForm, soit dans un module standard, tu crées les procédures pour créer tes objets et les utiliser selon les besoins.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il faut utiliser des collection!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim cls as classe1,Collect as new collection 
    For i =0 to 10
    Set cls=new classe1
    Collect.add cls
    Set cls =nothing
    Next
    Tu peux chainer tes collections
    Colct("toto").Colct2("titi").retourFonction
    Clément avec les modules de classe ces un peut comme .net sauf qu'il n'y a pas de constructeur (plus exactement le constructeur par défaut)! Le dictionary marche également.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     colect.add "toto",new classe1 
    colect("toto").colect2.add "titi", new classe2
    colect("toto").colect2.add "tutu", new classe2
    voila une discussion à la quelle j'ai participé dans ma vie d'avant: https://www.developpez.net/forums/d1...le-exportable/!

    Mais là ça relève de la haute voltige!
    Dernière modification par Invité ; 08/02/2017 à 09h11.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur amateur VBA Excel
    Inscrit en
    Janvier 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur VBA Excel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 69
    Par défaut
    clementmarcotte et dysorthographie, je vous remercie beaucoup du temps que vous avez passé à me répondre.

    Pour tout vous dire, je n'avais pas connaissance du fait que je pouvais créer des collections.
    J'ai l'impression que la solution à mon problème se trouve là .
    En effet, mon objet porte pourrait être une collection dans laquelle mes object Frame trouveraient leur place

    Je part de ce pas lire tous les tuto sur les collections que je trouve et je reviens vers vous dès que j'ai trouvé/ou pas une solution qui convient.

    Pour info ma solution pour le probleme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Case Is = "Finitions"
           Public Finitions As New DoneesFinition ' <------ Ca veux pas !!!
    j'ai fait dans le module de classe LesFrames:

    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
    Public Finitions As New DoneesFinition  ' <- j'ai mis ça la 
    Private mTag As String
     
     
    Property Get Tag() As String
        ' Propriété en lecture
        Tag = mTag
    End Property
     
    Property Let Tag(Tag As String)
        ' Propriété en écriture
        mTag = Tag
        Dim InfosTag() As String, i As Integer
        If InStr(Tag, ",") > 0 Then
            InfosTag = Split(Tag, ",")
            If UBound(InfosTag) > 1 Then
                For i = 2 To UBound(InfosTag)
                    Select Case InfosTag(i)
                        Case Is = "Finitions"
                            Finitions.Finitions = True <------ Ca, ça fonctionne !!!
                    End Select
                Next i
            End If
        Else
            Debug.Print ("Probleme avec le Tag du frame " & mCaption & " qui devrait avoir une virgule !!!!")
        End If
     
    End Property
    Et dans le module de classe DoneesFinition

    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
    Public Finitions As Boolean '<- en fait ici j'indique si oui ou non cet object est utilisé ou non
    Public IdAppelant As String
    Public FrameAppelant As String
    Public indice As Currency
     
    Public FinitionsSupport As New FinitionsSupport
    Public FinitionsLaque As New FinitionsLaque
    Public FinitionsVernis As New FinitionsVernis
    Public FinitionsTeintePatine As New FinitionsTeintePatine
     
    Public TotalMOminutes As Currency
    Public TotalMO€ As Currency
    Public TotalMat As Currency
    Public Total€ As Currency
     
    Public Texte As String
    J'ai laissé volontairement tout le code de DoneesFinition pour que vous compreniez ( ou me contredisiez évidement ) pourquoi un simple Type ne suffirait pas.

    Merci encore !

Discussions similaires

  1. Imbrication de classe C++
    Par OXXYGENE dans le forum C++
    Réponses: 2
    Dernier message: 28/04/2009, 02h30
  2. Imbrication de classes
    Par tedori dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 05/04/2009, 18h08
  3. probleme imbrication des classes
    Par touane dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 04/12/2007, 15h14
  4. [POO] Imbrication de classes
    Par warrios dans le forum Langage
    Réponses: 1
    Dernier message: 07/09/2007, 00h11
  5. Imbrication de class
    Par themadmax dans le forum C++
    Réponses: 5
    Dernier message: 29/01/2006, 00h02

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