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 Function
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
J'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
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
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.

Est-ce que quelqu'un as une idée?