pier0
Messages postés67Date d'inscriptionmardi 19 juillet 2005StatutMembreDernière intervention 2 septembre 2005
-
26 août 2005 à 15:26
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDerniè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
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
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
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 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 ...
pier0
Messages postés67Date d'inscriptionmardi 19 juillet 2005StatutMembreDerniè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