Créer tableau, collection pour objets utilisateur Excel VBA

Bonjour,

J´aimerai savoir comment faire une procédure pour stocker des éléments dans un tableau ou une collection. La procédure aurait comme paramètre d´entrée un tableau ou une collection vide et remplirait ce paramètre avec des éléments. En particulier j´ai crée un nouvel objet appelé NewObjet. J´aimerai créer un tableau ou une collection avec par exemple 200 éléments qui seraient des NewObjet. Merci pour vos réponses.

Bonjour,

avec une collection ça devrait bien se faire. En gros:

public MaCollection as Collection

public sub AjoutCollection()
     set MaCollection = new Collection

     MaCollection.Add(NewObject1)
end sub

ok j'y vais au plus simple, mais avec ton code on pourrait y voir plus clair.

Merci Math pour ta réponse

Premièrement j áimerai savoir quelle est la différence entre :

set MaCollection = new Collection

et

Dim MaCollection As new Collection

Ensuite Voici mon problème:

J´ai crée un nouvel objet appelé Fiche dont le module de classe est le suivant:

----------------------------------Module de Classe Fiche-------------------------------------------

Option Explicit

Option Base 1

Private FNum As Integer

Private Fcommentaire As String

Private Sub Class_Initialize()

End Sub

Public Property Let Num(Valeur As Integer)

FNum = Valeur

End Property

Public Property Let Commentaire(Valeur As String)

Fcommentaire = Valeur

End Property

Public Property Get Num() As Integer

Num = FNum

End Property

Public Property Get Commentaire() As String

Commentaire = Fcommentaire

End Property

--------------------------------------------FIN MODULE DE CLASSE-------------------------------------------------

Je cherche a stocher dans une collection (dicoVB) plusieurs objets fiche. Dans ma procédure principale TEST je ferais appel a une procédure Stocker_dico_array4 pour stocker les éléments fiches. A priori tout fonctionne bien. J´utilise d´abord un remplissage utilisant des fiches différentes (element1, element2 et element3). Puis je me sers d´une boucle sur element2 pour continuer à remplir ma Collection. Lorsque j´affiche par Debug.print le premier teme de la collection pas de problème. Cependant en affichant le deuxième terme, je n´obtiens pas l´élément2 initial sinon l´element2 lors de son dernier passage dans la boucle. Que se passe-t-il? Peut-on utiliser une boucle pour remplir une collection (j´ai plusiseurs dizaine de fiches à intégrer). Merci pour ton aide.

Sub TEST()

Dim dicoVB As New Collection

Dim a As Fiche

Stocker_dico_array4 dicoVB

Set a = dicoVB(1)

Debug.Print dicoVB.Count

Debug.Print a.Num

Debug.Print a.Commentaire

Set a = dicoVB(2)

Debug.Print dicoVB.Count

Debug.Print a.Num

Debug.Print a.Commentaire

End Sub

Sub Stocker_dico_array4(dicoVB As Collection)

Dim element1 As New Fiche, element2 As New Fiche, element3 As New Fiche

Dim compteur_ligne As Integer

element1.Num = 1

element1.Commentaire = "premier_mot"

element2.Num = 2

element2.Commentaire = "second_mot"

element3.Num = 3

element3.Commentaire = "troisieme_mot"

dicoVB.Add element1

dicoVB.Add element2

dicoVB.Add element3

For compteur_ligne = 1 To 2

element2.Num = 10 + compteur_ligne

dicoVB.Add element2

Next compteur_ligne

End Sub

Bonjour,

set MaCollection = new Collection

et

Dim MaCollection As new Collection

C'est du pareil au même, je le faisais en deux lignes et toi tu le fais dans la même.

pour ton problème, ton code se comporte normalement, la propriété num de ta classe est un integer, dans ta boucle elle écrase à chaque fois l'ancienne. Est-ce que la valeur de num doit être unique ou bien elle peut être multiple?

-- Ven Fév 12, 2010 10:35 am --

un exemple avec la propriété num comme tableau

