Optimisation vitesse macro
Résolu
padbollevrai
Messages postés
51
Date d'inscription
Statut
Membre
Dernière intervention
-
yannpl7 Messages postés 1514 Date d'inscription Statut Membre Dernière intervention -
yannpl7 Messages postés 1514 Date d'inscription Statut Membre Dernière intervention -
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
- Vitesse processeur - Guide
- Test vitesse pc - 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
1514
Date d'inscription
Statut
Membre
Dernière intervention
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