Accélération et simplification de code

Résolu
pier0 Messages postés 67 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 2 septembre 2005 - 30 août 2005 à 14:26
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 30 août 2005 à 23:14
Slt,
je cherche à optimiser(en terme de rapidité d'éxecution et de lisibilité) le bout de code suivant:

********************************************************************************While (Worksheets("Résultats de comparaison").Cells(i, l).Value <> Empty)
' Lignes en vert foncé ou clair selon que les différents Status soit Completed (ou Vide ou Not Required ou Cct Order Issued) ou pas

If (((Worksheets("Résultats de comparaison").Cells(i, circ).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, circ).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, circ).Value = "Cct Order Issued")) And _
((Worksheets("Résultats de comparaison").Cells(i, jmp).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, jmp).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, jmp).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, fibra).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, fibra).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, fibra).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, fibrb).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, fibrb).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, fibrb).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, civa).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, civa).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, civa).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, civb).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, civb).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, civb).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, intern).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, intern).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, intern).Value = "Completed"))) Then

If ((Worksheets("Résultats de comparaison").Cells(i, n).Value <> "MISE A JOUR IMPOSSIBLE!") And (Worksheets("Résultats de comparaison").Cells(i, m).Value <> Empty)) Then
Rows(i).Font.ColorIndex = 10 'Mise en vert foncé si: ni un jour ni "MISE A JOUR IMPOSSIBLE!"

If (((Worksheets("Résultats de comparaison").Cells(i, EngSt).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, EngSt).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, EngSt).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, SwiSt).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, SwiSt).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, SwiSt).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, RtePlaA).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, RtePlaA).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, RtePlaA).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, RtePlaB).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, RtePlaB).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, RtePlaB).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, IntlFbA).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, IntlFbA).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, IntlFbA).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, IntlFbB).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, IntlFbB).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, IntlFbB).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, Testg).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, Testg).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, Testg).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, TechSt).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, TechSt).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, TechSt).Value = "Completed")) And _
((Worksheets("Résultats de comparaison").Cells(i, LandCtA).Value Empty) Or (Worksheets("Résultats de comparaison").Cells(i, LandCtA).Value "Not Required") Or (Worksheets("Résultats de comparaison").Cells(i, LandCtA).Value = "Completed"))) Then

Rows(i).Font.ColorIndex = 4 'Mise en vert clair si tout les champs sont ok

End If

End If

End If

'Lignes en rouge si le champs Eng Status est en 'Awaiting Task Assignment'
If (Worksheets("Résultats de comparaison").Cells(i, EngSt).Value = "Awaiting Task Assignment") Then
Cells(i, EngSt).Interior.ColorIndex = 34 'fond bleu clair
Rows(i).Font.ColorIndex = 3
End If

' EID en orange si pb d'EID
' Pb_eid False 'Booléen, Pb_eid True si dat_EID_Planning > dat_EID
If (Worksheets("Résultats de comparaison").Cells(i, m).Value <> Empty) Then 'Si colonne m contient une date

dat_EID_Planning = Worksheets("Résultats de comparaison").Cells(i, n).Value
dat_EID = Worksheets("Résultats de comparaison").Cells(i, m).Value
diff_dat_jour = DateDiff("d", dat_EID_Planning, dat_EID) 'calcul de différence de dates: day->différence en jour

If diff_dat_jour < 0 Then
Range(Cells(i, n), Cells(i, m)).Select
Selection.Font.ColorIndex = 45 'Mise en orange clair si pb d'EID
' Pb_eid = True 'Pb d'EID car dat_EID_Planning > dat_EID
End If
End If

i = i + 1 'Incrémente le compteur: lignes suivante
Wend 'Met fin à la boucle End While quand cellule vide
********************************************************************************

Excusez moi pour la présentation mais la largeur de la textbox du forum est un peu étroite!

Merci de me venir en aide, toutes vos suggestions sont les bienvenues.
@+, Pier0

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 août 2005 à 18:55
Salut Pier0
Dans ton cas de figure, tu as :
If (A Or B Or C) And (D Or E Or F) And ...

