Optimisation de code

Bonjour à tous,

J'aurais besoin de votre aide pour finaliser mon petit fichier et optimiser le code qui est très lent...

Un logiciel me donne une valeur expérmentale, je dois comprendre à quoi elle correspond.

Je réalise différents calculs pour établir si ma particule (valeur initiale saisie dans la textbox2) est chargée une fois (mono), 2 fois (Duo) ou 3 fois (Trio) et cela en aisant varier un paramètre (i, j et k) de 9 à 23 pour chaque charge.

Pour chaque charge, il peut y avoir de 0 à 3 modifications.

Voici comment il fonctionne :

* l'utilisateur saisit une valeur dans les textbox 2, 3 et 4, puis clique sur Go

* la macro teste toutes les possibilités suivant les formules entrées dans le code et les compare à la valeur entrée dans la textbox3 (+ ou - la valeur de la textbox4)

* si la valeur calculée est égale à la textbox3 +/- textbox4, alors la valeur calculée est ajoutée à la listbox correspondant à la charge

* seules les valeurs uniques sont ajoutées à la listbox (valeur unique = même valeur calculée et même charge (ex : i=9, j=9 et k=20 est équivalent à i=20, j=9 et k=9 et à i=9, j=20 et k=9)

Mon code fonctionne à peu prés, mais est très lent... Je ne pense pas que mon code soit optimal...

Merci beaucoup de votre aide,

Amicalement

Edit : fichier mis à jour !

Hello Walden,

Me.TextBox8 = inf
Me.TextBox9 = sup

Me renvoie une erreur, l'élément n'existe pas!


Valeur1 = i * WsVariables.Range("B6") + WsVariables.Range("B3") + WsVariables.Range("B5")

Ne peut pas fonctionner tu n'as pas créé ni définit ta variable...

Dim WsVariables As Worksheet
Set WsVariables = Sheets("Variables")

Le code tourne mais rien ne se passe, es-ce normal? ^^

Bonjour d3d9x,

Merci pour ta réponse ! Je mets le fichier à jour dans mon 1er post !

Merci encore,

Amicalement

Bon je suis perdu dans ton code,

tu peux mettre les formules utilisées plutôt??

Re,

Je ne peux que comprendre... Pas simple tout ça...

Valeur1 = i * WsVariables.Range("B6") + WsVariables.Range("B3") + WsVariables.Range("B5")

Mono = CDbl(Me.TextBox2.Value) + (Valeur1 - Modif1 * 2 * WsVariables.Range("B1")) - WsVariables.Range("B1")

Valeur2 = j * WsVariables.Range("B6") + WsVariables.Range("B3") + WsVariables.Range("B5")

Duo = CDbl(Me.TextBox2.Value) + (Valeur1 - Modif1 * 2 * WsVariables.Range("B1")) + (Valeur2 - Modif2 * 2 * WsVariables.Range("B1")) + WsVariables.Range("B2") - WsVariables.Range("B1")

Valeur3 = k * WsVariables.Range("B6") + WsVariables.Range("B3") + WsVariables.Range("B5")

Trio = CDbl(Me.TextBox2.Value) + (Valeur1 - Modif1 * 2 * WsVariables.Range("B1")) - WsVariables.Range("B1") + (Valeur2 - Modif2 * 2 * WsVariables.Range("B1")) + (Valeur3 - Modif3 * 2 * WsVariables.Range("B1")) + WsVariables.Range("B2") - WsVariables.Range("B1")

C'est ce que tu voulais ?

Merci beaucoup !

Non pas vraiment ^^

ça j'y ai déjà accès, et je m'y perd.

Partons de la même notation:

'--------

valeurI => valeur initiale

valeurE => valeur expérimentale

variation => variation

'--------

valeurMin = valeurE - variation

valeurMax = valeurE + variation

'--------

mesVariables(1) = 2,005952

mesVariables(2) = 69,21894

etc...

'--------

Peux-tu vérifier/compléter les formules que j'ai extrait de ton code

valeur1 = mesVariables(6) * i + mesVariables(3) + mesVariables(5)
valeur2 = mesVariables(6) * j + mesVariables(3) + mesVariables(5)
valeur3 = mesVariables(6) * k + mesVariables(3) + mesVariables(5)

mono = valeurI + valeur1 - mesVariables(1) * (1 + 2 * modif1)
duo = ???????
trio = ???????

J'ai mis des ??? parce que c'est un sacré bordel, d'une formule à l'autre des termes apparaissent, c'est étrange....

En effet, ce n'est pas évident ! Je suis désolé

Voici !

valeur1 = mesVariables(6) * i + mesVariables(3) + mesVariables(5)

valeur2 = mesVariables(6) * j + mesVariables(3) + mesVariables(5)

valeur3 = mesVariables(6) * k + mesVariables(3) + mesVariables(5)

mono = valeurI + valeur1 - mesVariables(1) * (1 + 2 * modif1)

duo = valeurI + (valeur1 - 2 * modif1 * mesVariables(1)) + (valeur2 - 2 * modif2 * mesVariables(1)) + mesVariables(2) - mesVariables(1)

trio = valeurI +(valeur1 - 2 * modif1 * mesVariables(1)) + (valeur2 - 2 * modif2 * mesVariables(1)) + (valeur3 - 2 * modif3 * mesVariables(1)) - 2 * mesVariables(1) + mesVariables(2)

J'ai essayé de simplifier mes formules au max...

Est-ce plus clair ?

A+

Ok c'est bon pour moi et les formules. Tu as un exemple où tes lignes sont censées s'ajouter?

Cool !!

Je ne suis pas sûr de comprendre ta question... Je vais essayer de répondre :

* les valeurs de mono dans l'intervalle requis sont ajoutées à la listbox1

* les valeurs de duo dans l'intervalle requis sont ajoutées à la listbox2

* les valeurs de trio dans l'intervalle requis sont ajoutées à la listbox3

Es-ce que c'est la réponse que tu attendais ?

Pour faire simple, j'ai tout recodé et reprogrammé, mais avec le cas que tu as par défaut, la condition d'intervalle n'est jamais remplie, et donc rien ne s'inscrit dans tes listbox.

Es-ce normal? Si c'est normal, es-ce que tu as un cas d'exemple, où le résultat final est connu?

ok ! Je comprends mieux ! En fait, c'est moi qui fixe l'erreur et donc les limites de l'intervalle. Si l'intervalle est trop restreint, je peux augmenter l'erreur tolérée. Dans certains cas, si l'erreur est trop élevée et je ne peux pas donner de résultat...

J'obtiens des réponses en duo et trio avec les paramètres suivants

valeurI = 45546,821

valeurE = 46036,12955

variation = 100

Tu n'obtiens pas de valeurs ?

12test-1.xlsm (33.50 Ko)

Ah si un joli petit paquet là ^^

0 à 1 charge

plein à 2 charges

16 à 3 charges

MERCI !!!! Je commence juste à tester, mais le code est tellement bien pensé ! Bravo et merci !

Voici les quelques points que j'ai relevés :

* serait-il possible stp d'ajouter les valeurs calculées dans la première colonne de la listbox ?

* je ne sais pas si je me suis trompé mais j'obtiens des doublons (voir plus) pour les "2 charges", tu confirmes ?

Merci, vraiment merci !

Ouuuh en effet plein de doublons, je vais regarder ce problème.

Edit: j'ai déjà une piste! Je corrige ça ce soir

Merci beaucoup !

Bon j'ai un soucis:

Tu m'as dit que i - j - k est un doublon de i - k - j est un doublon de ..... etc...

Mais si j'ai les coefficients modif1 et modif2 et modif3 qui sont différents, il se passe quoi?? C'est un doublon ou c'est pas un doublon??

Genre j'ai qu'une charge

i = 1 et modif1 = 0

i = 1 et modif = 1

c'est un doublon ou c'est pas un doublon? En suivant ta règle c'est un doublon...

Alors, en effet :

i-j-k est un doublon de i - k - j si la somme (modif1+modif2+modif3) est la même !

Donc pour 1 charge :

i = 1 et modif1 = 0

i = 1 et modif = 1

n'est pas un doublon !

Par contre,

i = 1, j=0 et modif1 = 0, modif2 =1 est équivalent à

i = 0, j=1 et modif1 = 1, modif2 = 0

C'est ok pour toi ??

Bon, bah ça fout une bonne partie de ce que j'ai fait en l'air ^^

La solution risque de ne pas être ce soir!

Ah zut !! Je suis désolé de mon manque chronique de clarté...

10test-1.xlsm (39.33 Ko)

Hormis la partie "retrait des doublons" qui me parait étrange et que je n'ai pas retravaillé, j'ai divisé par 2 le temps d'exécution.

Ton code s'exécute en 28 secondes, le mien en 12. C'est pas de la folie mais bon c'est déjà ça. (et j'ai le même nombre de résultats)

Pour la partie sur les doublons, tu es bien sûr de ton coup? tes variables n'ont pas la même influence sur tes facteurs, alors es-ce vraiment des doublons?

En effet si tu as en 2 charges:

i = 9 et j = 8 et mod1 = 0 et mod2 = 1

bah tu sais pas si la combinaison

i = 8 et j = 9 et mod1 = 0 et mod2 = 1 fonctionne ou non

Si au final ce qui est significatif c'est le nombre de combinaisons qui marchent, retirer les doublons est absurde, si ce n'est pas le nombre de combinaisons mais la valeur des paramètres c'est également absurde, donc tu es sûr d'avoir besoin de les retirer?


EDIT: J'ai commis une mini erreur voilà la version corrigée

(et en chronométrant je descend à 6 secondes)

10test-1.xlsm (39.33 Ko)
Rechercher des sujets similaires à "optimisation code"