Boucles imbriquées et temps d'exécution

Bonjour à tous,

Le temps d'exécution pour ces boucles imbriquées est de 54 secondes pour 15 000 lignes.

Une idée de code pour améliorer cette vitesse ?

Sub Exemple()

t = Timer

Dim tableau0
Dim tableau1
Dim derniereLigne As Integer
Dim I As Integer

With Sheets("Exercice")

derniereLigne = .Cells(Rows.Count, 1).End(xlUp).Row

tableau0 = .Range("A1:A" & derniereLigne).Value

tableau1 = tableau0

ReDim Preserve tableau1(1 To UBound(tableau0), 1 To 3)

For K = 1 To 200
For L = 1 To 100

For I = 2 To UBound(tableau1)
If tableau1(I - 1, 1) > 7 + K - L And tableau1(I - 1, 3) = 2 Then
tableau1(I, 2) = 1
End If
If tableau1(I, 1) > 8 Then
tableau1(I, 3) = 2
End If
Next

Next
Next

.Range("S1").Resize(UBound(tableau1, 1), UBound(tableau1, 2)).Value = tableau1

End With

MsgBox Timer - t

End Sub

Bonjour,

Le nombre de lignes ne joue qu'un rôle mineur dans cette histoire !

Ce qui compte c'est le nombre de fois que vous évaluez vos expressions car ce sont les opérations les plus longues.

Expression1 = tableau1(I - 1, 1) > 7 + K - L
Expression2 = tableau1(I - 1, 3) = 2
Expression3 =  Expression1 And Expression2
Expression4 = tableau1(I, 1) > 8

15000 x 200 x 100 = 300 000 000 !!!

On peut donc considérer que dans cette situation le temps est négligeable même si on pourrait apporter quelques améliorations cosmétiques...

A noter toutefois une ligne dont on pourrait se demander si vous en maîtrisez le sens (en tout cas moi pas, mais ce n'est pas un problème vu mon faible niveau...)

If tableau1(I - 1, 1) > 7 + K - L And tableau1(I - 1, 3) = 2 Then

est une syntaxe que je considère comme fautive à moins que vous ne soyez capable d'en expliquer la cohérence !

La syntaxe usuelle est la suivante :

If tableau1(I - 1, 1) > 7 + K - L = 2 And tableau1(I - 1, 3) = 2 Then

Notez que le résultat des 2 expressions est différent mais le fait de produire un autre résultat n'est pas une garantie de pertinence...

Quoi qu'il en soit dans les 2 cas la différence est négligeable (au point de vue du temps)

A+

Bonjour et merci pour votre réponse,

Non, ce n'est pas une syntaxe fautive, c'est une expression comme une autre. Ce qui compte ici, c'est la structure de mes boucles imbriquées.

Pour le reste, j'ai bien peur d'être d'accord avec vous. Il existe peut-être quelques "améliorations cosmétiques" à faire, et encore...

Tout est dans "le nombre de fois que vous évaluez vos expressions car ce sont les opérations les plus longues", et donc, je ne crois qu'il y a un truc qui me fera gagner plus de temps.

Mais je me devais de poser la question, on ne sait jamais. Et puis ça me rassure que quelqu'un ait la même analyse que moi.

bonjour de nouveau,

54 sec ? Ce sont 73 sec sur mon ordinateur, donc le votre est plus vite.

Ce code universitaire a besoin de 0.09 sec pour atteindre le même résultat = 800 fois plus vite.

Sur votre ordinateur, ce sera 0.07 sec peut-être

Sub Exemple_Universitaire2()

     t = Timer

     Dim tableau0
     Dim tableau1
     Dim derniereLigne As Integer
     Dim I     As Integer, MonMin

     With Sheets("Exercice")

          derniereLigne = .Cells(Rows.Count, 1).End(xlUp).Row

          tableau0 = .Range("A1:A" & derniereLigne).Value

          tableau1 = tableau0

          ReDim Preserve tableau1(1 To UBound(tableau0), 1 To 3)

     'le valeur min de k-l, cela se voit directement que c'est 1-100 = -99
          MonMin = -99

          For I = 2 To UBound(tableau1)
               If tableau1(I - 1, 1) > 7 + MonMin And tableau1(I - 1, 3) = 2 Then
                    tableau1(I, 2) = 1
               End If
               If tableau1(I, 1) > 8 Then
                    tableau1(I, 3) = 2
               End If
          Next

          .Range("O1").Resize(UBound(tableau1, 1), UBound(tableau1, 2)).Value = tableau1

     End With

     MsgBox Timer - t

End Sub
5fab.xlsb (161.76 Ko)

Superbe !

Je ne devais encore pas être trop bien réveillé tout à l'heure !
Cela m'a permis de corriger mon incompréhension...
A+

alors, vous étiez encore fatiqué , moi je préfère aussi d'être paresseux que fatigué

Bonjour et merci à tous pour votre aide.

Mais je me suis rendu compte que les conditions de mes boucles étaient un peu foireuses.

De ce fait, certaines "astuces" pouvaient être utilisées sans pour autant faire avancer ma problématique.

Il faut que je retravaille mon code avant de pouvoir vous le resoumettre si nécessaire.

Pour l'instant, donc, sujet résolu.

Edit modo : propos déplacé, n'a rien à faire sur ce forum

Rechercher des sujets similaires à "boucles imbriquees temps execution"