Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tri d'une collection

5 réponses
Avatar
Iznogood1
Bonjour,

soit une Collection d'objets (modules de classe).

Je souhaite permuter des objets de cette collection, mais =E7a ne
fonctionne pas !
Quelqu'un aurait-il une piste.


Exemple de code :
Sub Test()
Dim i As Long
Dim MaColl As New Collection
Dim MaClass As Classe1
Dim Echange As Classe1

For i =3D 1 To 2
Set MaClass =3D New Classe1
MaColl.Add MaClass
Next i

Set Echange =3D MaColl(1)
Set MaColl(2) =3D Echange '--> CA COINCE ICI !
Set MaColl =3D MaColl(1)
End Sub


Merci

5 réponses

Avatar
izsobad1
Pour ceux que ça intéresse, une solution (parmi d'autres ?) est de
copier la collection dans un tableau (array).
La permutation est alors possible !
-> La question devient : quel intérêt de la collection par rapport au
tableau ?
(rapidité d'éxécution, ajout d'éléments sans "redim"... ?)



Dim x() As Variant
Dim i As Long

'On copie la collection dans un tableau
ReDim x(MaColl.Count - 1)
For i = 0 To MaColl.Count - 1
Set x(i) = MaCOll(i + 1)
Next i

'--> Permutations possible sur x()

'On copie le tableau dans la collection
Set MaColl = Nothing
For i = 0 To UBound(x)
MaColl.Add x(i)
Next i

End Sub




On 7 sep, 14:13, Iznogood1 wrote:
Bonjour,

soit une Collection d'objets (modules de classe).

Je souhaite permuter des objets de cette collection, mais ça ne
fonctionne pas !
Quelqu'un aurait-il une piste.

Exemple de code :
Sub Test()
  Dim i As Long
  Dim MaColl As New Collection
  Dim MaClass As Classe1
  Dim Echange As Classe1

  For i = 1 To 2
    Set MaClass = New Classe1
    MaColl.Add MaClass
  Next i

  Set Echange = MaColl(1)
  Set MaColl(2) = Echange   '--> CA COINCE ICI !
  Set MaColl = MaColl(1)
End Sub

Merci


Avatar
michdenis
Bonjour Iznogood1,

Ta collection "MaColl" contient 2 instance de la classe objet "Classe1"

Lorsque tu ajoutes un item à une collection, tu peux ajouter
un deuxième paramètre "Key" qui doit représenter une chaîne "texte"
que tu peux par la suite utiliser pour désigner un membre de la
collection au lieu d'employer son index.

Dim Arr As Variant 'variable contenant le nom de chaque item de la collection
Arr = Array("Objet1","Objet2")

For each elt in arr
Set MaClass = New Classe1
MaColl.Add MaClass, elt
next

Plus loin dans ton code, si tu veux faire référence à l'item "Objet2"
Set T = MaColl("Objet2")

Tu as aussi la méthode "Remove" pour enlever un item de la collection

Est-ce possible d'être plus explicite sur l'objectif de ta démarche ?

N.B- Cette ligne de code :
Set MaColl = MaColl(1)
Il ne faut pas oublier que tu as défini ta variable "MaColl"
comme une nouvelle collection. Ta ligne de code est impossible
car tout au long de ton code, tu peux ajouter ou enlever des
items à ta collection par les méthodes "Add" ou "Remove" mais
tu ne peux pas changer le "Type" de ta variable !
Tu peux utiliser une autre variable objet et faire :
Set T = MaColl(1)





"Iznogood1" a écrit dans le message de groupe de discussion :

Bonjour,

soit une Collection d'objets (modules de classe).

Je souhaite permuter des objets de cette collection, mais ça ne
fonctionne pas !
Quelqu'un aurait-il une piste.


Exemple de code :
Sub Test()
Dim i As Long
Dim MaColl As New Collection
Dim MaClass As Classe1
Dim Echange As Classe1

For i = 1 To 2
Set MaClass = New Classe1
MaColl.Add MaClass
Next i

Set Echange = MaColl(1)
Set MaColl(2) = Echange '--> CA COINCE ICI !
Set MaColl = MaColl(1)
End Sub


Merci
Avatar
izsobad1
Merci Michel pour ces explications.

1/Le but de ma manip est de trier une collection d'objets
"persos" (modules de classe) (algorithme de tri rapide
http://docvb.free.fr/vbplus/Tris/Tri.php).
Le tri se fait sur une propriété de mon objet.
-> je voulais permuter des éléments de ma collection.

La "key" d'un élément d'une collection permet un accès rapide à
l'élément, ce qui me permettra sûrement de me dispenser de trier en
générant des "keys" adaptées (il faut que je trouve une "clé unique ").


2/En effet la ligne "Set MaColl = MaColl(1)" est une coquille due à un
copier/coller mal-t-a-propos !
Je voulais écrire Set MaColl(2)=MaColl(1).
Ce qui coince aussi de toute manière.

Je ne comprends toujours pas pourquoi ça coince d'ailleurs.
Je pensais qu'une collection était un ensemble de pointeurs sur des
objets. Pourquoi ne puis-je donc pas avoir de 2 pointeurs qui pointent
sur le même objet ?

Ca fonctionne si je fait

Set MaClass = New Classe1
For i = 1 To 2
MaColl.Add MaClass
Next i

Si je modifie une propriété de MaClass, et que je parcours MaColl,
tous les éléments ont leur propriété modifiée
(en fait c'est un abus de langage, car il n'y a qu'un seul objet dans
MaColl !)


On 7 sep, 15:39, "michdenis" wrote:
Bonjour Iznogood1,

Ta collection "MaColl" contient 2 instance de la classe objet "Classe1"

Lorsque tu ajoutes un item à une collection, tu peux ajouter
un deuxième paramètre "Key" qui doit représenter une chaîne "text e"
que tu peux par la suite utiliser pour désigner un membre de la
collection au lieu d'employer son index.

Dim Arr As Variant  'variable contenant le nom de chaque item de la col lection
Arr = Array("Objet1","Objet2")

For each elt in arr
        Set MaClass = New Classe1
        MaColl.Add MaClass, elt
next

Plus loin dans ton code, si tu veux faire référence à l'item "Objet 2"
Set T = MaColl("Objet2")

Tu as aussi la méthode "Remove" pour enlever un item de la collection

Est-ce possible d'être plus explicite sur l'objectif de ta démarche ?

N.B- Cette ligne de code :
          Set MaColl = MaColl(1)
        Il ne faut pas oublier que tu as défini ta variable "Ma Coll"
        comme une nouvelle collection. Ta ligne de code est impos sible
        car tout au long de ton code, tu peux ajouter ou enlever des
        items à ta collection par les méthodes "Add" ou "Remo ve" mais
        tu ne peux pas changer le "Type" de ta variable !
        Tu peux utiliser une autre variable objet et faire :
        Set T = MaColl(1)

"Iznogood1" a écrit dans le message de groupe de dis cussion :

Bonjour,

soit une Collection d'objets (modules de classe).

Je souhaite permuter des objets de cette collection, mais ça ne
fonctionne pas !
Quelqu'un aurait-il une piste.

Exemple de code :
Sub Test()
  Dim i As Long
  Dim MaColl As New Collection
  Dim MaClass As Classe1
  Dim Echange As Classe1

  For i = 1 To 2
    Set MaClass = New Classe1
    MaColl.Add MaClass
  Next i

  Set Echange = MaColl(1)
  Set MaColl(2) = Echange   '--> CA COINCE ICI !
  Set MaColl = MaColl(1)
End Sub

Merci


Avatar
michdenis
| Si je modifie une propriété de MaClass, et que je
| parcours MaColl, tous les éléments ont leur propriété
| modifiée (en fait c'est un abus de langage, car il n'y a
| qu'un seul objet dans MaColl !)

**** Le code que tu as présenté, créait 2 instances distinctes
du même objet que représente ta "classe1" que tu mettais
dans une collection.

Qu'est-ce qu'une classe objet ? c'est l'ensemble des propriétés,
méthodes et événements(le cas échéant) que l'on attribue à
l'objet lui-même en définissant chaque caractéristiques par
du code qui est enchâssé dans le même module. Ce module est
appelé "Module de Classe dudit objet". En conséquence, chaque
instance de la classe objet crée un objet ayant chacun les mêmes
propriétés, méthodes et événements. Leur encodage est le même,
il se comporte tous de la même manière. Une variable définit dans
le haut du module de classe avec l'appellation Public n'est pas une
variable mais une "propriété" de la classe. Une procédure dans un
module de classe s'appelle "Méthode" de la classe. Il faut faire une
nette distinction entre la classe objet (objet lui-même) et ce que
cette objet représente : Exemple avec un objet bien connu :

Set Rg = Range("A1") ou Set Rg1 = Range("A2")
La classe objet "Range" a les mêmes propriétés, méthodes dans
chacun des cas. Ce n'est pas la classe objet qui change mais
la plage de cellules qui est pointée.

Au niveau de ton code, au lieu d'utiliser une collection, tu aurais
pu employer un tableau (array)

'-----------------------------------------
Sub test()
Dim MaClass(1 To 2) As Classe1
Dim Arr As Variant, A As Integer

Arr = Array("Objet1", "Objet2")

For Each elt In Arr
A = A + 1
Set MaClass(A) = New Classe1
Next
Set MaClass(1) = MaClass(2)

End Sub
'-----------------------------------------

| Je voulais écrire Set MaColl(2)=MaColl(1).
| Ce qui coince aussi de toute manière.

**** Dans le code précédent (tableau) je peux faire ce que
tu désires. Cependant, ce que tu ne sembles pas réaliser
c'est dans ton code utilisant une collection, chaque élément
de la collection fait partie d'une "Méga" variable "MaColl"
et tu voudrais modifier ses membres (items) par une façon
de faire (méthode) qui n'est pas définie par sa classe objet
(collection). Pour respecter cet objet, tu n'as pas d'autres
alternatives d'utiliser les méthodes "Remove" ou "add".
C'est ce à quoi tu t'aies astreint lorsque tu as choisi d'utiliser
une variable objet "Collection". Il faut respecter les règles du jeu.
;-)
Avatar
Iznogood1
Merci Michel pour ces éclaircissements.




michdenis a pensé très fort :
Si je modifie une propriété de MaClass, et que je
parcours MaColl, tous les éléments ont leur propriété
modifiée (en fait c'est un abus de langage, car il n'y a
qu'un seul objet dans MaColl !)



**** Le code que tu as présenté, créait 2 instances distinctes
du même objet que représente ta "classe1" que tu mettais
dans une collection.

Qu'est-ce qu'une classe objet ? c'est l'ensemble des propriétés,
méthodes et événements(le cas échéant) que l'on attribue à
l'objet lui-même en définissant chaque caractéristiques par
du code qui est enchâssé dans le même module. Ce module est
appelé "Module de Classe dudit objet". En conséquence, chaque
instance de la classe objet crée un objet ayant chacun les mêmes
propriétés, méthodes et événements. Leur encodage est le même,
il se comporte tous de la même manière. Une variable définit dans
le haut du module de classe avec l'appellation Public n'est pas une
variable mais une "propriété" de la classe. Une procédure dans un
module de classe s'appelle "Méthode" de la classe. Il faut faire une
nette distinction entre la classe objet (objet lui-même) et ce que
cette objet représente : Exemple avec un objet bien connu :

Set Rg = Range("A1") ou Set Rg1 = Range("A2")
La classe objet "Range" a les mêmes propriétés, méthodes dans
chacun des cas. Ce n'est pas la classe objet qui change mais
la plage de cellules qui est pointée.

Au niveau de ton code, au lieu d'utiliser une collection, tu aurais
pu employer un tableau (array)

'-----------------------------------------
Sub test()
Dim MaClass(1 To 2) As Classe1
Dim Arr As Variant, A As Integer

Arr = Array("Objet1", "Objet2")

For Each elt In Arr
A = A + 1
Set MaClass(A) = New Classe1
Next
Set MaClass(1) = MaClass(2)

End Sub
'-----------------------------------------

Je voulais écrire Set MaColl(2)=MaColl(1).
Ce qui coince aussi de toute manière.



**** Dans le code précédent (tableau) je peux faire ce que
tu désires. Cependant, ce que tu ne sembles pas réaliser
c'est dans ton code utilisant une collection, chaque élément
de la collection fait partie d'une "Méga" variable "MaColl"
et tu voudrais modifier ses membres (items) par une façon
de faire (méthode) qui n'est pas définie par sa classe objet
(collection). Pour respecter cet objet, tu n'as pas d'autres
alternatives d'utiliser les méthodes "Remove" ou "add".
C'est ce à quoi tu t'aies astreint lorsque tu as choisi d'utiliser
une variable objet "Collection". Il faut respecter les règles du jeu.
;-)