Parcourir une plage de cellules de manière aléatoire

Résolu
Utilisateur anonyme -  
Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'ai un petit problème en VBA que je n'arrive pas a solutionner.
Problème
J'ai une plage de cellules allants de A1 à A10.
Pour chaque cellule je voudrai écrire sur sa voisine de droite (plage de cellules allants de B1 à B10) l'ordre dans lequel mon programme à parcouru la plage de cellule.

Or je ne sais trop comment faire. Je sais qu'il y a la fonction Random qui existe mais c'est tout.
Idée 1
Initialiser une liste {1,2,3,4,5,6,7,8,9,10}

Mélanger cette liste

Parcourir cette liste dans l'ordre
Questions
1) Comment parcourir une plage de cellules aléatoirement ?

2) Comment mélanger une liste ?

===============

Je débute en VBA, pourriez-vous m'aider s'il vous plait ?

Merci beaucoup

2 réponses

  1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785
     
    Bonjour,

    Exemple :
    Option Explicit
    '
    ' Etablir une référence à Microsoft Scripting Runtime 
    ' (Outils / Références ...)
    '
    
    Sub Test()
    Const adrAléa As String = "B2"    '1° cellule recevant les N° aléatoires
    Const nbreN° As Integer = 10      'Nombre de N° aléatoires
    Dim dicOrdre As Dictionary        'Ordre aléatoire des N°
      
      Set dicOrdre = New Dictionary
      Call OrdreAléatoire(nbreN°, dicOrdre)
      Feuil1.Range(adrAléa).Resize(dicOrdre.Count, 1) = _
          Application.Transpose(dicOrdre.Keys)
    
    End Sub
    
    Private Sub OrdreAléatoire(Quantité As Integer, dicOrdre As Dictionary)
    ' Renvoi un dictionnaire contenant les numéros de 1 à Quantité
    ' dans un ordre aléatoire
    '
    Dim ctr As Integer
    Dim aléa As Integer
    
    Randomize
    dicOrdre.RemoveAll
    For ctr = 1 To Quantité
      aléa = Int(Rnd * Quantité) + 1
      If Not dicOrdre.Exists(aléa) Then
        'si le numèro n'as pas déja été tiré, l'ajouter
        dicOrdre.Add aléa, ctr - 1
      Else
        'sinon réitérer le tirage
        ctr = ctr - 1
      End If
    Next
    
    End Sub


    0
  2. Utilisateur anonyme
     
    Salut à toi,

    j'ai trouvé ce code qui m'a grandement aidé.

    Le voici :



    derlig = Range("A" & Rows.Count).End(xlUp).Row
    ReDim tabl(1 To derlig, 1 To 2)

    For i = 1 To derlig
    tabl(i, 1) = i
    Next

    Range("B1:B" & derlig).Value = tabl
    nb = UBound(tabl) + 1

    For i = 1 To nb \ 2
    ou = Int(((nb - i) * Rnd)) + 1
    temp = tabl(ou, 1)
    tabl(ou, 1) = tabl(nb - i, 1)
    tabl(nb - i, 1) = temp
    Next

    Range("B1:B" & derlig).Value = tabl

    0
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 785
       
      Si c'est terminé, passe le post en résolu
      0