Bonjour,

Contextualisation du problème :
Je suis enseignant et je souhaite créer une petite macro afin de créer automatiquement des groupes pour mes élèves selon leurs affinités.
Après avoir effectué quelques tests sur une feuille Excel pour savoir si cela était faisable (la procédure demandant une optimisation avec des variables binaires, je n'étais pas convaincu de l'efficacité/pertinence de Excel), je me lance maintenant dans l'automatisation de la création des groupes avec de belles macros.

Rentrons maintenant dans le vif du sujet.
Pour faire ma macro, je vais utiliser 2 classes :
- La classe cEleve où j'aurais le nom et le prénom de l'élève - mNom et mPrenom en "string".
- La classe cClasse avec juste le nom de la classe : Ex CE2 - mNom_Classe en "string", le nombre d'élèves dans la classe de CE2 en -N_Eleves en "integer" - et la liste d'élèves - mEleves() de type "cEleve".
Afin de limiter la confusion entre une classe de vba, et une classe d'élèves, j'ai choisi de mettre en italique lorsque je parle d'une classe d'élèves!

Le problème :
Et j'ai un problème qui intervient très rapidement...
Dès que je souhaite donner le nom à un élève d'une classe de CE2, je suis confronté à des erreurs dans tous les sens, soit incompatibilité de type, soit le programme lit la valeur existante au lieu de lui donner la valeur... etc... suivant mes tentatives pour corriger le problème.

Voici la portion de code me servant de test qui pose problème, avec en gras la ligne qui bug:
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
Option Base 1
Option Explicit

Sub test()

Dim Jean As New cEleve

Jean.Nom = "Truc"
Jean.Prenom = "Jean"

Dim CE2 As New cClasse
CE2.N_Eleves = 1

CE2.Eleves(1).Nom = Jean.Nom

End Sub
Le message d'erreur actuel est : "L'indice n'appartient pas à la sélection".
En mode debug, à la ligne en gras, je rentre dans la classe cEleve et lit la valeur du nom - Ligne 9 du code ci dessous.
Puis j'entre dans la classe cClasse à la ligne 32. Qui veut lire la valeur de l'élève dans la mEleve() au lieu de l’attribuer...

Codes
La classe Cclasse
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
Option Explicit
Option Base 1
 
Private mNom_Classe As String
Private mN_Eleves As Integer
Private mEleves() As cEleve
 
Private Affinite() As Double
 
Property Get Nom_Classe() As String
    ' Propriété en lecture
    Nom_Classe = mNom_Classe
End Property
 
Property Let Nom_Classe(Nom_Classe As String)
    ' Propriété en écriture
    mNom_Classe = Nom_Classe
End Property
 
Property Get N_Eleves() As Integer
    ' Propriété en lecture
    N_Eleves = mN_Eleves
End Property
 
Property Let N_Eleves(N_Eleves As Integer)
    ' Propriété en écriture
    mN_Eleves = N_Eleves
    ReDim mEleve(mN_Eleves)
End Property
 
Property Get Eleves() As cEleve
' Propriété en lecture
Dim i As Integer
 
For i = 1 To mN_Eleves
    Eleves(i).Nom = mEleves(i).Nom
    Eleves(i).Prenom = mEleves(i).Prenom
Next i
End Property
 
Property Let Eleves(Eleves As cEleve)
    ' Propriété en écriture
    Dim i As Integer
 
    For i = 1 To mN_Eleves
        ' Propriété en lecture
        mEleves(i).Nom = Eleves(i).Nom
        mEleves(i).Prenom = Eleves(i).Prenom
    Next i
End Property
La classe cEleve
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
 
Option Explicit
Option Base 1
 
Private mNom As String
Private mPrenom As String
 
 
Property Get Nom() As String
    ' Propriété en lecture
    Nom = mNom
End Property
 
Property Let Nom(Nom As String)
    ' Propriété en écriture
    mNom = UCase(Nom)
End Property
 
Property Get Prenom() As String
    ' Propriété en lecture
    Prenom = mPrenom
End Property
 
Property Let Prenom(Prenom As String)
    ' Propriété en écriture
    mPrenom = UCase(Prenom)
End Property
Je suis persuadé que l'erreur est extrêmement simple à corriger lorsqu'on sait quoi mettre, mais je n'ai pas trouvé la solution pour le moment.
La seule alternative que j'ai pu trouver aurait été d'utiliser des collections, mais je ne sais pas pourquoi, ça ne me tente pas...

Cordialement,

T. MARTIN