Boucle trop lente

Tcho!

XLDnaute Junior
Bonjour à tous :)
Voila j'aimerais optimiser une requete qui est vraiment trop longue

sub essai()
a=0
b=0
c=0
d=0
e=0
f=0
for i=1 to 65536
Worksheets("Feuil1").Cells(i,1).Formulalocal="=dechex(" & f & ";2)"
Worksheets("Feuil1").Cells(i,2).Formulalocal="=dechex(" & e & ";2)"
Worksheets("Feuil1").Cells(i,3).Formulalocal="=dechex(" & d & ";2)"
Worksheets("Feuil1").Cells(i,4).Formulalocal="=dechex(" & c & ";2)"
Worksheets("Feuil1").Cells(i,5).Formulalocal="=dechex(" & b & ";2)"
Worksheets("Feuil1").Cells(i,6).Formulalocal="=dechex(" & a & ";2)"
a=a+1
if a=255 then b=b+1:a=0
if b=255 then c=c+1:b=0
if c=255 then d=d+1:c=0
if d=255 then e=e+1:d=0
if e=255 then f=f+1:e=0
next i
end sub
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Re : Boucle trop lente

Bonjour tcho, Pascal, le forum

dans ce cas

Application.Screenupdating = False
Application.Calculation = xlManual
au début de ton code

Application.Calculation = xlCalculationAutomatic
à la fin de ton code

devrait accélérer de manière significative.

A+
 

Tcho!

XLDnaute Junior
Re : Boucle trop lente

Bonjour Yeahou
Je viens de tester et de comparer ta manip :)
Sans je mets 17s pour traiter 1024 lignes
Avec je mets 07s pour traiter 1024 lignes
Gain non négligeable mais sur un max de ligne je vais morfler :-(
Y-a-t'il d'autre chose à améliorer ou à rajouter ??
Merci encore
 

JYLL

Nous a quitté
Repose en paix
Re : Boucle trop lente

Bonjour Tcho et tous,

tu dois pouvoir gagner un peu en déclarant tes variables en byte A,B etc car à chaque passage VB les prend en variant puis les passent en byte. Autre source de gain au lieu de mettre dans ta feuille tu déclare un tableau de la taille du nombres de cellules à remplir et tu le remplis, à la fin fin tu sélectionnes range(a1:F65536)=tableau et il se rempli en 1 seule fois.

Bon test

amicalement

Jean-Yves
 

ODVJ

XLDnaute Impliqué
Re : Boucle trop lente

Bonjour à tous,

d'après ton algorithme, tu ne t'intéresses pas aux valeurs FF.
C'est volontaire?

Quand tu dis qu'il te faut 2.000.000 de lignes, c'est une limite que tu t'imposes?
l'ensemble des combinaisons possibles est beaucoup plus important que ça (256^6 soit "environ" 281.474.976.710.656. ça fait quelques carambars!)

souhaites-tu absolument découper tes nombres en 6 morceaux de 2 chiffres héxa?

A+
 

Gorfael

XLDnaute Barbatruc
Re : Boucle trop lente

Salut à toutes et à tous

Yeahou, j'aime bien ton code, que j'utilise, mais en sortie, je mets un Application.ScreenUpDating = TRUE :)

ODVJ, bien vu : je suis passé à coté, la technique me paraissaît classique. Sauf que l'incrementation se fait juste avant le test et donc le 255 est éliminé avant d'être traité.

Tcho! si t'expliquais ce que tu veux faire ?
À vu de nez, tu chrche à écrire les codes hexa sur 64 bits
C'est pas possible :
ça fait 2^64 code
une colonne 2^16 si on code sur 8 colonnes 2^21 par page (oui, j'ai un gain de 25%, parce que tu code sur 6 au lieu de 8)
2^28 par classeur
2^36 classeurs - 25% (2^34) = beaucoup trop de classeurs

Pfff, y en a qui sont pas couchés avant longtemps
(J'avoue que je ne connais pas les limites de nombres de fichiers sur un micro, et ça doit dépendre aussi de l'OS)

Donc, si tu expliques ton but, le forum pourra t'aider à trouver une meilleure solution pour l'atteindre (si c'est faisable).

A+
 
Dernière édition:

JYLL

Nous a quitté
Repose en paix
Re : Boucle trop lente

Re bonjour Gorfael et tous,

suite à mon message précédent, j'ai écrit le programme et sauf erreur de ma part il fontionne correctement. Je te joins le code et je pense que tu vas être surpris par la vitesse.

Sub essai()
Dim a As String, b As String, c As String, e As String, f As String
Dim tableau(1 To 65536, 1 To 6) As String
Dim i As Long

a = 0
b = 0
c = 0
d = 0
e = 0
f = 0
For i = 1 To 65536

tableau(i, 1) = Hex(f)
tableau(i, 2) = Hex(e)
tableau(i, 3) = Hex(d)
tableau(i, 4) = Hex(c)
tableau(i, 5) = Hex(b)
tableau(i, 6) = Hex(a)


a = a + 1
If a = 256 Then b = b + 1: a = 0
If b = 256 Then c = c + 1: b = 0
If c = 256 Then d = d + 1: c = 0
If d = 256 Then e = e + 1: d = 0
If e = 256 Then f = f + 1: e = 0
Next i
Range("a1:f65536") = tableau
End Sub


Bon test.

Amicalement.

Jean-Yves
 

Gorfael

XLDnaute Barbatruc
Re : Boucle trop lente

jmps à dit:
Bonjour à tous,

Oui, je le dis à chaque fois, le but est important pour aiguiller les gens qui répondent à ne pas partir en hors sujet (voire en Zop).

Si ça se trouve la calculette serait suffisante :D.
Re...
Farpetement d'accord avec José
Par contre Zop ?

JYLL : pourquoi déclarer tes variables (a à f) en string ?

A+
 

JYLL

Nous a quitté
Repose en paix
Re : Boucle trop lente

re bonjour à tous,

Effectivement je peux les dimensionner en integer ce qui est mieux et plus rapide. La méthode est assez rapide.

Sub essai()
Dim a As integer, b As integer, c As integer, e As integer, f As integer
Dim tableau(1 To 65536, 1 To 6) As String
Dim i As Long

a = 0
b = 0
c = 0
d = 0
e = 0
f = 0
For i = 1 To 65536

tableau(i, 1) = Hex(f)
tableau(i, 2) = Hex(e)
tableau(i, 3) = Hex(d)
tableau(i, 4) = Hex(c)
tableau(i, 5) = Hex(b)
tableau(i, 6) = Hex(a)


a = a + 1
If a = 256 Then b = b + 1: a = 0
If b = 256 Then c = c + 1: b = 0
If c = 256 Then d = d + 1: c = 0
If d = 256 Then e = e + 1: d = 0
If e = 256 Then f = f + 1: e = 0

Next i
Range("a1:f65536") = tableau
End Sub

Bon test

Amicalement.

Jean-Yves

Ps : Je joins un fichier qui va jusqu'à 2 000 000 en 30s si tu te contentes de coder les nombres sur 3 octets avec un athlon 64 3Ghz et 1 Go de RAM
 

Pièces jointes

  • hexa.zip
    7.8 KB · Affichages: 34
Dernière édition:

Statistiques des forums

Discussions
312 674
Messages
2 090 790
Membres
104 665
dernier inscrit
ronbt