Optimisation de code : Accélerer du code

Résolu
pier0 Messages postés 67 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 2 septembre 2005 - 26 août 2005 à 15:26
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 26 août 2005 à 17:20
Slt,
Je viens de terminer un programme (de gestion d'un planning excel) sur VBA composé de plusieurs modules je cherche à l'optimiser (de manière simple si possible).

après plusieurs test j'ai cru identifier ce qui mettait le plus de temps à tourner:

Deux boucles for imbriqueées:
********************************************************************************
For i = 1 To lgne_max_Planning

If (Worksheets("Planning").Cells(i, 1).Value <> Empty) Then
If ((Worksheets("Planning").Cells(i, 1).Value <> "LUNDI") And (Worksheets("Planning").Cells(i, 1).Value <> "MARDI") And (Worksheets("Planning").Cells(i, 1).Value <> "MERCREDI") And (Worksheets("Planning").Cells(i, 1).Value <> "JEUDI") And (Worksheets("Planning").Cells(i, 1).Value <> "VENDREDI") And (Worksheets("Planning").Cells(i, 1).Value <> "SAMEDI") And (Worksheets("Planning").Cells(i, 1).Value <> "DIMANCHE")) Then

semaphore = False 'init semaphore (semaphore=True indique qu'une commande a été trouvée dans les 2 feuilles (OHS et Planning))

' Boucle de recherche de commande (indexée par j dans feuille OHS) de feuille Planning
For j = 2 To lgne_max_OHS
If (Worksheets("OHS").Cells(j, l).Value <> Empty) Then

If Worksheets("OHS").Cells(j, l).Value = Worksheets("Planning").Cells(i, 1).Value Then

semaphore = True


Sheets("Planning").Rows(i).Copy

Sheets("Résultats de comparaison").Rows(k).Select
ActiveSheet.Paste

Sheets("OHS").Select
Range(Cells(j, 2), Cells(j, nb_col_OHS)).Select
Selection.Copy
Sheets("Résultats de comparaison").Select
Range(Cells(k, 3), Cells(k, nb_col_OHS + 1)).Select
ActiveSheet.Paste

Worksheets("Résultats de comparaison").Cells(k, 2).Value = EID_Planning

k = k + 1
End If
End If
Next j

If semaphore = False Then
Sheets("Planning").Rows(i).Copy
Sheets("Résultats de comparaison").Select
Rows(k).Select
ActiveSheet.Paste

Cells(k, (l + 1)).Value = "MISE A JOUR IMPOSSIBLE!"
Rows(k).Font.ColorIndex = 15

k = k + 1
End If
Else

' Recopie de la date situé à coté du jour dans l'extract Planning dans la variable EID_Planning
Sheets("Planning").Rows(i).Copy
Sheets("Résultats de comparaison").Select
Rows(k).Select
ActiveSheet.Paste
' MsgBox ("cellule=") & Worksheets("Résultats de comparaison").Cells(k, 1).Value

Select Case (Worksheets("Résultats de comparaison").Cells(k, 1).Value)
Case "LUNDI"
EID_Planning = Worksheets("Résultats de comparaison").Cells(k, 2).Value
Rows(k).Font.Bold = True
Case "MARDI"
EID_Planning = Worksheets("Résultats de comparaison").Cells(k, 2).Value
Rows(k).Font.Bold = True
Case "MERCREDI"
EID_Planning = Worksheets("Résultats de comparaison").Cells(k, 2).Value
Rows(k).Font.Bold = True
Case "JEUDI"
EID_Planning = Worksheets("Résultats de comparaison").Cells(k, 2).Value
Rows(k).Font.Bold = True
Case "VENDREDI"
EID_Planning = Worksheets("Résultats de comparaison").Cells(k, 2).Value
Rows(k).Font.Bold = True
Case "SAMEDI"
EID_Planning = Worksheets("Résultats de comparaison").Cells(k, 2).Value
Rows(k).Font.Bold = True
Case "DIMANCHE"
EID_Planning = Worksheets("Résultats de comparaison").Cells(k, 2).Value
Rows(k).Font.Bold = True
Case Else
MsgBox ("autre cas!ligne=") & k & (" cellule_colonne1=") & (Worksheets("Résultats de comparaison").Cells(k, 1).Value)
End Select

k = k + 1
End If
End If

Next i

********************************************************************************

ansi que plusieurs enregtrements de fichier.

Si qqu'un connait un moyen d'accélérer mon code (par exemple en augmentant les ressources microprocesseur afin de réaliser les taches de mon prog de facon prioritaire) je le remercie par avance de me venir en aide.

Rq: j'ai deja effectué des petites optimisations du genre:
-le moins de variable globale possible
-le moins d'enregitrement de fichiers possibles
-le moins d'appel de fonction possible
-le moins de test possible, surtout dans les boucles
-le moins de variable intermédiaires superflues
-geler la mise à jour de l'affichage pendant l'éxecution de mon programme
-minimiser les msgbox

Merci d'avance pour vos suggestions, @+, Pier0

3 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
26 août 2005 à 15:50
première remarque : pour ton Select case, moi je ferais ceci :
With Worksheets("Résultats de comparaison").Cells(k, 2)
Select Case (Worksheets("Résultats de comparaison").Cells(k, 1).Value)
Case "LUNDI"
EID_Planning = .Value
Rows(k).Font.Bold = True
Case "MARDI"
EID_Planning = .Value
Rows(k).Font.Bold = True
Case "MERCREDI"
EID_Planning = .Cells(k, 2).Value
Rows(k).Font.Bold = True
Case "JEUDI"
EID_Planning = .Value
Rows(k).Font.Bold = True
Case "VENDREDI"
EID_Planning = .Value
Rows(k).Font.Bold = True
Case "SAMEDI"
EID_Planning = .Value
Rows(k).Font.Bold = True
Case "DIMANCHE"
EID_Planning = .Value
Rows(k).Font.Bold = True
Case Else
MsgBox ("autre cas!ligne=") & k & (" cellule_colonne1=") & (Worksheets("Résultats de comparaison").Cells(k, 1).Value)
End Select
End With
En plus c'est largement plus lisible ...
3
pier0 Messages postés 67 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 2 septembre 2005
26 août 2005 à 16:10
Ouè c clair que c plus lisible mais j'ai tj entendu que plus c'est optimisé moin c'est lisible! Alors est ce vraiment une optimisation en terme de vitesse d'execution du code.
Merci de tes conseils, j'aattend ta réponse pour pouvoir tester ton optimisation...
@+, encore merci, Pier0
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 août 2005 à 17:20
le With est plus rapide.

j'ai pas regardé, je modifie à peine le conseil de Creanaud :

Dim RdcS as String: RdcS = "Résultats de comparaison"


With Worksheets(RdcS).Cells(k, 2)
Select Case (Worksheets(RdcS).Cells(k, 1).Value)

Case "LUNDI", "MARDI", "JEUDI", "VENDREDI", "SAMEDI", "DIMANCHE" EID_Planning .Value: Rows(k).Font.Bold True

Case "MERCREDI" EID_Planning .Cells(k, 2).Value: Rows(k).Font.Bold True


Case Else MsgBox "autre cas!ligne " & k & " cellule_colonne1 " & Worksheets(RdcS).Cells(k, 1).Value

End Select
End With

PCPT
3
Rejoignez-nous