Optimisation vitesse macro
Résolu
padbollevrai
Messages postés
58
Statut
Membre
-
yannpl7 Messages postés 1535 Statut Membre -
yannpl7 Messages postés 1535 Statut Membre -
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:
Ce qui me gêne, c'est les "Sheets select" qui ralentissent donc ma macro. J'ai tenté de faire ceci:
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 !
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:
- Optimisation vitesse macro
- Optimisation pc - Accueil - Utilitaires
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Test vitesse pc - Guide
- Vitesse du processeur - Guide
- Augmenter vitesse pc windows 10 - Guide
3 réponses
Parfait ! Je ne sais pas pourquoi, mais maintenant ça marche sans les "Sheets .Select").
Résultat, 9 secondes au lieu de 33.
Résultat, 9 secondes au lieu de 33.
yannpl7
Messages postés
1535
Statut
Membre
304
N'oublie pas de mettre le poste comme résolu ;)
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