Parcourir une plage de cellules de manière aléatoire [Résolu/Fermé]

Signaler
Messages postés
49
Date d'inscription
mercredi 20 novembre 2013
Statut
Membre
Dernière intervention
23 avril 2016
-
Messages postés
8170
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
13 août 2020
-
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

Messages postés
8170
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
13 août 2020
1 447
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


Messages postés
49
Date d'inscription
mercredi 20 novembre 2013
Statut
Membre
Dernière intervention
23 avril 2016
4
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

Messages postés
8170
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
13 août 2020
1 447
Si c'est terminé, passe le post en résolu