Problème dans un module de classe en VBA

cs_TomC Messages postés 42 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 17 mai 2006 - 13 févr. 2006 à 19:05
cs_TomC Messages postés 42 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 17 mai 2006 - 14 févr. 2006 à 11:43
Bonjour tout le monde.
Je débute avec les modules de classes en vba et je suis confronté à un problème.
Mon code est composé de 2 modules de classes et d'un module qui fait appel à ces modules de classe.

Le problème est le suivant:
J'instancie mesModeles et je lui ajoute une instance de monModele avec la methode addModele(m as monModele). Par la suite je cherche a récupérer cet objet avec la methode getModele( i as integer) de mesModeles, mais cela ne fonctionne pas.
J'ai testé un peu tout, donc si quelqu'un pouvait me donner un pti coup de pouce.
merci d'avance.

Tom

-------
module
-------

Public mon As New monModele
Public mon2 As New monModele
Public mes As New mesModeles


Public Sub init()
mon.setA 3
mon.setBeta 4
mon.setNom "test"
mon.setTxMarque 10
mon.setTxModele 20
mon.setTxParticulier 30
mon.setTxSegment 40
mon.afficher


Debug.Print "mon:"
mes.addModele mon


Set mon2 = mes.getModele(0)


Debug.Print "mon2:"
mon2.afficher


End Sub

-------------
MonModele
-------------

Private nom As String
Private modele As modele
Private rng As Range
Private a As Integer
Private beta As Integer
Private volumes As Variant
Private lois As Variant
Private tailleVolumes As Integer
Private tailleLois As Integer


Private Sub Class_Initialize()
tailleVolumes = 0
tailleLois = 0
End Sub


Public Function getNom() As String
getNom = nom
End Function


Public Sub setNom(n As String)
nom = n
End Sub


Public Function getRng() As Range
getRng = rng
End Function


Public Sub setRng(rng1 As Range)
Set rng = rng1
End Sub


Public Function getA() As Integer
getA = a
End Function


Public Sub setA(a1 As Integer)
a = a1
End Sub


Public Function getBeta() As Integer
getBeta = beta
End Function


Public Sub setBeta(Beta1 As Integer)
beta = Beta1
End Sub


Public Function getTxParticulier() As Double
getTxParticulier = modele.txParticulier
End Function


Public Function setTxParticulier(t As Double)
modele.txParticulier = t
End Function


Public Function getTxSegment() As Double
getTxSegment = modele.txSegment
End Function


Public Function setTxSegment(t As Double)
modele.txSegment = t
End Function


Public Function getTxMarque() As Double
getTxMarque = modele.txMarque
End Function


Public Function setTxMarque(t As Double)
modele.txMarque = t
End Function


Public Function getTxModele() As Double
getTxModele = modele.txModele
End Function


Public Function setTxModele(t As Double)
modele.txModele = t
End Function


Public Function getVolumes() As Variant
getVolumes = volumes
End Function


Public Sub setVolumes(v As Variant)
volumes = v
tailleVolumes = UBound(volumes) - LBound(volumes)
End Sub


Public Function getLois() As Variant
getLois = lois
End Function


Public Sub setLois(l As Variant)
lois = l
tailleLois = UBound(lois) - LBound(lois)
End Sub


Public Sub afficher()
Debug.Print "------------------------------------------------"
Debug.Print nom
Debug.Print "................................................."
'Debug.Print "Range=" & rng.Address
Debug.Print "txParticulier=" & modele.txParticulier
Debug.Print "txSegment=" & modele.txSegment
Debug.Print "txMarque=" & modele.txMarque
Debug.Print "txModele=" & modele.txModele
Debug.Print "a=" & a
Debug.Print "beta=" & beta
Debug.Print "------------------------------------------------"
End Sub


Private Sub Class_Terminate()
End Sub

-------------
mesModeles
-------------

Private nbModeles As Integer
Private modeles() As New monModele
Private volumes As Variant
Private lois As Variant
Private tailleMax As Integer


Private Sub Class_Initialize()
nbModeles = 0
End Sub


Public Function getNbModeles() As Integer
getNbModeles = nbModeles
End Function


Public Function getModele(k As Integer) As monModele
getModele = modeles(k)
End Function


Public Sub addModele(m As monModele)
If Not m Is Nothing Then
nbModeles = nbModeles + 1
ReDim Preserve modeles(nbModeles)

Set modeles(nbModeles - 1) = m

If Module2.debuged Then
Debug.Print "modele ajouté a mesModeles"
Debug.Print "nbModeles=" & nbModeles
Debug.Print "modeles(" & nbModeles - 1&; ") :"
modeles(nbModeles - 1).afficher
End If
End If
End Sub


Private Sub Class_Terminate()
Set modeles = Nothing
End Sub

4 réponses

cs_TomC Messages postés 42 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 17 mai 2006
14 févr. 2006 à 10:08
y'a quelqu'un ? :)
Je suis en galère sévère...
0
kalobit Messages postés 169 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 7 avril 2008 2
14 févr. 2006 à 10:29
salut,

visiblement, tu n'utilise pas les syntaxes de module de classe mais ça ne semble pas être la source de ton problème.

Si j'ai bien compris, tu utilise deux classes Modeles et modele.

En toute logique, la classe modeles est une collection d'objets de classe modele.

Pour bien faire, il faudrait que ta classe modeles soit une classe collection.

Pour ça, tu déclare une collection privée dans modeles.

Ensuite tu code les propriétés et méthodes d'une collection dans cette classe en utilisant les instruction s suivantes :

property get
property let
et property set

Voici un exemple de classe collection :

ici, il s'agit d'une collection d'objet immeule, correspondant à une autre classe

' déclaration de la collection
Private Immcol As Collection


Public Function Add(Imm As Immeuble, Optional sKey As String) As Immeuble
'Ajoute l'opération à la collection


If Len(sKey) = 0 Then
Immcol.Add Imm, Imm.Nom
Else
Immcol.Add Imm, sKey
End If


'renvoyer l'objet créé
Set Add = Imm
make_moyenne
End Function


Public Property Get Item(vntIndexKey As Variant) As Immeuble
'renvoie une opération de la collection
Set Item = Immcol(vntIndexKey)
End Property


Public Property Get Count() As Long
'utilisée pour lire le nombre d'éléments dans la collection.
Count = Immcol.Count
End Property


Public Sub Remove(vntIndexKey As Variant)
'utilisée lors de la suppression d'un élément de la collection
'vntIndexKey contient l'index ou la clé, il est donc
'déclaré en tant que Variant
Immcol.Remove vntIndexKey
End Sub


Private Sub Class_Initialize()
'Crée la collection lorsque cette classe est créée
Set Immcol = New Collection
End Sub


Private Sub Class_Terminate()
'Détruit la collection lorsque cette classe est détruite
Set Immcol = Nothing
End Sub

Voilà, bon courage à toi
et n'hésite pas si tu à encore des questions

++++ [mailto:K@lobit K@lobit]
0
cs_TomC Messages postés 42 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 17 mai 2006
14 févr. 2006 à 11:03
Oui, je viens de découvrir ce matin les get let et set :-D


Et puis j'étais justement en train de changer mon tableau en une collection (décidemment ac fait beaucoup de coincidences :) )


En tout cas un grand merci à toi pour ta réponse qui va me permetter d'avancer beaucoup plus vite. Bonne journée
0
cs_TomC Messages postés 42 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 17 mai 2006
14 févr. 2006 à 11:43
Je n'arriva pas à valider ta réponse en cliquant sur réponse accepté... il doit y avoir un problème. Je reessayerai plus tard
;)
0
Rejoignez-nous