Accueil > Forum > > > > Accélération et simplification de code
Accélération et simplification de code
mardi 30 août 2005 à 14:26:14 |
Accélération et simplification de code

pier0
|
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
|
|
mardi 30 août 2005 à 14:46:20 |
Re : Accélération et simplification de code

69chris
|
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.
|
|
mardi 30 août 2005 à 18:55:13 |
Re : Accélération et simplification de code

jack
|
Réponse acceptée !
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).Value If 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)
|
|
mardi 30 août 2005 à 23:14:51 |
Re : Accélération et simplification de code

us_30
|
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...
|
|
Cette discussion est classée dans : résultats, comparaison, value, cells, worksheets
Répondre à ce message
Sujets en rapport avec ce message
Question sur la syntaxe VB [ par pier0 ]
Bonjour, J'ai une petite question sur la syntaxe VB. En fait j'ai écris une ligne de commande qui est très longue et prend plus de place que la largeu
Optimisation de code : Accélerer du code [ par pier0 ]
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 simp
Parser avec Split pour Excel 97 [ par Eldros ]
J'ai un tableau Excel qui contient une colonnes avec des cellules ayant un contenu sur plusieurs ligne (donc saut à la ligne). Le problème c'est qu'el
comparer deux feuilles Excel! Pourquoi mon programme ne marche pas!??? [ par dannie_m ]
Salut, Je suis une débutante en VBA. Je dois faire le plus rapidement possible la comparaison de deux feuilles Excel. J'ai fais comme j'ai pu en lisa
Debutant, besoin d'aide car pb avec Select Case quand ya du text! [ par pier0 ]
J'ai un prog qui effectue différente taches et j'ai un pb avec Select Case. Voila un bout de mon code : ************codeVB****************************
Besoin d'aide d'un expert en optimisation de boucle [ par pier0 ]
Bonjour, Voici une bout de code qu'il faut que j'optimise en terme de rapidité: en pratique: la variable lgne_max_OHS sera de l'odre de 1500 et lgne_
cde combobox [ par vincezo ]
Bonjour, voici mon code :Private Sub creation_feuille_Click() Dim Client As StringDim Compte As StringDim Emetteur As StringDim anc_num As StringDim n
[vb6 excel] [ par tof008 ]
Bonjour à tous! J'espere trouver une âme charitable qui pourra m'aider à résoudre mon problême... A partir de vb6, j'envoie des infos sous excel puis
problème avec .findnext sous VBA [ par jordinette ]
REvoici mon code, lorske je le lance au premier find il trouve une seule foi la valeur "composan" ce ki correspond a ce ke jai ds ma colonne. Lors du
[vb6] excel et vb6 message d'erreur [ par tof008 ]
Hello! Petit probleme : j'ouvre excel à partir de vb pour y faire des stats, et en fait, j'utilise le meme procédé en changeant juste ma requete... mo
Livres en rapport
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
ACCES ODBCACCES ODBC par yannickcottin
Cliquez pour lire la suite par yannickcottin
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|