Bonjour à tous,
Après plusieurs jours à tourner en rond, je me sens obliger de passer par ici pour trouver de l'aide sur mon problème.
Je souhaite intégrer en VBA dans une Collection de classe un grand nombre de données pour pouvoir les manipuler plus facilement par la suite.
On parle ici d'une feuille d'environ 100 x 100 qui doit être facilement modifiable ajout de colonnes ou de lignes.
Dans un soucis de propreté j'ai voulu utilisé des tableaux de 5 entrées pour environ 20 variables plutôt que d'en créer 100... Cependant en me basant sur différents guide comme ceux la :
http://tissotemmanuel.developpez.com...-de-classe/#LI
http://silkyroad.developpez.com/vba/tableaux/#LI
La feuille ou je récupère mes données comporte sur chaque ligne un Produit de différents éléments.
Chaque ligne de produit forme ma Collection de Produits
J'ai écrit 2 modules de classe:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 '--------------------------------' '-Module de classe clsOISProduct-' '--------------------------------' Option Explicit Option Base 1 Private mProvider As String Private mProduct As String Private mVersion As String Private mCustomerPortal(1 To 5) As Long '... je vous passe le nombre de variable pour plus de lisibilité Property Get Provider() As String ' Propriété en lecture Provider = mProvider End Property Property Let Provider(NewProvider As String) ' Propriété en écriture mProvider = NewProvider End Property Property Get Product() As String ' Propriété en lecture Product = mProduct End Property Property Let Product(NewProduct As String) ' Propriété en écriture mProduct = NewProduct End Property Property Get Version() As String ' Propriété en lecture Version = mVersion End Property Property Let Version(NewVersion As String) ' Propriété en écriture mVersion = NewVersion End Property Property Get CustomerPortal() As Long ' Propriété en lecture CustomerPortal = mCustomerPortal 'Renvoie le tableau End Property Property Let CustomerPortal(ByRef NewCustomerPortal As Long) ' Propriété en écriture Dim i As Long 'Vérification des caractéristiques de NewList (base et dimensions) For i = 0 To UBound(NewCustomerPortal) 'Validation If Not CheckItem(NewCustomerPortal(i)) Then Err.Raise vbObjectError + 1, , "Valeur incorrecte à l'indice " & i 'Erreur End If Next mCustomerPortal = NewCustomerPortal 'Affectation du tableau End Property Property Let CustomerPortalItem(Index As Long, NewCustomerPortalItem As Long) If CheckItem(NewCustomerPortalItem) Then 'Validation mCustomerPortal(Index) = NewCustomerPortalItem 'Affectation Else Err.Raise vbObjectError + 1, , "Valeur incorrecte à l'indice " & Index 'Erreur End If End Property '... je vous passe l'ensemble des fonctions correspondant aux autres variables Private Function CheckItem(Item As Long) As Boolean CheckItem = Item >= 0 'Refuse les valeurs négatives End FunctionJ'appelle ensuite une fonction d'initialisation dans une page quelconque.
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 '----------------------------------' '-Module de classe clsProductTable-' '----------------------------------' Option Explicit Private Products As Collection 'Déclare une collection Private Sub Class_Initialize() Set Products = New Collection 'Initialise la collection End Sub Function Count() As Long 'Nombre d'éléments Count = Products.Count End Function Function Item(IndexOrName As Variant) As clsOISProduct 'Renvoi un élément Set Item = Products.Item(IndexOrName) End Function Sub Remove(IndexOrName As Variant) 'Retire un élément Products.Remove IndexOrName End Sub Sub Add(Product As clsOISProduct) Products.Add Product 'Ajouter un élément End Sub
Mais je tombe sur une erreur "Incompatibilité de type" pour la récupération des données (au niveau du [ko]). Je l'ai tourné dans tous les sens sans succès. Impossible de récupérer les données stocker dans la classe dès que c'est un tableau.
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 Option Explicit Option Base 1 '-----------------------------------------------------------' 'Fonction d'initialisation des données de la liste référence' '-----------------------------------------------------------' Sub InitDonnees() Dim X As Integer, i As Long, j As Long, t As Variant, tmpTable() As Long 'Déclare un élément de type productOIS Dim ProductTable As New clsProductTable Dim OneProduct As clsOISProduct 'Identification du nombre de produits Cellule "NBProd" en CI2 t = Feuil3.Range("NBProd").Value X = CInt(t) '---------------Chargement du tableau-----------------' 'Remplit chaque élément avec les éléments de la feuil3' For i = 1 To X ReDim tmpTable(1 To 5) Set OneProduct = New clsOISProduct OneProduct.Provider = Feuil3.Cells(i + 2, 1).Value OneProduct.Product = Feuil3.Cells(i + 2, 2).Value OneProduct.Version = Feuil3.Cells(i + 2, 3).Value For j = 1 To 5 tmpTable(j) = CLng(Feuil3.Cells(i + 2, 3 + j).Value) OneProduct.CustomerPortalItem(j) = tmpTable(j) Next j '... je passe le remplissage de l'ensemble des données ProductTable.Add OneProduct Set OneProduct = Nothing Erase tmpTable() Next i '------------Fin Chargement du tableau----------------' '-----------------------------------------------------' '---- Affiche le résultat dans la fenêtre d'exécution ------- Debug.Print ProductTable.Item(1).Provider 'ok Debug.Print ProductTable.Item(1).Product 'ok Debug.Print ProductTable.Item(1).Version 'ok Debug.Print ProductTable.Item(1).CustomerPortal '[ko] Debug.Print vbTab End Sub
Est-ce que quelqu'un as une idée?
Partager