pier0
Messages postés67Date d'inscriptionmardi 19 juillet 2005StatutMembreDernière intervention 2 septembre 2005
-
30 août 2005 à 14:26
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
cs_69chris
Messages postés318Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention30 décembre 20051 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 à:
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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...