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 subok 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 Propertyet 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 SubMerci 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?
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 iDé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