ta classe:

Option Explicit
Option Base 1

Private FNum() As Integer
Private MaxTableau As Integer
Private Fcommentaire As String

Public Property Let Num(Valeur As Integer)
MaxTableau = MaxTableau + 1
ReDim Preserve FNum(MaxTableau)
FNum(MaxTableau) = Valeur
End Property

Public Function GetNum(Optional Index As Integer = 1) As Integer
GetNum = FNum(Index)
End Function

Public Property Get GetDimensionNum() As Integer
    GetDimensionNum = MaxTableau
End Property

Public Property Let Commentaire(Valeur As String)
Fcommentaire = Valeur
End Property

Public Property Get Commentaire() As String
Commentaire = Fcommentaire
End Property

et ton code

Sub TEST()

Dim dicoVB As New Collection
Dim a As Fiche
Dim i As Integer

Stocker_dico_array4 dicoVB

Set a = dicoVB(1)
Debug.Print dicoVB.Count
Debug.Print a.GetNum
Debug.Print a.Commentaire

Set a = dicoVB(2)
Debug.Print dicoVB.Count

For i = 1 To a.GetDimensionNum
    Debug.Print a.GetNum(i)
Next i
Debug.Print a.Commentaire

End Sub

Merci Math pour ta solution. De cette manière il est vrai que l´on réussit a garder toutes les données dans une collection. seulement ceci m´oblige donc à modifier la structure de mon objet fiche. De même pour récupérer le commentaire de chaque fiche je vais devoir aussi faire un tableau puis je vais ajouter d´autres éléments à chaque fiche et chaque fois je devrais utiliser un tableau. C´est comme ci je crée un objet "voiture" et que je rentre la couleur de la voiture un tableau. Mon objet final ne sera pas vraiment une voiture... Mon ideée initiale était de stocker dans une collection plusieurs objets fiche en conservant leur structure. Afin de pouvoir récupérer chaque fiche facilement avec une ligne du type fiche_a_recupérer = MaCollection(10) par exemple.

Collection:

Fiche 1

Fiche 2

Fiche 249

Fiche 250

Je ne sais pas si cela est possible. Qu´en pense-tu?

49exemple2.xlsx (35.33 Ko)

c'est exactement ce que fait mon code. Dans ta fiche est-ce que chaque valeur est unique? si oui oubli mon code, c'était une exemple pour avoir une valeur sous forme de tableau. Si tu veux utiliser un boucle pour remplir ta collection tu devras déclarer ton objet fiche dans ta boucle et l'affecté dans ta collection:

for i = 1 to NbFiches
dim objFiche as new fiche
   objFiche.num = i
   objFiche.Commentaire = i & "_mot"

   dicoVB.add(objFiche)
   objFiche = nothing
next i

Désolé pour ma réponse tardive, j´étais parti en vacances!

Merci beaucoup Math. Dans ma fiche chaque valeur n´est pas forcément unique. Ca peut être n´importe quoi. Je vais tester ta nouvelle solution. J´espère que ca marchera.

Merciiiiiiii

Bonjour,

Lorsque j´effectue:

for i = 1 to NbFiches

dim objFiche as new fiche

objFiche.num = i

objFiche.Commentaire = i & "_mot"

dicoVB.add(objFiche)

objFiche = nothing

next i

VBA m´envoie le message d´erreur:

Erreur d'exécution 438 # :

Objet ne gère pas cette propriété ou la méthode

Quelqu´un as-t-il une idée?

Merci

Est-ce que tu sais sur quelle ligne l'erreur se produit?

On dirait qu'une des propriétés de ton objFiche est mal utilisé.

Oui, l´erreur apparaît sur la ligne ObjFiche = nothing.

Peut être faut-il que je définisse l´instruction nothing dans la d´efinition de l´objet fiche?

Merci

pour attribuer une valeur à un objet, oublie pas le set:

set objFiche = nothing

Bonne journée

barre de formule
Rechercher des sujets similaires à "creer tableau collection objets utilisateur vba"