Doublons (encore) et New Collection

Le
garnote
Bonjour,

Peut-on transférer le tableau t dans SD
en éliminant les doublons, les triplons ;-)

Sub Way()

Dim SD As New Collection
Dim t(1 To 10)
For i = 1 To 10
t(i) = Int(5 * Rnd())
Next i
'

End Sub


Serge
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
michdenis
Le #18700261
Un petit tour dans l'aide d'excel,
pour faire ce que tu veux, c'est de renseigner la "Key"
de la cellule qui elle doit obligatoirement unique

Tu peux passer directement par la collection sans tableau

Sub Way()
Dim SD As New Collection
On Error Resume Next
For i = 1 To 10
SD.Add Int(5 * Rnd()), CStr(Int(5 * Rnd()))
Next i
Err.Clear
Msgbox "Nombre d'élément dans la collection: " & SD.Count
'Et pour retrouver un élément d'une collection
Msgbox sd(2)
End Sub



"garnote" Oum#
Bonjour,

Peut-on transférer le tableau t dans SD
en éliminant les doublons, les triplons ... ;-)

Sub Way()

Dim SD As New Collection
Dim t(1 To 10)
For i = 1 To 10
t(i) = Int(5 * Rnd())
Next i
' ...

End Sub


Serge
garnote
Le #18700541
Très pratique cette affaire-là.
Merci

Sub Way()
Dim SD As New Collection
On Error Resume Next
For I = 1 To 1000
n = Int(10 * Rnd())
SD.Add n, CStr(n)
Next I
Err.Clear
For j = 1 To SD.Count
Debug.Print SD(j)
Next j
End Sub




"michdenis"
Un petit tour dans l'aide d'excel,
pour faire ce que tu veux, c'est de renseigner la "Key"
de la cellule qui elle doit obligatoirement unique

Tu peux passer directement par la collection sans tableau

Sub Way()
Dim SD As New Collection
On Error Resume Next
For i = 1 To 10
SD.Add Int(5 * Rnd()), CStr(Int(5 * Rnd()))
Next i
Err.Clear
Msgbox "Nombre d'élément dans la collection: " & SD.Count
'Et pour retrouver un élément d'une collection
Msgbox sd(2)
End Sub



"garnote" Oum#
Bonjour,

Peut-on transférer le tableau t dans SD
en éliminant les doublons, les triplons ... ;-)

Sub Way()

Dim SD As New Collection
Dim t(1 To 10)
For i = 1 To 10
t(i) = Int(5 * Rnd())
Next i
' ...

End Sub


Serge



Modeste
Le #18701071
Bonsour® garnote

Très pratique cette affaire-là.
Sub Way()
Dim SD As New Collection
On Error Resume Next
For I = 1 To 1000
n = Int(10 * Rnd())
SD.Add n, CStr(n)
Next I
Err.Clear
For j = 1 To SD.Count
Debug.Print SD(j)
Next j
End Sub



Heu ????
j'ai peur de ne pas bien saisir la boucle 1 to 1000 ;o))))
Concretement SD contiendra au maximum 10 valeurs (n=int(10*Rnd())

je pense qu'il faut d'abord dimensionner SD et générer n valeurs differentes

ou bien alors
n  * Rnd()
SD.Add Int(n), CStr(n)
et meme dans ce cas je ne suis pas sur de l'élimination des doublons

moi j'en reste à la fonction RANG qui à fait ses preuves ;o))
a tester sur une feuille vierge

Sub Subway()
Dim lignes As Integer
Dim SD() As Integer
Dim i As Integer
On Error GoTo fin
lignes = CInt(InputBox("saisir un entier (1 à 65635)", "dimension de la table SD", 5))
'---------------------------------------------
ReDim SD(lignes)
Application.ScreenUpdating = False
Range(Cells(1, 1), Cells(lignes, 1)).Name = "Tirage"
Range(Cells(1, 1), Cells(lignes, 1)).FormulaLocal = "=Alea()"
Range(Cells(1, 2), Cells(lignes, 2)).FormulaR1C1 = "=RANK(RC[-1],Tirage)"
For i = 1 To lignes
SD(i) = Cells(i, 2).Value
Next
Range(Cells(1, 1), Cells(lignes, 2)).Clear
Application.ScreenUpdating = True
'----controle d'execution informatif
i = Int(1 + Rnd() * lignes)
MsgBox SD(i), vbInformation, "Valeur de SD(" & i & ")"
Exit Sub

fin:
MsgBox "Abandon ou saisie incorrecte !", vbExclamation

End Sub
michdenis
Le #18701821
| j'ai peur de ne pas bien saisir la boucle 1 to 1000 ;o))))
***ça c'est une chose.. ;-)

| je pense qu'il faut d'abord dimensionner SD et
| générer n valeurs differentes
***ça je ne crois pas... l'ajout d'une donnée se fait seulement
si le paramètre "Key" de la collection est unique. Encore
faut-il faire un bon choix sur la valeur de cette key...
Si cela est respecté, la probabilité d'avoir un doublon est bien mince...!!!
C'est aussi cette même Key qui nous permet de retrouver la valeur
de l'élément ajouté le cas échéant.

Ceci étant, il n'y a rarement pas une seule façon de faire dans excel
chacun a droit à ses préférencess !
-)
Mgr T. Banni
Le #18702161
heu...il n'y en a donc qu'une :-)
ça me fait vraiment penser au célèbre :
plus tu pédales moins lentement, moins tu avances plus rapidement
sans rancune aucune, michel!!!!
jps

