Mélanger un tableau VBA

Fermé
jeandefait Messages postés 20 Date d'inscription vendredi 23 octobre 2009 Statut Membre Dernière intervention 20 février 2010 - 25 nov. 2009 à 04:16
 stephantasy - 14 sept. 2012 à 21:09
Bonjour,

Je dois trouver un moyen de mélanger les nombres de 1 à 50 et de les insérer dans un tableau par la suite. J'ai donc pensé à mettre mes 50 nombres dans un tableau et de mélanger aléatoirement ce tableau, seulement je n'ai aucune idée comment... j'ai trouvé cet algorithme sur internet mais je ne comprend pas la ligne: "Cells(Cell.Row + i - 1, Cell.Column) = Tableau(TabNumLignes(k))". Si quelqu'un pouvait m'éclairer, ou encore trouver une meilleure solution ce serait vraiment apprécié :) Merci!

Sub Test()
GenereSerieAleatoireSansDoublons 25, Range("B1")
End Sub


Sub GenereSerieAleatoireSansDoublons(NbValeurs As Integer, Cell As Range)
Dim Tableau() As Integer, TabNumLignes() As Integer
Dim i As Integer, k As Integer

ReDim Tableau(NbValeurs)
ReDim TabNumLignes(NbValeurs)

For i = 1 To NbValeurs
TabNumLignes(i) = i
Tableau(i) = i
Next

'Initialise le générateur de nombres aléatoires
Randomize

For i = NbValeurs To 1 Step -1
k = Int((i * Rnd) + 1)
Cells(Cell.Row + i - 1, Cell.Column) = Tableau(TabNumLignes(k))
TabNumLignes(k) = TabNumLignes(i)
Next

End Sub

8 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 302
25 nov. 2009 à 09:31
Bonjour,

Le tirage se fait il avec ou sans remise ? (cad sans remise: le nombre n'apparait qu'une fois)
0
jeandefait Messages postés 20 Date d'inscription vendredi 23 octobre 2009 Statut Membre Dernière intervention 20 février 2010 1
25 nov. 2009 à 15:48
Sans remise, disons que j'ai un tableau de 5 chiffres : [1 2 3 4 5] je veux qu'il les mélange au hasard pour qu'il y ait toujours des ordres différents mais toujours les 5 mêmes chiffres.
Ex: [1 2 4 3 5]
Ex:[5 4 2 1 3]
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 302
25 nov. 2009 à 16:55
re,

essaies ceci

Sub ecrire_serie_aléatoire(nbre As Byte, adres_dep As String)
Dim col As Byte, lig As Byte
Dim coll As Collection, cptr As Byte
'-------initialisations
'   mémorise la ligne et la colonne de départ de la série
    lig = Range(adres_dep).Row
    col = Range(adres_dep).Column
    'fige le défilement de l'écran & nettoie la zone de restitution
    Application.ScreenUpdating = False
    Range(Cells(lig, col), Cells(65536, col)).Clear
    'instantie l'objet collection
    Set coll = New Collection
    'initialise la fonction aléatoire
    Randomize
    
'-------affecte une serie sans doublon
For cptr = 1 To nbre
    tirage = Int(Rnd * nbre) + 1
    On Error Resume Next
        coll.Add tirage, CStr(tirage)
        'si doublon
        If Err.Number > 0 Then
            'annulation du pas
            cptr = cptr - 1
        Else
            'inscrit le tirage da
            Cells(cptr - 1 + lig, col) = tirage
        End If
     On Error GoTo 0
Next

Set coll = Nothing
End Sub

Sub generer_serie()
ecrire_serie_aléatoire 5, "A1"
End Sub
0
jeandefait Messages postés 20 Date d'inscription vendredi 23 octobre 2009 Statut Membre Dernière intervention 20 février 2010 1
25 nov. 2009 à 19:11
Ça fonctionne mais n'y a t-il pas une façon plus simple?
Je vais toujours avoir un tableau de 1 à 50... donc [1 2 3 4 5 ... 48 49 50] et je veux que VBA mêle tout ça, qu'il mette mes nombres dans n'importe quel ordre, de façon aléatoire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jeandefait Messages postés 20 Date d'inscription vendredi 23 octobre 2009 Statut Membre Dernière intervention 20 février 2010 1
25 nov. 2009 à 22:09
J'ai lu dans un autre forum l'astuce suivante dans le cas où on voudrait mélanger les lettres d'un mot,
on choisi une lettre à laide de rnd
on l'ajoute à notre chaîne de caractère qui est vide au début
et on supprime cette lettre de notre mot initial comme ça, aucune chance de la répéter.

Si on tente de faire de même avec des chiffres, mon problème est évidemment si j'ai des nombres plus grand que 10:

Ex: 123456789101112... moi je veux mélanger ces 12 nombres mais si j'utilise la fonction MID, c'est rendu compliqué pour les nombres 10 11 12...

Donc utiliser un tableau pourrait être intéressant non?
Par exemple position 0=1, position 1 =2 et ainsi de suite... mais comment supprimer une position dans mon tableau?
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 302
26 nov. 2009 à 09:04
Excuses moi d'avoir essayé de t'aider. rassures toi je ne recommencerai plus

au fait, connais tu le mot MERCI ? voir charte du forum
0
jeandefait Messages postés 20 Date d'inscription vendredi 23 octobre 2009 Statut Membre Dernière intervention 20 février 2010 1
26 nov. 2009 à 15:01
Sans rancune, c'est beau, excuses acceptée, je te pardonne
0
Bonjour,

Eh bien moi je te remercie grandement michel_m, ton algorithme fonctionne à merveille et m'a bien servi !

Merci !
0