Optimisation vitesse macro

Résolu/Fermé
padbollevrai Messages postés 51 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 18 mars 2015 - Modifié par padbollevrai le 12/05/2014 à 10:51
yannpl7 Messages postés 1509 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 20 novembre 2015 - 13 mai 2014 à 13:23
Bonjour,

Je dispose d'une suite de plusieurs macros pilotées par une macro "maitresse", et j'aimerais en augmenter la vitesse d'exécution.

Les macros sont identiques dans la forme, seules les opérations traitées sont différentes.
Voici l'une d'entre elles:

Sub Filling_Min(Col)

    Dim K As Integer
    Dim LastLine As Integer
    Dim Min As Double
    Dim V1 As Double, V2 As Double
    Application.ScreenUpdating = False
      
    

    Sheets("INPUT").Select

    LastLine = Range("A" & Rows.Count).End(xlUp).Row
    
    For K = 3 To LastLine Step 2
        
         Sheets("INPUT").Select
        
        V1 = Cells(K, ((Col + 1) * 0.5)).Value
        V2 = Cells(K + 1, ((Col + 1) * 0.5)).Value
        If V1 < V2 Then Min = V1 Else Min = V2

        Sheets("OUTPUT").Select
        LastLine = Worksheets("OUTPUT").Cells(Rows.Count, Col).End(xlUp).Row + 1
        Worksheets("OUTPUT").Cells(LastLine, Col) = Min

    Next K


End Sub


Ce qui me gêne, c'est les "Sheets select" qui ralentissent donc ma macro. J'ai tenté de faire ceci:

Sub Filling_Min(Col)

    Dim K As Integer
    Dim LastLine As Integer
    Dim Min As Double
    Dim V1 As Double, V2 As Double
    Application.ScreenUpdating = False
      
    

    Sheets("INPUT").Select

    LastLine = Range("A" & Rows.Count).End(xlUp).Row
    
    For K = 3 To LastLine Step 2
          'ligne supprimée'
        
        V1 = Worksheets("INPUT").Cells(K, ((Col + 1) * 0.5)).Value    'Modifié '
        V2 = Worksheets("INPUT").Cells(K + 1, ((Col + 1) * 0.5)).Value  'modifié'
        If V1 < V2 Then Min = V1 Else Min = V2

                               'ligne supprimée'
        LastLine = Worksheets("OUTPUT").Cells(Rows.Count, Col).End(xlUp).Row + 1
        Worksheets("OUTPUT").Cells(LastLine, Col) = Min

    Next K


End Sub



Malheureusement, il me dit "Dépassement de capacité", ce que je ne comprends pas car je n'ai pas changé mes variables.

J'ai remis la ligne "Sheets("OUTPUT").Select", cela refonctionne, mais cela m'embête car je pense que la macro pourrait toujours être plus rapide, et je ne comprends pas pourquoi elle ne veut pas marcher sans cette ligne.


Pour info, mon prog actuel met 33 secondes pour traiter 4 colonnes de 3 400 lignes, et les transformer en 8 colonnes de 1 700. J'ai un Intel Core i7 avec 4Go de DDR3 et un disque SSD, c'est grave ! Comment optimiseriez-vous cette macro ?

Merci !
A voir également:

3 réponses

padbollevrai Messages postés 51 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 18 mars 2015 1
12 mai 2014 à 11:05
Parfait ! Je ne sais pas pourquoi, mais maintenant ça marche sans les "Sheets .Select").

Résultat, 9 secondes au lieu de 33.
1
yannpl7 Messages postés 1509 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 20 novembre 2015 303
13 mai 2014 à 13:23
N'oublie pas de mettre le poste comme résolu ;)
0
yannpl7 Messages postés 1509 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 20 novembre 2015 303
12 mai 2014 à 10:25
Salut essaye avec ça

Sub Filling_Min(Col)

    Dim K As Integer
    Dim LastLine As Integer
    Dim Min As Double
    Dim V1 As Double, V2 As Double
    Application.ScreenUpdating = False
     
   

    LastLine = Worksheets("INPUT").Range("A" & Rows.Count).End(xlUp).Row
    
    For K = 3 To LastLine Step 2
          'ligne supprimée'
        
        V1 = Worksheets("INPUT").Cells(K, ((Col + 1) * 0.5)).Value    'Modifié '
        V2 = Worksheets("INPUT").Cells(K + 1, ((Col + 1) * 0.5)).Value  'modifié'
        If V1 < V2 Then Min = V1 Else Min = V2

                               'ligne supprimée'
        LastLine = Worksheets("OUTPUT").Cells(Rows.Count, Col).End(xlUp).Row + 1
        Worksheets("OUTPUT").Cells(LastLine, Col) = Min

    Next K

End Sub



0
yannpl7 Messages postés 1509 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 20 novembre 2015 303
12 mai 2014 à 11:16
En faite c'est parque tu définis directement la feuille de travail avec la cellule à travailler.
Tu peux aussi supprimer les "Application.ScreenUpdating " puisqu'il n'y a plus les bagotements créé par les Sheets("yyyyy").Select
-1