"michdenis"

Ceci étant, il n'y a rarement pas une seule façon de faire dans excel


michdenis
Le #18702341
Si tu le dis, je ne vais pas m'obstiner la dessus.

;-))
Modeste
Le #18706741
Bonsour® michdenis

j'ai peur de ne pas bien saisir la boucle 1 to 1000 ;o))))


***ça c'est une chose.. ;-)

je pense qu'il faut d'abord dimensionner SD et
générer n valeurs differentes


***ça je ne crois pas... l'ajout d'une donnée se fait seulement
si le paramètre "Key" de la collection est unique. Encore
faut-il faire un bon choix sur la valeur de cette key...



;o)))
l'instruction n=Int(10*Rnd())
ne peut générer que au maximum 10 valeurs distinctes,
donc 10 "Keys" distinctes que tu fasses 20 ou 100000 fois la boucle ...

Si cela est respecté, la probabilité d'avoir un doublon est bien
mince...!!! C'est aussi cette même Key qui nous permet de
retrouver la valeur de l'élément ajouté le cas échéant.



que ensuite à chacune de ces 10 "keys" on fasse correspondre le Cstr(n)
il est non moins evident que "key"= contenu
et que "key" differente <=> contenu different
alors précisément on ne parle plus de probabilité, mais de certitude !!!!

For I = 1 To 1000
n = 10 * Rnd()
SD.Add I, CStr(n) '----- I est la "key"
Next I


Non ??? ou alors j'ai rien compris ...
;o)))
mais rien ne garantit contre la présence de doublons
michdenis
Le #18707061
| alors précisément on ne parle plus de probabilité, mais de certitude !!!!

| For I = 1 To 1000
| n = 10 * Rnd()
| SD.Add I, CStr(n) '----- I est la "key"
| Next I

Et ben là, je ne comprends pas ton raisonnement :
D'abord, quel est le but de la collection de ton exemple ?
1-) si c'est de contenir les chiffres de 1 à 1000 , il n'y a pas
grand chance qu'il y ait un doublon dans la collection
qu'il y ait une Key ou non.
Selon l'aide d'excel :
'------------------------------
key Facultatif. Expression de chaîne unique indiquant une chaîne de clé susceptible d'être
utilisée à la place de l'index de position pour accéder à un membre de la collection.
'------------------------------
Un peu plus bas, il est écrit une remarque :
'------------------------------
Une erreur se produit également si un argument key duplique l'argument key d'un membre
existant de la collection
'------------------------------
Et on aurait dû ajouter, lorsqu'il y a erreur, le membre que l'on tente d'ajouter à la
collection n'est pas accepté.
2 -) Je n'ai jamais dit que l'on pouvait choisir n'importe quoi
comme key pour garantir l'unicité du membre de la collection
3-) Si on se fie à la définitiion de Key donnée par Excel, encore faut-il trouver
une key que l'on pourra utiliser pour retrouver la valeur du membre de la collection
4-) On peut créer une collection de n'importe quoi... mais est-ce toujours le
meilleur instrument pour arriver à ses fins...il me semble que quelqu'un sur
ce forum invoquait le fait que lorsque l'on a seulement un marteau tous
les problèmes ressemblent à un clou !!!

5 -) je me suis "forcé" de reprendre ton exemple dans cet environnement :
http://cjoint.com/?cvc127bnhq
Et je ne vois pas où est ton problème !
'----------------------------------------------
Sub test()
Dim N As Double
Dim i As Integer, b As Integer
Dim SD As New Collection

