Code VBA

MANTALO

XLDnaute Junior
Bonjour, est-il possible de me montrer la forme de code VBA qui permuterait 15 nombres en défilement en ligne 5?
merci
J'ai cherché sur le Forum mais je n'ai pas trouvé exactement ma recherche, notamment au niveau de la vitesse de défilement(optimisation).
 

Pièces jointes

  • Classeur1.xlsx
    9.5 KB · Affichages: 44
  • Classeur1.xlsx
    9.5 KB · Affichages: 54
  • Classeur1.xlsx
    9.5 KB · Affichages: 53

job75

XLDnaute Barbatruc
Re : Code VBA

Bonsoir MANTALO,

Voyez le fichier joint et les macros des 2 boutons :

Code:
Sub Lancer()
Dim t#
Do
  With [F5:T6] 'à adapter
    .Rows(2) = "=RAND()"
    .Rows(2) = .Rows(2).Value
    .Sort .Rows(2), Orientation:=xlLeftToRight 'tri
  End With
  t = Timer + 0.5 'temporisation 0.5 seconde
  While Timer < t: DoEvents: Wend
Loop
End Sub

Sub Arrêter()
End
End Sub
A+
 

Pièces jointes

  • Permutations(1).xlsm
    21.1 KB · Affichages: 47

MANTALO

XLDnaute Junior
Re : Code VBA

Merci Job75

2 NB: Ce code est-il optimisé pour un défilement maximum (j'ai testé avec timer+0)
Est-on sûr que 2 permutations identiques ne surviennent pas (déjà qu'il y en a un certain nombre ou un nombre certain...)

merci et bon Noël
 

job75

XLDnaute Barbatruc
Re : Code VBA

Re,

1) Avec une temporisation nulle il faut mettre un DoEvents en dehors de la boucle While si l'on veut pouvoir arrêter la macro par le bouton.

2) Bien que très grand le nombre de permutations est limité, donc tôt ou tard on retrouvera des permutations déjà tirées.

A priori il faudra attendre très longtemps...

A+
 

job75

XLDnaute Barbatruc
Re : Code VBA

Bonjour MANTALO, le forum,

Une solution avec des tableaux VBA et la macro de tri Quick sort :

Code:
Sub Lancer()
Dim a(1 To 15), b(1 To 15), i As Byte, n&
Randomize
'---initialisation---
For i = 1 To 15
  b(i) = i
Next
RAZ
'---tirages---
Do
  For i = 1 To 15
    a(i) = Rnd
  Next
  tri a, b, 1, 15
  [F5:T5] = b
  [F10:T10].Offset(n) = b 'facultatif
  If n = Rows.Count - 9 Then Exit Sub
  n = n + 1
  DoEvents
Loop
End Sub

Sub Arrêter()
End
End Sub

Sub RAZ()
Range("F10:T" & Rows.Count).ClearContents
End Sub

Sub tri(a, b, gauc, droi)        ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      temp = b(g): b(g) = b(d): b(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, b, g, droi)
If gauc < d Then Call tri(a, b, gauc, d)
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Permutations(2).xlsm
    23.1 KB · Affichages: 36

MANTALO

XLDnaute Junior
Re : Code VBA

Merci Job75, je pense à une incompréhension tardive ou matinale, ton code est expert ( merci ), mais avec mon alea() et rang(plage) en formules sur 2 lignes de mon tableau, je vais 10 fois plus vite que Quick sort (qui en plus me liste les permutations en lignes pour rien, puisque je souhaite un défilement en ligne5)

Bonne journée et bon Noël.
 

Modeste geedee

XLDnaute Barbatruc
Re : Code VBA

Bonsour®

lister toutes les permutations ?
factorielle 15, ça risque d'etre trés long (1 307 674 368 000 permutations)

autre proposition :
mantalo.jpg
 

Pièces jointes

  • Mental Haut.xls
    266.5 KB · Affichages: 30

job75

XLDnaute Barbatruc
Re : Code VBA

Re,

Si l'on veut seulement voir passer les trains :

Code:
Sub Lancer()
Do: Calculate: DoEvents: Loop
End Sub
Fonctions ALEA() en ligne 6 et RANG en ligne 5.

Fichier (3).

A+
 

Pièces jointes

  • Permutations(3).xlsm
    20.8 KB · Affichages: 26

job75

XLDnaute Barbatruc
Re : Code VBA

Re, hello Si...

Je pense que MANTALO veut détecter le cas où en ligne 6 la fonction ALEA() donne des doublons.

Donc aussi des doublons en ligne 5.

Alors formule en G2 :

Code:
=SOMMEPROD(1/NB.SI(F5:T5;F5:T5))<15
El la macro :

Code:
Sub Lancer()
Do
  Calculate
  DoEvents
  If [G2] Then MsgBox "Doublons !": End
Loop
End Sub
Fichier (4).

A+
 

Pièces jointes

  • Permutations(4).xlsm
    21.2 KB · Affichages: 23

Modeste geedee

XLDnaute Barbatruc
Re : Code VBA

Bonsour®
pour l'instant tu dresses un constat entre une (ta) proposition par formule et diverses propositions VBA (dont la mienne(*) qui mixe les deux méthodes),
cela ne peut etre comparable pusique tu n'historises pas les diverses permutations...
- le méthode dictionary est une méthode VBA qui pourra éventuellement etre comparée à la méthode de JOB75.
- quant à la méthode formule ALEA(), RANG() il ne peut y avoir doublons en ligne 5 ("By design" la fonction ALEA() génére plusieurs millions de nombres différents avant de cycler)

(*) il n'y a aucun doublon sur plus de 65535 tirages (5.011e-8)
 

Discussions similaires