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 :

Problème pour lire une propriété d'un tableau d'objets VBA


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Problème pour lire une propriété d'un tableau d'objets VBA
    Bonjour,
    J'ai créé un objet cPartition et un tableau contenant ces objets lorsque j'essaie de lire une propriété de mon objet j'obtiens une erreur:
    erreur: "une variable de contôle for each sur les tableaux doit être de type variant"

    si je change cPartition par variant j'obtiens une nouvelle erreur:
    erreur "variable objet non defini"

    Donc je n'arrive pas à lire une propriété de mon objet créé...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Dim ctrl As cPartition
     For Each ctrl In TabObjetPartition() 
     If ctrl.NomPartition <> "" Then
     MsgBox "ok" & ctrl.NomPartition
     Else
     MsgBox "not ok"
     End If
     Next
     
     End Sub
    Je vous remercie par avance de m'apporter une solution à ce problème qui tourne en rond.

    Plus simplement comment lire une propriété d'un objet stocké dans un tableau.
    J'ai aussi une autre question en rapport: Comment connaître le nom de l'objet dont on connaît la valeur de la propriété. Ce sont de objet créé dont voici l'exemple pour cPartition.
    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
    Public pNomPartition As String
    Private pNomsVS() As New cVS
    Public pNomVS As String
    'Public AddVS()
     
    'Public Property Get Numero() As String
    'Numero = pNumeroPartition
    'End Property
     
    Public Property Get NomPartition() As String
    NomPartition = pNomPartition
    End Property
    Public Property Let NomPartition(ValPartition As String)
    pNomPartition = ValPartition
    End Property
    Public Property Get NomVS() As Variant
    NomVS = pNomVS
    End Property
    Public Property Let NomVS(ValVS As Variant)
    pNomVS = ValVS
    End Property
     
    Public Property Get NomsVS() As Variant
    NomVS = pNomVS
    End Property
    Public Property Let NomsVS(TabVS As Variant)
    pNomsVS = ValVS
    End Property
     
    Public Sub AddVS(ValVS As String)
    ReDim pNomsVS(UBound(pNomsVS) + 1)
    pNomsVS(UBound(pNomsVS)) = ValVS
    End Sub

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour,

    merci de ne pas créer plusieurs fois le même sujet dans différents forums et difficile de répondre vu le code incomplet !
    Mais juste en lisant l'aide VBA de l'instruction For Each cela devrait aller …

    ___________________________________________________________________________________________________________
    Je suis Paris, New-York, Mogadicio, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    tant que tu ne manipule pas ton module de classe il n'existe pas d'instance!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim TabObjetPartition(10) As New cVS, ctrl
    For i = 0 To 10
        TabObjetPartition(i).NomPartition = "toto"
    Next
     For Each ctrl In TabObjetPartition()
     If ctrl.NomPartition <> "" Then
     MsgBox "ok " & ctrl.NomPartition
     Else
     MsgBox "not ok"
     End If
     Next
     
     End Sub
    comment veux tu que la méthode AddVS fonctionne!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private pNomsVS() As New cVS
    reDim pNomsVS(UBound(pNomsVS) + 1) pNomsVS n'est pas dimensionnée!


    pNomsVS(UBound(pNomsVS)) = ValVS est une instance de la classe pas un string!

    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
    Private ub As Integer
    Public pNomPartition As String
    Private pNomsVS() As New cVS
    Public pNomVS As String
    Public Property Get NomPartition() As String
    NomPartition = pNomPartition
    End Property
    Public Property Let NomPartition(ValPartition As String)
    pNomPartition = ValPartition
    End Property
    Public Property Get NomVS() As Variant
    NomVS = pNomVS
    End Property
    Public Property Let NomVS(ValVS As Variant)
    pNomVS = ValVS
    End Property
     
    Public Property Get NomsVS() As Variant
    NomVS = pNomVS
    End Property
    Public Property Let NomsVS(TabVS As Variant)
    pNomsVS = ValVS
    End Property
     
    Public Sub AddVS(ValVS As String)
    ub = ub + 1
    ReDim Preserve pNomsVS(ub)
    pNomsVS(ub).pNomVS = ValVS
    End Sub
     
     
    Private Sub Class_Initialize()
    ub = -1
    End Sub
    Dernière modification par Invité ; 03/11/2017 à 10h47.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour ces explications.
    J'aurai une dernière question par rapport au code modifié.

    Dans la déclaration ci-dessous, ctrl devient un nouvel objet de la classe cVS malgré la séparation avec la virgule ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim TabObjetPartition(10) As New cVS, ctrl

  5. #5
    Invité
    Invité(e)
    Par défaut
    tu peux laisser la déclaration tel que je l'ai mis par défaut c'est un variant donc ça marchera!

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Tout d'abord merci pour ta réactivité et la pertinence de tes réponses.
    J'ai étoffé mon code et malheureusement je tombe sur la même problématique.

    Je veux modifier un combobox avec les infos stockées dans le tableau de Partitions créé dans le pgm principal. Chacune des Partitions contient un tableau d'objet VS.
    Donc je ne veux pas recrée le tableau de VS de l'objet cPartition, je veux juste l'utilisé.
    Pour info j'ai réussit à récupéré un tableau du pgm principal dans un des combobox, donc il sait récupéré un tableau public mais le tableau que je veux est dans un objet cPartition et là Problème ...

    voici le code du combobox: j'ai créé un tableau intermédiaire TableauNomsVS() As String pour le récupéré dans le combobox, la récupération directe ne fonctionnant pas mais ça ne change rien.
    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
    Private Sub ComboBoxPartition_Change()
    Dim TableauNomsVS() As String, cpt As Integer, indexT As Integer, ctrl
    Dim TabObjetPartition()          ' si je commente le Dim l'objet n'est pas défini / si je ne le commente pas "boucle for non initialisé"
    cpt = 0
     
    '    For indexT = 1 To UBound(TabObjetPartition)     
    '        If TabObjetPartition(indexT).NomPartition = ComboBoxPartition.Text Then
        For Each ctrl In TabObjetPartition()
            If ctrl.NomPartition = "ComboBoxPartition.Text" Then
            cpt = cpt + 1
            ReDim TabNomsVS(cpt)
            TableauNomsVS(cpt) = ctrl.TabNomVS
            'ComboBoxVS.List() = ctrl.TabNomsVS
            End If
        Next
        ComboBoxVS.List() = TableauNomsVS()
        If ComboBoxPartition.Text <> "" Then
            TextBox1.Value = ComboBoxPartition.Text
            Label4.Visible = False
            ComboBoxVS.Clear
        Else
            Label4.Caption = " Pourriez-vous choisir une valeur non vide SVP "
            Label4.ForeColor = RGB(255, 0, 0)
            Label4.Font.Bold = True
            Label4.Visible = True
            TextBox1.Value = ""
        End If
    End Sub
    le code de récupération du tableau dans cPartition

    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 pNomPartition As String
    Public pNomVS As String
     
    Private ub As Integer
    Private pTabNomVS() As New cVS
    ...
    Public Property Get TabNomsVS() As Variant 'récupération à ce niveau du tableau
    TabNomsVS = pTabNomVS
    ...
    Public Sub AddVS(VS As String) ' Ajout des VS dans le tableau de VS 
    ub = ub + 1
    'MsgBox NomVS & "  index  " & indexVS
    ReDim Preserve pTabNomVS(ub)
    pTabNomVS(ub).pNomVS = VS
     
    End Property
    et dans le pgm principal: je créé mon tableau de partitions déclaré en public
    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 TabObjetPartition() As Object
     
    If EstDans(ListPartition, ValPartition) = False Then ' si la partition n'est pas dans le tableau
        ReDim Preserve ListPartition(indexPart) ' redimensionnement le tableau des noms de partition
        ReDim ListVS(indexVS)
        ReDim TabObjetPartition(indexPart)
        ListPartition(indexPart) = ValPartition 'nouvelle partition
        ListVS(indexVS) = ValVS                 'première valeur des VS
     
        'création des objets Partition et VS
        Set ValPartition = New cPartition
        ValPartition.NomPartition = NomPartition
        ValPartition.NomVS = NomVS
        ValPartition.AddVS NomVS
    J'espère que mes explications sont assez claires. Merci d'avance des réponses qui me seront proposées.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Quand tu redimensionnes un tableau tu le retaille bien mais tu efface son contenu si tu ne le préserves pas!
    ReDim preserve TabNomsVS(cpt)

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    merci, j'ai fait la modification.
    le problème est à l'exécution et reste entier.
    Quand je modifie mon combobox1 (le nom de la partition choisie) il devrait modifier le combobox2 le tableau des VS et là le message d'erreur est "boucle for non initialisée".
    Je pense qu'il ne récupère pas le "TabObjetPartition()". puisque j'écris Dim TabObjetPartition() au lieu d'aller le chercher mais si je ne fais pas ça il me créé un problème "objet non défini" alors qu'il va bien chercher un autre tableau (en dehors d'un objet) pour initialiser un combobox.

    Voici des exemples qui fonctionnent ListPartition() et ListVS() tous deux créés dans le programme principal et déclarés en public comme le TabObjetPartition() , les combobox savent les relire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ComboBoxPartition.List() = ListPartition()
    ComboBoxVS.List() = ListVS()
    Le but est donc de relire le TabObjetPartition() et d'extraire le tableau de VS qui est associé à la partition pour le positionné dans le ComboboxVS lorsque que la partition est choisie dans le ComboBoxPartition.

  9. #9
    Invité
    Invité(e)
    Par défaut
    tu devrais envisager d'utiliser un collection (Dictionnary)
    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
     
     
    Private Sub UserForm_Initialize()
    Dim TabObjetPartition(10) As New cVS, ctrl, TableauNomsVS() As String, cpt As Integer
    For i = 0 To 10
        TabObjetPartition(i).TabNomVS = "toto"
    Next
     
     
     For Each ctrl In TabObjetPartition()
        ReDim Preserve TableauNomsVS(cpt)
        TableauNomsVS(cpt) = ctrl.TabNomVS
        cpt = cpt + 1
     Next
     Me.ComboBox1.List = TableauNomsVS
    End Sub
    Fichiers attachés Fichiers attachés

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci pour ton aide.
    Malheureusement mon tableau de partition TabObjetPartition n'est pas créé par le combobox mais créé dans le menu principal.
    Donc je ne peux pas faire un New.
    Je ne sais toujours pas récupérer le tableau d'objet VS TabNomVS contenu dans le tableau d'objet partitions.
    Se sont des objets imbriqués. L'objet cPartition contient un tableau d'objet VS. et j'ai besoin de la liste des noms de VS qui sera imputée dans le comboboxVS lorsque le comboboxPartition sera modifié.

Discussions similaires

  1. Problème pour lire une vidéo.
    Par chlon dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 09/05/2011, 11h58
  2. Réponses: 1
    Dernier message: 04/03/2009, 17h50
  3. problème pour lire une feuille excel a partir d'Access
    Par h_adil dans le forum VBA Access
    Réponses: 1
    Dernier message: 17/07/2008, 23h44
  4. Problème pour lire une datatable
    Par kikitx dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/08/2007, 20h19
  5. Gros problème pour lire une vidéo
    Par zoidy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 06/06/2006, 12h35

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