begin process at 2012 02 16 01:05:10
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Visual Basic & VB.NET

 > 

Archives Visual Basic

 > 

J'AI BESOIN D'AIDE !!!! :)

 > 

Accélération et simplification de code


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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

Membre Club
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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,792 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales