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