Creation Tableau 2 D aux travers Module de Classe est Incompréhension "Let" et "Get"

laurent950

XLDnaute Accro
Bonsoir le forum,

J'ai un soucis avec un module de classe je comprend pas pourquoi je ne peux pas reprendre
la même variable du module de classe avec "Get" et "Let" soit : TabMusique (Plantage !)

pour extraire utilisé se tableau dans le module standard :

je suis obligé de passé par un : "Get" avec TabMusique
----------------------- et par un : "Let" avec TabMusique2

Si vous avez une réponse ? un grand merci car je cherche mais ne trouve pas de réponse.

Fichier excel joint au message :
"Module de classe constructeur tableau2.xlsm"

Code et message (Image) platage

Ci-dessous le code qui fonctionne.

Dans un module standard « Module1 » je crée cette procédure :

VB:
Sub Example()
    Dim ObjetTab As New Musique
    pRows = 5 ' Ligne (5)
    pCols = 3  ' Colonne (3)
    ' Avec Let
    ObjetTab.TabMusique(pRows) = pCols
    ' Avec Get
    Dim TabMus() As Variant
    TabMus = ObjetTab.TabMusique2
   ' Si j'utilise ObjetTab.TabMusique avec Get cela ne fonctionne pas ? je suis obligler de passé
   ' par ObjetTab.TabMusique2 pour arriver à récupérer ce tableau stocké dans le module de classe
   ' car si non j'ai le message d'erreur est lorsque l'on tape ObjetTab. (Il n'y a rien de mentionné 
   ' avec  la procédure écrite dans le module de classe : Property Get TabMusique() donc je suis 
   ' obligé de l'écrire différemment j'ai choisie Property Get TabMusique2()... Mais j'aurais pu 
   ' l'appeler  Property Get TOTO()
   ' Je ne comprend pas cette nuance
   
    ' exemple : remplire ce tableau (Crée est dimensionné par le module de classe)
    For i = LBound(TabMus, 2) To UBound(TabMus, 2)
        For j = LBound(TabMus, 1) To UBound(TabMus, 1)
            Cells(j, i) = "Ligne" & j & " / " & "Colonne" & i
        Next j
    Next i
End Sub

Dans le module de classe « Musique » je crée cette procédure :

VB:
Option Base 1
Private mTabMusique() As Variant

Property Let TabMusique(Rows, Cols)
    ReDim mTabMusique(Rows, Cols)
End Property

' Copie du message d'erreur dans le fichier excel avec : Property Get TabMusique()
' je comprend pas pourquoi ? ca devrait fonctionné ou je passe à côté de quelque chose ?

Property Get TabMusique2()                ' Ici fonctionne correctement !
    TabMusique2 = mTabMusique
End Property

Laurent
 

Pièces jointes

  • Module de classe constructeur tableau2.xlsm
    131.6 KB · Affichages: 34
Dernière édition:

david84

XLDnaute Barbatruc
Re : Creation Tableau 2 D aux travers Module de Classe est Incompréhension "Let" et "

Bonjour,

si je m'inspire des informations lues dans ce document je ferais plutôt comme cela (mais il y a d'autres méthodes bien entendu) :
Dans le module de classe :
Code:
Private mTabMusique() As Long

Property Get TabMusique() As Long()
    TabMusique = mTabMusique
End Property


Property Let TabMusique(ByRef NewTabMusique() As Long)
    mTabMusique = NewTabMusique
End Property

Dans le module standard :
Code:
'l'exemple n'est pas le même que le tien mais c'est juste pour tester
Sub Example()
Dim ObjetTab As Musique, TabLong() As Long, i As Long, j As Long
Set ObjetTab = New Musique

'il est préférable de dimensionner le tableau dans le module standard et non dans le module de classe
ReDim TabLong(0 To 4, o To 2)

For j = LBound(TabLong, 2) To UBound(TabLong, 2)
  For i = LBound(TabLong) To UBound(TabLong)
    TabLong(i, j) = i + j
  Next i
Next j