Tel que tu as construit ton If, Excel est obligé de calculer chaque item pour faire le calcul du If.
Je te conseille donc de lui simplifier la tache en utilisant une structure en cascade, comme ça, dès qu'une première combinaison est fausse, il ne calcule pas les suivantes :
If A Or B Or C Then
If D Or E Or F Then
If ...
...
End If
End If
End If

D'autre part, chaque série de 3 tests s'opèrent sur le même champ : Excel va donc relire 3 fois ce champ.
Pour aller plus vite, transfère le contenu de ton champ dans une variable et utilise cette variable dans tes If :

Temp = Worksheets("Résultats de comparaison").Cells(i, circ).ValueIf Temp Is Empty Or Temp "Not Required" Or Temp "Cct Order Issued" Then
Temp = Worksheets("Résultats de comparaison").Cells(i, jmp).Value If Temp Is Empty Or Temp "Not Required" Or Temp "Completed" Then
Temp = Worksheets("Résultats de comparaison").Cells(i, fibra).Value
If ...
...
End If
End If
End If

Vérifie que Empty s'utilise comme tu l'as fait : .Value = Empty
Je crois que la bonne syntaxe est .Value Is Empty

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
3
cs_69chris Messages postés 318 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 30 décembre 2005 1
30 août 2005 à 14:46
Salut,



En survolant le code, je pense à une technique SQL, ça serai pas plus
simple de formaliser ce que tu ne veux pas que ce que tu veux?

En fait la condition ressemblerait à

Si Pas(Ce que je ne veux pas) alors

au lieu de

Si (Ce que je veux) alors



En plus, ta macro réalise tout les tests à chaque fois donc si tu
pouvais séparé ton test en plusieurs parties depuis la plus fréquente à
la moins fréquente avec un code qui ressemble à:

Dim bTestOk as Boolean

bTestOk = condition1

if not(bTestOk) then

bTestOk = condition2

elseif not(bTestOk) then

......

end if



Voilà, c'est mes premières idées.



Chris


N'oubliez pas de cloturer votre post.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
30 août 2005 à 23:14
Oufff....

Pour ma part, je pense qu'il est dommage de ne pas avoir toute la boucle WHILE, je t'aurais concocté ça aux petits oignons...


Première remarque : Tu ne sembles pas connaître la fonction With !

Tous les trucs " Worksheets("Résultats de comparaison") " sont vraiment trés lourds ! Utilise donc plutôt un truc du genre :

With Worksheets("Résultats de comparaison")
....
.Cells(i, circ).Value ....etc...
....
End With




Deuxième remarque :

Tu utilises une boucle avec While, et comme compteur i... Peut-on pas utiliser FOR TO NEXT... (sans commune mesure...)
ET bien sur, en déclaration la variable de cette boucle FOR... par exemple :

Dim i as Long
FOR i=1 to (je ne sais pas quoi)

NEXT i


Troisième remarque :

Dans toutes tes références dans Cells, tu utilise i et une variable, qui joue ici le rôle de constante (surement pour repérer une colonne spécifique) ... Bref, utiliser autant de variables n'est pas bon, car toutes ces variables jouent le même rôle, à savoir retenir le numéro d'une colonne... IL aurait plus astucieux de déclarer un tableau par DIM col(), et d'inscrire dans chaque indice le numéro de la colonne qui t'intéresse ici. Par exemple, col(0)=2, col(1)=4 ... (au pif, ici)... Ainsi, toutes des comparaisons pourraient surement se résumer grandement... ainsi que dans l'ensemble du programme... enfin, cette dernière remarque est plus profonde, qu'une simple optimisation du code proposé... IL faudrait voir l'ensemble, pour voir comment bien s'y prendre... (euh... ceci dit, je me te ferais pas tout ce boulot à ta place...)


Amicalement,
Us.

PS: Tient ! il me semble aussi que .Value appliqué à Cells est optionelle...
en gros : Cells(x,y).value truc est identique à Cells(x,y) truc
A voir...
0
Rejoignez-nous