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 :

une variable tableau public dans une instance de classe


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut une variable tableau public dans une instance de classe
    Bonjour, une question :

    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
     
        'dictionnaire de forme et de Contenu des perimetres
    Function DicoPeriContents() As Dictionary
            'variables
        Dim AllRange As Range
        Dim MyRange As Range
        Dim MyDico As New Dictionary
        Dim My_Perimetre As Perimetres
        Dim xlsheet As Worksheet
        Dim NbC As Long, Line As Long
        Dim i As Long
     
            'definition sheet
        Set xlsheet = ThisWorkbook.Worksheets("Parametrages")
     
           'Definition du ranges
        With xlsheet
     
                'NbC et NbL
            Line = .UsedRange.Find("PnL").Row
            NbC = .Cells(Line, .Columns.Count).End(xlToLeft).Column
            Set AllRange = .Range(.Range("NomPerimetre").Offset(, 1), .Range("NomPerimetre").Offset(, NbC - 1))
            For Each MyRange In AllRange
                If Not MyDico.Exists(MyRange.Value) Then
                    Set My_Perimetre = New Perimetres
                    My_Perimetre.CadreName = MyRange.Offset(-1, 0).Value
                    My_Perimetre.Name = MyRange.Value
                    My_Perimetre.Format = MyRange.Offset(-2).Value
                    My_Perimetre.TabContents = Application.Transpose(.Range(MyRange.Offset(1), MyRange.End(xlDown)).Value)
                    MyDico.Add MyRange.Value, My_Perimetre
                End If
            Next MyRange
        End With
        Set DicoPeriContents = MyDico
        Set MyDico = Nothing
    End Function
    Pourquoi est il impossible de creer une variable public de type tableau dans une instance de classe .

    J'ai declaré la variable contents dans ma classe Perimetres, mais je suis obligé de la declarer en variant, résultat quand contents est constitué que d'un element ce n'est pas un tableau , de plus si je veux le parcourir je ne peux pas il me dis qu'il y a un probleme au niveau du get et du let non instancié et ceci , que je crais la lecture ou l'ecriture ou non.

    J'ai trouvé une solution en transferant dans un autre tableau et en metant une condition si la dimension est de 1 mais bon , je trouve bisard , si quelqu'un a une reponse je suis preneur merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Le problème n'est pas de savoir pourquoi,car ce n'est pas possible!
    Déclares ton tableau en privé et utilises une propriété (property) public type Object, pour renseigné ton tableau!

  3. #3
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Je ne comprend pas bien ce que tu veux mais ce qui est au module de classe est au module de classe. Si tu utilise une classe, tu peux accéder à son tableau ou ses tableaux. Exemple très simple, tu crée une Sub de stockage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub StockerTableau(Valeur As String)
     
        I = I + 1
        ReDim Preserve Tbl(1 To I)
        Tbl(I) = Valeur
     
    End Sub
    tu crée une fonction de récup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function RecupTableau(pos As Integer) As String
     
        If pos > UBound(Tbl) Then
     
            RecupTableau = "Indice en dehors de la plage !"
            Exit Function
     
        End If
     
        RecupTableau = Tbl(pos)
     
    End Function
    tu déclares tes deux variables, même avec Dim, elles ne seront pas accessible en dehors de la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim Tbl() As String
    Dim I As Integer
    et dans un module standard (ou ailleurs) tu utilises comme ceci :
    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
     
    Dim Cls As New Classe1
     
    Sub Ajouter()
     
        Cls.StockerTableau "Paris"
        Cls.StockerTableau "Lyon"
        Cls.StockerTableau "Marseille"
        Cls.StockerTableau "Strasbourg"
     
    End Sub
     
    Sub Recup()
     
        MsgBox Cls.RecupTableau(2)
     
    End Sub
    de cette façon, tu as accès à son tableau.
    Tu peu créer différentes propriétés afin de connaître l'état de ton ou tes tableaux. Ici une propriété en lecture seule pour connaître le nombre max d'enregistrements (dans le module de classe):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Property Get TblMax()
     
        On Error Resume Next
        TblMax = UBound(Tbl)
     
        If Err.Number <> 0 Then TblMax = "Erreur d'exécution : " & Err.Number & vbCrLf & vbCrLf & "Tableau non initialisé !"
     
    End Property
    que tu peux lire de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub Test()
     
        MsgBox Cls.TblMax
     
    End Sub
    Hervé.

  4. #4
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Petite rectification, remplace la fonction que je viens de poster pas celle ci (j'ai ajouté une petite gestion d'erreur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Function RecupTableau(pos As Integer) As String
     
        On Error Resume Next
        RecupTableau = Tbl(pos)
     
        If Err.Number <> 0 Then RecupTableau = "Indice en dehors de la plage !"
     
    End Function
    Hervé.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir Hervé,
    De ce que j'ai compris c'est le tableau qu'il veut passer.
    Mais comme tu le montre pour TblMax, il peut utiliser Property.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Property let montableau(value)
    Tableau =value
    End property

  6. #6
    Membre éclairé
    Avatar de tamtam64
    Homme Profil pro
    stagiaire developpement vba
    Inscrit en
    Mai 2012
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : stagiaire developpement vba
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2012
    Messages : 456
    Points : 658
    Points
    658
    Billets dans le blog
    17
    Par défaut
    Dsl mais ca ne marche pas j'avais essayé en faisant proprement par contre , la methode et le code de theze j'avais plus ou moins fait ca avec une methode qui ajoute des valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Property let montableau(value)
    Tableau =value
    End property
    Bien evidement il ya des alternatives mais je ne comprenais pas pourquoi , mais c'est comme ca


    Merci en tt cas de votre aide

    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
    Dim NbSPerimetre As Integer, NomSPerimetre()
    Dim NomPerimetre As String
     
     
    Public Property Get Nom_SPerimetre() As Variant
    Nom_SPerimetre = NomSPerimetre
    End Property
     
    Public Property Get Nb_SPerimetre() As Integer
    Nb_SPerimetre = NbSPerimetre
    End Property
     
    Public Sub AjoutS_Perimetre(Nom As String)
        NbSPerimetre = NbSPerimetre + 1
        ReDim Preserve NomSPerimetre(NbSPerimetre)
        NomSPerimetre(NbSPerimetre) = Nom
    End Sub
    voila qui marche aussi

  7. #7
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Property let Nom_SPerimetre(value as variant)
        NomSPerimetre = value
     
    End Property
    Public Property Get Nom_SPerimetre() As Variant
    Nom_SPerimetre = NomSPerimetre
    End Property
    ça ça fonctionne!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    instance_classe.Nom_SPerimetre=array("toto","titi")

  8. #8
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Bonjour Robert, j'avais donc mal compris d'où le doute que j'ai émis Je pensais que tamtam64 voulait avoir accès directement à une fonction du module de classe.
    Effectivement, une propriété peu stocker un tableau :
    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
     
    Dim Cls As New Classe1
     
    Sub Inscrire()
     
        Dim Tbl(1 To 5)
     
        Tbl(1) = "A"
        Tbl(2) = "B"
        Tbl(3) = "C"
        Tbl(4) = "D"
        Tbl(5) = "E"
     
        Cls.Nom_SPerimetre = Tbl
     
    End Sub
     
    Sub Recuperer()
     
        Dim Tbl()
        Dim I As Integer
     
        Tbl = Cls.Nom_SPerimetre
     
        For I = 1 To UBound(Tbl)
     
            Debug.Print Tbl(I)
     
        Next I
     
        'ou tout simplement
        MsgBox Cls.Nom_SPerimetre(3)
     
    End Sub
    dans le module de 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
     
    Dim NomSPerimetre()
     
    Property Let Nom_SPerimetre(value)
     
        NomSPerimetre = value
     
    End Property
     
    Property Get Nom_SPerimetre()
     
        Nom_SPerimetre = NomSPerimetre
     
    End Property
    Hervé.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 11/01/2015, 23h57
  2. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  3. [VBA-E] Comment accéder à une variable tableau située dans un autre module
    Par jeanpierreco dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/02/2007, 13h15
  4. [VBA-E]Recherche dans une variable tableau
    Par illight dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/12/2006, 17h50
  5. Réponses: 3
    Dernier message: 06/09/2006, 09h06

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