Application.ScreenUpdating = False
On Error Resume Next
'Composition de la collection
For i = 1 To 1000
N = 10 * Rnd()
Range("a" & i).Value = N
SD.Add Range("a" & i).Value, Range("a" & i).Address
Next

'Pour restituer la valeur de chaque membre de la collection
'à partir de la key
For b = 1 To 1000
Range("B" & b).Value = SD(Range("A" & b).Address)
Next
'Vérification si doublons
Range("C1:C100").Formula = "=Countif(" & Range("A1").Address(0, 0) _
& "," & Range("A1:A100").Address & ")"
End Sub
'----------------------------------------------
michdenis
Le #18707201
Et ben là, je ne comprends pas ton raisonnement :
D'abord, quel est le but de la collection de ton exemple ?
1-) si c'est de contenir les chiffres de 1 à 1000 , il n'y a pas
grand chance qu'il y ait un doublon dans la collection
qu'il y ait une Key ou non.
Selon l'aide d'excel :
'------------------------------
key Facultatif. Expression de chaîne unique indiquant une chaîne de clé susceptible d'être
utilisée à la place de l'index de position pour accéder à un membre de la collection.
'------------------------------
Un peu plus bas, il est écrit une remarque :
'------------------------------
Une erreur se produit également si un argument key duplique l'argument key d'un membre
existant de la collection
'------------------------------
Et on aurait dû ajouter, lorsqu'il y a erreur, le membre que l'on tente d'ajouter à la
collection n'est pas accepté.
2 -) Je n'ai jamais dit que l'on pouvait choisir n'importe quoi
comme key pour garantir l'unicité du membre de la collection
3-) Si on se fie à la définitiion de Key donnée par Excel, encore faut-il trouver
une key que l'on pourra utiliser "facilement" pour retrouver la valeur du
membre de la collection.
4-) On peut créer une collection de n'importe quoi... mais est-ce toujours le
meilleur instrument pour arriver à ses fins...il me semble que quelqu'un sur
ce forum invoquait le fait que lorsque l'on a seulement un marteau tous
les problèmes ressemblent à un clou !!!

Essaie ceci : tu crois que tu peux réussir à générer des collections
avec des doublons ?
'------------------------------
Sub test()
Dim N As Double
Dim i As Integer, b As Integer
Dim SD As New Collection

Application.ScreenUpdating = False
On Error Resume Next
'Composition de la collection
For i = 1 To 1000
N = 10 * Rnd()
Range("a" & i).Value = N
SD.Add N, Str(N)
Next

'Pour restituer la valeur de chaque membre de la collection
'à partir de la key
For b = 1 To 1000
Range("B" & b).Value = SD(Str(Range("A" & b).Value))
Next
'Vérification si doublons
Range("C1:C1000").Formula = "=Countif(" & Range("A1").Address(0, 0) _
& "," & Range("A1:A1000").Address & ")"
End Sub
'------------------------------



"michdenis"
| alors précisément on ne parle plus de probabilité, mais de certitude !!!!

| For I = 1 To 1000
| n = 10 * Rnd()
| SD.Add I, CStr(n) '----- I est la "key"
| Next I

Et ben là, je ne comprends pas ton raisonnement :
D'abord, quel est le but de la collection de ton exemple ?
1-) si c'est de contenir les chiffres de 1 à 1000 , il n'y a pas
grand chance qu'il y ait un doublon dans la collection
qu'il y ait une Key ou non.
Selon l'aide d'excel :
'------------------------------
key Facultatif. Expression de chaîne unique indiquant une chaîne de clé susceptible d'être
utilisée à la place de l'index de position pour accéder à un membre de la collection.
'------------------------------
Un peu plus bas, il est écrit une remarque :
'------------------------------
Une erreur se produit également si un argument key duplique l'argument key d'un membre
existant de la collection
'------------------------------
Et on aurait dû ajouter, lorsqu'il y a erreur, le membre que l'on tente d'ajouter à la
collection n'est pas accepté.
2 -) Je n'ai jamais dit que l'on pouvait choisir n'importe quoi
comme key pour garantir l'unicité du membre de la collection
3-) Si on se fie à la définitiion de Key donnée par Excel, encore faut-il trouver
une key que l'on pourra utiliser pour retrouver la valeur du membre de la collection
4-) On peut créer une collection de n'importe quoi... mais est-ce toujours le
meilleur instrument pour arriver à ses fins...il me semble que quelqu'un sur
ce forum invoquait le fait que lorsque l'on a seulement un marteau tous
les problèmes ressemblent à un clou !!!

