• Initiateur de la discussion Initiateur de la discussion MANTALO
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

M

MANTALO

Guest
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

Re : Code VBA

Re,

La probabilité d'avoir des doublons avec ALEA() en ligne 6 est de 14*10^-15.

Chez moi sur Excel 2010 chaque boucle du fichier (4) s'effectue en 3,67 millisecondes.

En moyenne il faudra donc 3,67*10^-3/(14*10^-15)/86400/365,25 = 8307 ans pour avoir un doublon...

A+
 
Re : Code VBA

Re MANTALO,

Pour vous convaincre que les tableaux et Quick sort sont plus rapides que la méthode Calculate, voyez ces 2 fichiers.

Il y a une durée incompressible c'est celle de la mise à jour de l'écran à chaque tirage.

Si dans le 2ème fichier vous neutralisez la ligne :

Code:
[F5:T5] = b 'restitution facultative
la durée d'exécution de 10000 boucles passe à 0,34 seconde chez moi...

A+
 

Pièces jointes

Re : Code VBA

Re,

En restituant dans la barre d'état - StatusBar - au lieu de la feuille, l'exécution est 2 fois plus rapide :

Code:
Sub Lancer()
Dim t, a(1 To 15), b(1 To 15), i, j
Randomize
t = Timer
'---initialisation---
For i = 1 To 15
  b(i) = i
Next
'---tirages---
For i = 1 To 10000
  For j = 1 To 15
    a(j) = Rnd
  Next
  tri a, b, 1, 15
  Application.StatusBar = Join(b, "-") 'restitution facultative
Next
MsgBox "10000 boucles en " & Format(Timer - t, "0.00 \s")
End Sub
Fichier (2).

A+
 

Pièces jointes

Re : Code VBA

Bonsoir

Merci pour ce travail.

Je m'aperçois en effet que la restitution en status bar est plus rapide. Il me faudrait convertir mes 2 formules de mon tableau en code et restituer la valeur du status bar quand un seuil serait atteint.

Je vais tenter de coder mes 2 formules........(?)

bonne soirée
 
Re : Code VBA

Bonsoir MANTALO, le forum,

J'espère que vous avez passé un joyeux Noël.

Nous en somme au 21ème post et l'on ne sait toujours pas ce que vous faites avec vos permutations...

La restitution dans un Label d'UserForm est encore 2 fois plus rapide que dans la barre d'état :

Code:
Sub USF()
UserForm1.Show 0 'non modal
Dim t, a(1 To 15), b(1 To 15), i, j
Randomize
t = Timer
'---initialisation---
For i = 1 To 15
  b(i) = i
Next
'---tirages---
With UserForm1
  For i = 1 To 10000
    For j = 1 To 15
      a(j) = Rnd
    Next
    tri a, b, 1, 15
    .Label1 = Join(b, "-") 'restitution
    DoEvents '.Repaint
  Next
End With
MsgBox "10000 boucles en " & Format(Timer - t, "0.00 \s")
End Sub
Chez moi sur Win 7 - Excel 2010 les 10000 boucles s'exécutent en 2,35 secondes.

Fichier (3).

Bonne nuit.
 

Pièces jointes

Re : Code VBA

Bonjour MANTALO, le forum,

Vous m'avez fait parvenir votre fichier par MP.

Comme il y a des formules (avec SOMMEPROD) il faut restituer dans la feuille.

Mais pas du tout besoin de faire défiler chaque résultat comme vous disiez.

Donc utilisez Application.ScreenUpdating = False pour accélérer.

On attend ici votre fichier avec des explications claires sur ce que vous voulez.

A+
 
Re : Code VBA

Bonsoir,

j'utilise déjà Application.ScreenUpdating = False et désactivation du calcul auto.

Comme je vous l'écrivais, vos fichiers m'ont donné une idée: status bar et userform sont du texte et donc mes formules sommeprod ne peuvent y faire référence.

Par contre, si mes calculs se font "en mémoire" à l'intérieur du code VBA, il n'y a plus besoin d'affichage des permutations du tout !

(hormis la restitution de la permutation retenue pour une valeur d'une cellule testée)


Bonne soirée et bonnes fêtes à tous.
 
Re : Code VBA

Re,

Bon voici le fichier, j'ai un peu modifié les formules.

La macro :

Code:
Sub Lancer()
Dim a(1 To 49), b(1 To 49), i
For i = 1 To 49
  b(i) = i
Next
[F5:AK5] = b
Application.ScreenUpdating = False
Randomize
While Not [C4]
  For i = 1 To 49
    a(i) = Rnd
  Next
  tri a, b, 1, 49
  [F5:AK5] = b
Wend
End Sub
A+
 

Pièces jointes

Dernière édition:
Re : Code VBA

Re,

Il vaut mieux initialiser b de manière aléatoire, on ne sait jamais :

Code:
Sub Lancer()
Dim a(1 To 49), b(1 To 49), i As Byte
Randomize
For i = 1 To 49
  a(i) = Rnd
  b(i) = i
Next
tri a, b, 1, 49
[F5:AK5] = b
Application.ScreenUpdating = False
While Not [C4]
  For i = 1 To 49
    a(i) = Rnd
  Next
  tri a, b, 1, 49
  [F5:AK5] = b
Wend
End Sub
Fichier (2).

Nota : pour répondre à vos interrogations, du fait qu'il y a des NB.SI il faut restituer dans la feuille.

Travailler sur des tableaux VBA pour éviter les formules ne ferait pas gagner de temps puisque l'écran est figé.

A+
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

D
  • Question Question
Réponses
5
Affichages
217
Didierpasdoué
D
Réponses
8
Affichages
357
Réponses
3
Affichages
410
Retour