Bonjour le forum
Sur un fil précédent, dans un test d'optimisation, MyDearFriend a démontré brillamment que le temps d'exécution entre deux macros en boucle de nature différente peut varier de 1 à 15 fois environ.
@+Thierry donne dans ce fil un modèle de configuration de macro utilisant la boucle For Next avec affichage en fin de calcul de tableau.
Avec tout cela, j'ai testé le temps d'exécution de deux macros de natures de boucle différentes mais qui affichent à chaque récurrence le résultat dans le tableau.
Essai 1 avec For Each Next :
Sub ForeachTableau()
Dim A As Long
T = Timer
A = 1
For Each C In Sheets("Feuil1").Range("A1:J50000")
C.Value = A
A = A + 1
Next
MsgBox " cellules renseignées en " & CStr(Timer - T) & " secondes"
End Sub
Essai 2 avec For Next en double boucle :
Sub ForTableauBis()
Dim MyArray As Variant
Dim i As Long
Dim j As Long
Dim A As Long
A = 1
T = Timer
MyArray = Sheets("Feuil1").Range("A1:J50000")
For i = 1 To UBound(MyArray, 1)
For j = 1 To UBound(MyArray, 2)
Cells(i, j) = A
A = A + 1
Next j
Next i
MsgBox " cellules renseignées en " & CStr(Timer - T) & " secondes"
End Sub
Les temps d’exécution sont à peu de chose près équivalents : 54s sur ma bécane.
Puis j’ai repris l’essai deux. J’ai modifié la macro comme le suggère opportunément @+Thierry, de façon que l’affichage ne soit effectué qu’en fin de procédure:
Essai 3 :
Sub ForTableau()
Dim MyArray As Variant
Dim i As Long
Dim j As Long
Dim A As Long
A = 1
T = Timer
MyArray = Sheets("Feuil1").Range("A1:J50000")
For i = 1 To UBound(MyArray, 1)
For j = 1 To UBound(MyArray, 2)
MyArray(i, j) = A
A = A + 1
Next j
Next i
Sheets("Feuil1").Range("A1:J50000") = MyArray
MsgBox " cellules renseignées en " & CStr(Timer - T) & " secondes"
End Sub
Temps d’exécution : 0,6s !
Y’a pas photo, 100 fois plus vite !
Cette configuration fait toute la différence, je roule désormais en Ferrari, Lol
Merci Père Noël @+Thierry
Cordialement
Bernard