ObjetTab.TabMusique = TabLong
Erase TabLong
MsgBox UBound(ObjetTab.TabMusique) 'Affiche l'indice supérieur
TabLong = ObjetTab.TabMusique
End Sub
A+
 
Dernière édition:

Iznogood1

XLDnaute Impliqué
Re : Creation Tableau 2 D aux travers Module de Classe est Incompréhension "Let" et "

Laurent,

quelques explications en complément de la réponse de David :

La propriété TabMusique représente un tableau.
Tu peux affecter un tableau à cette propriété par Property Let ou accéder ce tableau par Property Get.

Or, dans ton code, tu essayes de modifier les dimensions du tableau (autrement dit, tu tentes de modifier les propriétés d'une propriété de ta classe !).
Pour faire ça, tu dois utiliser une "méthode" du style :
Code:
Sub InitTab(Rows as Integer, Cols as Integer)
Redim mTabMusique(Rows,Cols)
End Sub
 

laurent950

XLDnaute Accro
Re : Creation Tableau 2 D aux travers Module de Classe est Incompréhension "Let" et "

Bonjour,david84 et Iznogood1.

Je vous remercie pour vos réponse, il semble qu'il y ai pas une réponse, je développe ci-dessous avec une explication et le fichier modifier du Poste #1.

le soucis ne viens pas de la variable tableau mais d'une utilisation correcte du Let et du Get.

' Explication :
' Let ecrit dans le module de classe
' Get ne permet de ne renvoyer qu'une seule valeur
' (comme une fonction d'un module standard qui ne peut renvoyer qu'une seule valeur)

' donc précédement dans mon premier Poste #1 j'avais écrit :

' Avec Let

' Property Let TabMusique(Rows, Cols)
' Deux valeur a écrire avec l'appel de la fonction TabMusique
' Soit pour Rows (la valeur du nombre de lignes)
' et pour
' Cols (la valeur du nombres de colonnes)
' avec les valeurs j'ai crée un tableau dans le module de classe
'
'
' Le Probléme ne vient pas du tableau crée
' mais tous simplement de la fonction Get qui ne peut renvoyer qu'une seul valeur

' Soit le plantage avec Get

' Property Get TabMusique()

' Car tous simplement avec

' la fonction Let TabMusique j'ai recu deux valeur
' et donc
' la fonction Get TabMusique (dois aussi lire les deux valeur de (Let TabMusique) est comme
' l'ordinateur ne sait pas choisir le renvois d'une ou l'autre valeur ca plante !!

' Donc en conclusion si pour le même nom de fonction pour (Let et Get) il faut envoyer une valeur
' pour lire une valeur.
' comme l'emple si dessous pour les noms

' Property Let TabMusique(Nom as string)
' Property Get TabMusique() as string

' si le let a deux valeur
' Property Let TabMusique(Nom as string, Prenom as string)
' ecriture dans le module de classe
' VariblePrivéModuleDeClasse1 = Nom
' VariblePrivéModuleDeClasse2 = Prenom
' end Property

' La fonction Get doit avoir deux nom différent car il ne sait pas
' choisir laquelle des deux valeur du Get il doit renvoyer avec le
' même nom : "PLANTAGE" voir poste #1
' Get TabMusique() as string "PLANTAGE"

' Car une fonction Get ne peut renvoyer qu'une seul valeur

' Si ont veux lire le nom.
' Property Get NomTabMusique() as string
' NomTabMusique = VariblePrivéModuleDeClasse1
' end property

' Si ont veux lire le prenom.
' Property Get PrenomTabMusique() as string
' PrenomTabMusique = VariblePrivéModuleDeClasse2
' end Property

' Si j'avais voulu ecrire avec le même nom pour les deux sans Plantage
' Pour le Let et le Get avec nom commun :

' Property Let TabMusique(Nom as string)
' Property Get TabMusique() as string

' je serais passer par une variable tableau pour stocker les
' deux valeurs dans le tableaux au moyen du Let et renvoyer
' au moyen du Get une valeur soit le tableau et la sa fonctionne
' comme l'exmple de cette macro

' si le let a deux valeur
' Stocké Nom et prénom dans un tableau
' Priver du module de classe exemple : TableauDuModuleDeClasse
' Ici tabCoordone par exemple viens du module standard ou sont
' stocké les valeur (Nom et prenom)
' le let recois donc les deux valeurs stocké dans un tableau du module standard

' Property Let TabMusique(tabCoordone() as string)
' ecriture dans le module de classe
' TableauDuModuleDeClasse(1) = tabCoordone(1) ' Nom
' TableauDuModuleDeClasse(2) = tabCoordone(2) ' Prenom
' end Property

' Si ont veux lire le prenom et prémon.
' stocké dans le tableau
' ont envois le tablau dans la varible publ
' Property Get PrenomTabMusique() as string
' PrenomTabMusique = TableauDuModuleDeClasse
' end Property

En tous cas un grand merci pour vos réponse

Laurent
 
Dernière édition:

laurent950

XLDnaute Accro
Re : Creation Tableau 2 D aux travers Module de Classe est Incompréhension "Let" et "

Bonsoir david84 et Iznogood1.

explication : Poste #1 Intérogation et
Poste #4 Explication
Poste #5 le code (Property Let TabMusique) et (Property Get TabMusique) Soit Même nom

VB:
Sub Example()
    Dim ObjetTab As New Musique
    
    ' Le Tableau TabCre
    ' Stock le (Nb) lignes est (Nb) colonnes dans une variable tableau
    ' envoyer dans le module de classe
    
    ' Création d'un tableau 1 dimension est 2 cases
    Dim TabCre(1 To 2) As Variant
    TabCre(1) = 5     ' Ligne (5)
    TabCre(2) = 3     ' Colonne (3)
    
    ' Avec Let ' envois du tableau dans le module de classe.
    ObjetTab.TabMusique() = TabCre
    
    ' Avec Get ' envois Tableau privé du module de classe vers tableau public module standard
    Dim TabMus() As Variant
    TabMus = ObjetTab.TabMusique
    
    ' Exemple : remplire ce tableau
    For i = LBound(TabMus, 2) To UBound(TabMus, 2)
        For j = LBound(TabMus, 1) To UBound(TabMus, 1)
            Cells(j, i) = "Ligne" & j & " / " & "Colonne" & i
        Next j
    Next i
End Sub

VB:
Private mTabMusique() As Variant
Property Let TabMusique(TabCre As Variant)
    ReDim mTabMusique(TabCre(1), TabCre(2))
End Property
Property Get TabMusique() As Variant
    TabMusique = mTabMusique
End Property
 

Pièces jointes

  • Module de classe constructeur tableau4.xlsm
    23.6 KB · Affichages: 26
Dernière édition:

david84

XLDnaute Barbatruc
Re : Creation Tableau 2 D aux travers Module de Classe est Incompréhension "Let" et "

Bonjour,

juste pour comprendre : tu crées un tableau simplement pour pouvoir stocker les dimensions qui vont te permettre de redimensionner ton tableau principal ? Si c'est cela je trouve que cela complexifie la manœuvre.

L'un des intérêts d'utiliser un module de classe serait de permettre à l'utilisateur lambda d'avoir à sa disposition des propriétés et des méthodes intuitives.

Dans le cas de l'utilisation d'une classe Tableau cette manière de faire me paraît compliquée.

Au lieu de passer par une procédure Property pour gérer cette possibilité de redimensionner ton tableau pourquoi ne pas plutôt utiliser une méthode qui accepterait les 2 index (index ligne et index colonne) ?
L'utilisateur pourrait ainsi avoir à sa disposition cette méthode (par exemple RedimTab) lorsqu'il taperait dans le module standard ObjetTab.RedimTab et il n'aurait plus qu'à préciser le nombre de lignes et de colonne(s)
Code:
ObjetTab.RedimTab(5,3)
et le reste serait géré par la méthode placée dans le module de classe.

A priori cela me paraîtrait plus adapté et plus simple à construire.

Ceci dit comme je ne connais pas le but de ton travail peut-être que je me trompe.
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 370
Messages
2 087 679
Membres
103 636
dernier inscrit
SeidoLx