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 :

Gestion de tableau de classe Objet


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2017
    Messages : 7
    Par défaut Gestion de tableau de classe Objet
    Bonjour,

    Le besoin est de gérer une classe qui utilise un tableau d'une autre classe.
    On définit une classe "VM" (=serveur virtuel) dont un type "Interface" est un tableau d'objet de type "NetworkInterface" (il y a plusieurs interfaces par serveur).

    La solution en déclarant des "Types" imbriqués fonctionne, mais ne permet pas d'affecter l'objet "VM" à un Dictionnaire; cette solution ne répond donc pas au besoin;
    => Pour utiliser les méthodes Dictionnaires (.exist..), il me faut utiliser une classe (sauf erreur).

    Le problème semble être dans la déclaration du tableau dans la classe, et l'affectation ...
    Avant d'abandonner la solution, je souhaiterai un avis d'expert.. merci d'avance !!


    Classe NetworkInterface_Class
    =======================
    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
    Option Explicit
    Private mVLAN As String
    Private mIP As String
     
    Property Get IP() As String
        IP = mIP
    End Property
     
    Property Let IP(IP As String)
        mIP = IP
    End Property
     
    Property Get VLAN() As String
        VLAN = mVLAN
    End Property
     
    Property Let VLAN(VLAN As String)
        mVLAN = VLAN
    End Property
    Classe VM_Class
    ==============
    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
     
    Private mNom As String
    Private mInterface()  As NetworkInterface_Class '() As NetworkInterface_Class
     
    Property Get Nom() As String
        Nom = mNom
    End Property
     
    Property Let Nom(Nom As String)
        mNom = Nom
    End Property
     
    Property Get Interface() As NetworkInterface_Class()  
        Set Interface = mInterface
    End Property
     
    Property Set Interface(ByRef NewInterface () As NetworkInterface_Class)     => Comment déclarer letableau : #Erreur_Compilation#
        Set mInterface = NewInterface
    End Property
    #Erreur_Compilation#=" Les définitions des procedures de propriétes pour la meme propriété sont incohérentes..."


    Code appelant
    ==========

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      Dim VM As New VM_Class
    ....
     
    ' la cible serait l'affectation :
    VM.interface(NumInt).IP= "192.168.1.1"
    VM.interface(NumInt).VLAN = "Mgmt"

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    mais ne permet pas d'affecter l'objet "VM" à un Dictionnaire
    J'ai peut-être mal compris mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Type machin
     vm As Object
    End Type
     
    Sub test()
        Dim a As machin
        Set a.vm = CreateObject("Scripting.Dictionary")
        a.vm("item1") = 1
    End Sub
    est ok
    eric

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Sens garantie!
    Private mInterface As Object

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    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 Robert.

    Au cas où cela t'aurait échappé. Tu pourrais être tenté:

    https://www.developpez.net/forums/d1...s/#post9943482

    (Il veut garder son VB6 déguisé en VB.net. Et cela fait trop longtemps que je n'ai pas fait de VB6 et de ADO "d'origine"

    Mais, ce n'est absolument pas une ordre. Et il y a des chances que tu comprennes plus que certains

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2017
    Messages : 7
    Par défaut
    La déclaration de la classe "VM" pour laquelle on définit un tableau d'"Interface" classe "NIC" semble plus propre avec les modifs suivantes

    Classe VM_Class
    ==============
    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
     
    Private mNom As String
    Private mInterface()  As NetworkInterface_Class () 
    ...
     
    Property Get Interface() As NetworkInterface_Class()  
        Set Interface = mInterface
    End Property
     
    Property Let Interface(ByRef NewInterface () As NetworkInterface_Class)     
        mInterface = NewInterface
    End Property

    Par contre, je bloque toujours sur l'affectation
    Code appelant
    ==========

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim VM As New VM_Class
    Dim interface() As New Interface_Class
    ....
    interface(1).IP= "192.168.1.1"
     
    ' Les affectations suivantes sont KO :
    VM.interface = interface
    VM.interface(1) = interface(1)
    Des idées..?
    Comment le faire autrement ?

    Merci !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Je pense que je suis loin du compte car je ne comprends vraiment pas!

    Oui pour affecter un valeur à un collection ou un dictionnaire, il faut utiliser un classe mais rien ne t'interdis de déclarer ton type sous forme de classe!
    Code classe de type : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public A as integer
    Public B as string
    Public C as byte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim VM As New VM_Class
    Dim interface() As New Interface_Class
    Dim collec as new collection
    Collec.add New Interface_Class
    Collec(1).IP= "192.168.1.1"
     
    Dico(1).B= "192.168.1.1"
     
     
     
    ....
    interface(1).IP= "192.168.1.1"
    *
    Dernière modification par Invité ; 24/01/2018 à 19h51.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2017
    Messages : 7
    Par défaut
    Bonjour,
    argh, désolé, j'ai du mal exposé le problème..

    Le pb se pose au niveau de l'affectation de VM (class_VM) qui contient un tableau de classe_Interface ; si je reprends ton ex sur la var C, ca donne:

    Code classe VM de type : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public A as integer
    Public B as string
    Public C() as interface_Class

    au niveau affectation dans la code, la cible souhaitée serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim VM As New VM_Class
    Dim interface() As New Interface_Class
    ...
    VM.C(1).IP= "192.168.1.1"  '=> erreur
     
    'ou alors
    interface(1).IP= "192.168.1.1"  
    VM.C(1)= interface(1)  '=> erreur
    Est-ce plus clair?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    ??????????



    Nom : Sans titre.png
Affichages : 532
Taille : 10,5 Ko
    Dernière modification par Invité ; 25/01/2018 à 15h13.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2017
    Messages : 7
    Par défaut
    hmmm
    on n'a pas les memes resultats
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VM.Interface(1).IP = Interface(1)
    Nom : Capture.PNG
Affichages : 505
Taille : 23,8 Ko

    peux-tu détailler stp la definition de la class VM get/let que tu utilises...

    Le problème n'est pas l'affectation avec la var dictionnaire, mais bien l'affectation de la classe VM avec les interfaces...

    le resultat devrait etre, par ex:

    VM.interface(1).IP="192.168.1.1"
    VM.interface(2).IP="192.168.1.13"

    merci d'avoir essayé...

  10. #10
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    set intr= Interface(1)
    VM.Interface(1).IP = intr.ip
    set VM.Interface(1)= Interface(1)
    VM.Interface(1).IP =Interface(1).ip
    intr
    Dernière modification par Invité ; 25/01/2018 à 16h29.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2017
    Messages : 7
    Par défaut
    Désolé mais on tourne en rond ; sauf modif dans la classe, le code que tu proposes génère exactement le pb de compilation décrit ci-dessus.

    en résumé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     'Code class VM
    Option Explicit
    Private mNom As String
    Private mInterface() As NetworkInterface_Class
    
    Property Get Interface() As NetworkInterface_Class()
        Set Interface = mInterface
    End Property
    
    Property Let Interface(ByRef NewInterface() As NetworkInterface_Class)
         Set mInterface = NewInterface
    End Property
    Toutes les affectations ci-dessous sont KO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    set VM.Interface(1)= Interface(1)
    VM.Interface(1)= Interface(1)
    VM.Interface(1).IP =Interface(1).ip
    Merci

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    tu avais lu ça : http://www.xlerateur.com/divers/2010...e-donnees-612/ ?
    aucun commentaire de ta part...
    eric

  13. #13
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2017
    Messages : 7
    Par défaut
    Bonjour,
    OK pour les bests practices.
    Il faudrait les mêmes pour la gestion des classes vba 😉

  14. #14
    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,

    @Serge :

    Voici trois tutoriels qu'il te faut lire avant d'aller plus loin.

    https://excel.developpez.com/faq/?page=ModuleClasse

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code VM_Class : 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
    Option Explicit
     
    Private mNom As String
    Private mInterface As Object '()  As NetworkInterface_Class '() As NetworkInterface_Class
     
    Public Property Get Nom() As String
        Nom = mNom
    End Property
     
    Public Property Let Nom(Nom As String)
        mNom = Nom
    End Property
     
    Public Property Get Interface(Optional ID = "") As Variant
    If ID = "" Then Set Interface = mInterface: Exit Property
      If Not mInterface.Exists(ID) Then mInterface.Add ID, New NetworkInterface_Class
      Set Interface = mInterface(ID)
    End Property
     
     
    Public Property Let Interface(Optional ID = "", NewInterface As Variant) '() As NetworkInterface_Class)      ' => Comment déclarer letableau : #Erreur_Compilation#
    If ID = "" Then Set mInterface = Interface: Exit Property
    If Not mInterface.Exists(ID) Then mInterface.Add ID, New NetworkInterface_Class
        Set mInterface(ID) = NewInterface
    End Property
    Public Function Remove(ID) As Boolean
        If mInterface.Exists(ID) Then mInterface.Remove ID: Remove = True
    End Function
    Private Sub Class_Initialize()
    Set mInterface = CreateObject("Scripting.Dictionary")
    End Sub
     
     
    Private Sub Class_Terminate()
    Set mInterface = Nothing
    End Sub
    Code NetworkInterface_Class : 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
    Option Explicit
    Private mVLAN As String
    Private mIP As String
     
    Property Get IP() As String
        IP = mIP
    End Property
     
    Property Let IP(IP As String)
        mIP = IP
    End Property
     
    Property Get VLAN() As String
        VLAN = mVLAN
    End Property
     
    Property Let VLAN(VLAN As String)
        mVLAN = VLAN
    End Property
    Code test : 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
    Dim VM As New VM_Class
    Sub test()
    ' la cible serait l'affectation :
    VM.Interface(1).IP = "192.168.1.1"
    VM.Interface(1).VLAN = "Mgmt"
    Debug.Print VM.Interface(1).IP, VM.Interface(1).VLAN
    VM.Interface(2).IP = "192.168.1.2"
    VM.Nom = "toto"
     VM.Interface(3) = New NetworkInterface_Class
     Set g = VM.Interface
     g.Add g.Count + 1, New NetworkInterface_Class
    VM.Interface = g
    VM.Interface("192.168.1.5").IP = "192.168.1.5"
    Set r = VM.Interface("192.168.1.5")
    r.VLAN = "toto"
    Debug.Print VM.Interface("192.168.1.5").IP, VM.Interface("192.168.1.5").VLAN
    MsgBox VM.Remove(3)
    k = VM.Interface.keys
    For i = 0 To VM.Interface.Count - 1
        VM.Remove k(i)
    Next
    MsgBox VM.Interface.exists("Cheval")
    VM.Interface("Cheval").IP = "192.168.1.5"
    MsgBox VM.Interface.exists("Cheval") & " : " & VM.Interface("Cheval").IP
    MsgBox VM.Interface("Cheval").IP = "toto"
    MsgBox VM.Interface("Cheval").IP = "192.168.1.5"
    End Sub
    Dernière modification par Invité ; 26/01/2018 à 15h49.

  16. #16
    Invité
    Invité(e)
    Par défaut
    En soit les modules de classe sont déjà très puissant alors couplé avec un dictionnaire!

    Je préciserais ( pour ceux qui prendraient notre émissions en cour) que dans le cas qui nous préoccupe, que le dictionnaire à pour objet d'asservir une collection de classes secondaires à une classe principale!

    Je remercie les téléspectateurs de nous avoir suivis.
    À vous Cognacq-Jay à vous les studios!

    Générique!


    Citation Envoyé par O.R.T.F. En mondovision!
    C'était Dysorthographie en direct de developpez.com!

    Dans le rôle du candide sergesvz.
    Nous remercions nos experts (Marc-L,eriiic,pijaku et clementmarcotte)
    Ca vas mieux l'infermière vient de me donner un cachet.
    Dernière modification par Invité ; 27/01/2018 à 14h09.

Discussions similaires

  1. Tableau de classe ou d'objet
    Par rtg57 dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 26/10/2010, 18h41
  2. Réponses: 1
    Dernier message: 05/02/2010, 09h42
  3. Réponses: 11
    Dernier message: 15/04/2006, 23h27
  4. [Tableau][Base]Création d'une classe de gestion de tableau
    Par mariogarcia dans le forum Collection et Stream
    Réponses: 40
    Dernier message: 05/11/2005, 01h19
  5. Réponses: 3
    Dernier message: 19/05/2005, 10h46

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