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

Doublons (encore) et New Collection

23 réponses
Avatar
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

10 réponses

1 2 3
Avatar
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" a écrit dans le message de groupe de discussion :
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
Avatar
garnote
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" a écrit dans le message de news:
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" a écrit dans le message de groupe de discussion :
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



Avatar
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
Avatar
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...
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 !
-)
Avatar
Mgr T. Banni
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" a écrit dans le message de news:


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


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

;-))
Avatar
Modeste
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
Avatar
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
'----------------------------------------------
Avatar
michdenis
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" a écrit dans le message de groupe de discussion :

| 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
'----------------------------------------------
Avatar
garnote
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" a écrit dans le message de news:
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
1 2 3