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