5 -) je me suis "forcé" de reprendre ton exemple dans cet environnement :
http://cjoint.com/?cvc127bnhq
Et je ne vois pas où est ton problème !
'----------------------------------------------
Sub test()
Dim N As Double
Dim i As Integer, b As Integer
Dim SD As New Collection

Application.ScreenUpdating = False
On Error Resume Next
'Composition de la collection
For i = 1 To 1000
N = 10 * Rnd()
Range("a" & i).Value = N
SD.Add Range("a" & i).Value, Range("a" & i).Address
Next

'Pour restituer la valeur de chaque membre de la collection
'à partir de la key
For b = 1 To 1000
Range("B" & b).Value = SD(Range("A" & b).Address)
Next
'Vérification si doublons
Range("C1:C100").Formula = "=Countif(" & Range("A1").Address(0, 0) _
& "," & Range("A1:A100").Address & ")"
End Sub
'----------------------------------------------
garnote
Le #18707241
Ave Modeste,

Je commence à explorer les collections.
Je voulais illustrer le fait qu'on peut obtenir
une liste sans doublons avec cet objet.
Mais effectivement, mon exemple était presque ;-)
vide de sens, car si je choisis au hasard,
à 1000 reprises, un nombre compris entre 0 et 9,
la probabilté de ne pas obtenir 10 nombres
différents est très très très petite !
Un autre exemple :
Je choisis à 100 reprises un nombre entier,
au hasard, entre 0 et 199 et je veux obtenir
tous les nombres dstincts choisis.
En choississant une clé associée au nombre choisi,
il me semble qu'il ne peut pas y avoir de doublons.

Sub Collection_Sans_Doublons()
Dim SD As New Collection
On Error Resume Next
For i = 1 To 100
n = Int(200 * Rnd())
SD.Add n, CStr(n)
Next i
Err.Clear
Debug.Print "Liste des " & SD.Count & " nombres différents choisis au hasard entre 0 et 199." & vbLf
For K = 1 To SD.Count - 1
For J = K + 1 To SD.Count
If SD(K) > SD(J) Then
ch1 = SD(K)
ch2 = SD(J)
SD.Add ch1, before:=J
SD.Add ch2, before:=K
SD.Remove K + 1
SD.Remove J + 1
End If
Next J
Next K
For J = 1 To SD.Count
Debug.Print J & "." & Space(4 - Len(J)) & SD(J)
Next J
End Sub

Serge



"Modeste" Bonsour® garnote

Très pratique cette affaire-là.
Sub Way()
Dim SD As New Collection
On Error Resume Next
For I = 1 To 1000
n = Int(10 * Rnd())
SD.Add n, CStr(n)
Next I
Err.Clear
For j = 1 To SD.Count
Debug.Print SD(j)
Next j
End Sub



Heu ????
j'ai peur de ne pas bien saisir la boucle 1 to 1000 ;o))))
Concretement SD contiendra au maximum 10 valeurs (n=int(10*Rnd())

je pense qu'il faut d'abord dimensionner SD et générer n valeurs differentes

ou bien alors
n  * Rnd()
SD.Add Int(n), CStr(n)
et meme dans ce cas je ne suis pas sur de l'élimination des doublons

moi j'en reste à la fonction RANG qui à fait ses preuves ;o))
a tester sur une feuille vierge

Sub Subway()
Dim lignes As Integer
Dim SD() As Integer
Dim i As Integer
On Error GoTo fin
lignes = CInt(InputBox("saisir un entier (1 à 65635)", "dimension de la table SD", 5))
'---------------------------------------------
ReDim SD(lignes)
Application.ScreenUpdating = False
Range(Cells(1, 1), Cells(lignes, 1)).Name = "Tirage"
Range(Cells(1, 1), Cells(lignes, 1)).FormulaLocal = "=Alea()"
Range(Cells(1, 2), Cells(lignes, 2)).FormulaR1C1 = "=RANK(RC[-1],Tirage)"
For i = 1 To lignes
SD(i) = Cells(i, 2).Value
Next
Range(Cells(1, 1), Cells(lignes, 2)).Clear
Application.ScreenUpdating = True
'----controle d'execution informatif
i = Int(1 + Rnd() * lignes)
MsgBox SD(i), vbInformation, "Valeur de SD(" & i & ")"
Exit Sub

fin:
MsgBox "Abandon ou saisie incorrecte !", vbExclamation

End Sub
Publicité
Poster une réponse
Anonyme