VBA - Indépendance des copies d'instances d'une classe

Magicpossum Messages postés 3 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 6 janvier 2009 - 5 janv. 2009 à 21:17
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 - 7 janv. 2009 à 19:40
En VBA sous Excel2007, je définis un module de classe, je crée deux instances, je copie la première dans la deuxième. Je modifie une valeur dans la deuxième et je constate que la valeur est également modifiée dans la première. Comment dois-je faire pour que les deux instances soient vraiment indépendantes ?

'Module de classe ModClasse

Public Aa As Integer
Dim Tt(1 To 10) As Double

Public Function Get_Tt(n As Integer) As Double
Get_Tt = Tt(n)
End Function

Public Sub Set_Tt(Val As Integer, n As Integer)
Tt(n) = Val
End Sub

=============================================================================

Dim TabMod(1 To 5) As ModClasse

Sub TestMod()
Dim i As Integer

'je crée une instance de la classe
Set TabMod(1) = New ModClasse

'j'attribue des valeurs au tableau et à une variable
For i = 1 To 10
    Call TabMod(1).Set_Tt(i * i, i)
Next
TabMod(1).Aa = 10

'je crée une 2ème instance
Set TabMod(2) = New ModClasse

'j'y copie la première
Set TabMod(2) = TabMod(1)

'je modifie des valeurs de la deuxième instance
Call TabMod(2).Set_Tt(-1, 2)
TabMod(2).Aa = 1

'les valeurs de la première instance sont également modifiées
For i = 1 To 10
    Cells(i, 1) = TabMod(1).Get_Tt(i)
    Cells(i, 2) = TabMod(2).Get_Tt(i) ' ces deux valeurs sont égales
Next
Cells(12, 1) = TabMod(1).Aa
Cells(12, 2) = TabMod(2).Aa
' ces deux valeurs sont égales

End Sub

Merci d'avance

4 réponses

cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
5 janv. 2009 à 23:00
Bonjour

Pour que tes variables de classe soient gérées comme des propriétés, il faut les déclarer Private. Ce n'est pas incorrect de déclarer une variable Public dans une classe, mais celle-ci ne peut pas être utilisée comme propriété puisqu'une variable Public est toujours unique.
Pour créer le code formant le code d'une propriété tt dans ta classe ModClass en lecture/écriture, tu dois utiliser Property Get et Property Set au lieu de Function et Sub.

Amicalement
0
Magicpossum Messages postés 3 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 6 janvier 2009
6 janv. 2009 à 10:43
Merci, j'essaie ça ce soir.
0
Magicpossum Messages postés 3 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 6 janvier 2009
6 janv. 2009 à 21:38
Bonsoir,

j'ai modifié (et simplifié) mon exemple en utilisant les property let et get. Je constate que les deux instances restent liées et que quand je modifie une valeur dans la copie, l'instance de départ est modifiée en même temps????
Y a-t-il d'autres méthode que le Set Instance(2)=Instance(1) pour utiliser la (1) comme modèle pour la (2)?

Merci pour ton aide.

Définition de la classe ModClasse

Private vAA As Integer

Public Property Get AA() As Integer
AA = vAA
End Property

Public Property Let AA(n As Integer)
vAA = n
End Property

Dim TabMod(1 To 2) As ModClasse

Sub TestMod()
Dim i As Integer

'je crée une instance de la classe
Set TabMod(1) = New ModClasse

'j'attribue des valeurs à une variable

TabMod(1).AA = 10

'je crée une 2ème instance
Set TabMod(2) = New ModClasse

'j'y copie la première
Set TabMod(2) = TabMod(1)

'je modifie des valeurs de la deuxième instance
TabMod(2).AA = 14

'les valeurs de la première instance sont également modifiées

Cells(1, 1) = TabMod(1).AA '= 14
Cells(1, 2) = TabMod(2).AA '= 14

End Sub
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
7 janv. 2009 à 19:40
Bonjour
Je pense que c'est normal. Tu crées bien une 2e instance, mais elle est "annulée" par l'instruction Set TabMod(2) TabMod(1). Plutôt qu'écraser l'objet tu devrais recopier les propriétés d'un objet à l'autre : Tabmod(2).AA TabMod(1).AA...

Amicalement
0
Rejoignez-nous