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:
Le message d'erreur actuel est : "L'indice n'appartient pas à la sélection".
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
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
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
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
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.
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
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
Partager