Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Automatiser le solveur excel

Tan, le mardi 8 juillet 2008 à 14:58:46
Bonjour,

Comme il est dit dans le sujet je souhaite automatiser le solveur d'excel (2007 je précise la version au cas ou). Je m'explique:

Je dois résoudre un équation du type : f(a,b,c,T)=1.2 (je vous grâce de la formule exacte c'est un truc a coucher dehors). a,b et c sont fixes pour la résolution, Donc je cherche T de sorte que mon équation soit résolue.

Vous allez me dire : utilise le solveur, pof pof t'auras ta réponse ^^,

en effet !

Sauf que j ai un échantillon de 1000 triplets de valeur pour (a,b,c), donc vous comprendrez qu'étant un peu feignant et n'ayant pas le temps d'utiliser 1000 fois le solveur, j'aimerais savoir s'il est possible d'automatiser la chose pour le faire en une fois, parce que le solveur n'accepte pas de résoudre les 1000 cas de figure en même temps (on ne peut mettre qu'une cellule cible a la fois)

Voili voulou, en espérant avoir été suffisamment clair, merci d avance pour vos réponses.


P.S

Je précise que mes données sont organisées en colonnes:

a | b | c | f(x) | T(valeur recherchée)
1 | 0.4 | 14 | 1.2 | 6.67
1.2 | 0.7 | 10 | 1.2 | etc.
Configuration: Windows Vista
Firefox 3.0
Répondre à Tan  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
xdomxfr, le mardi 8 juillet 2008 à 16:25:32
tu crer unr formule mathematique qui te fera le calcul poure la premiere ligne tu verifie le resultat ensuite tu la copie ds toute la colonne
temps 1 minute.
Répondre à xdomxfr

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Tan, le mercredi 9 juillet 2008 à 14:58:15
Je comprends le principe mais l'équation en question n'est pas solvable de façon littérale. C est pour ça que j ai recours au solveur. A moins que ce soit quand même possible. Dans tous les cas, si il y a besoin d une macro 8ce qui est très probable je dois avouer que je suis un débutant complet dans le domaine.
Répondre à Tan

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
gryzzly, le mercredi 9 juillet 2008 à 16:12:44
comment est ce que tu résolves ton equation ?

Pour trouver T, tu te tapes pas toutes les valeurs possibles de T à la main ... il y a donc forcément un calcul, aussi ocmplexe soit il, qui permet de passer de f (abcT) = 1.2 à T = fonction de tes paramètres
Répondre à gryzzly

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
eriiic, le mercredi 9 juillet 2008 à 21:10:04
Bonjour,

Sur 2003 tout au moins impossible de faire appel au solver par macro.
Si l'enregistrement de la macro se fait bien, l'appel aux fonctions est protégé.
eric
Répondre à eriiic

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Tan, le vendredi 11 juillet 2008 à 15:50:04
j ai une debut de reflexion en faisant une boucle, le probleme c'est que je ne sais pas si :
la syntaxe est correcte
si c'est complet

voila le code:

While ActiveCell <> "fin" 'donc ca suppose que j'ai ecris fin a la premiere cellule vide
SolverReset
AdresseCelluleCible = ActiveCell.Address 'Sous-entendu donc que j'ai selectionne la cellule ou je dois executer la macro donc colonne f
ActiveCell.Offset(0, 1).Select 'se deplace sur la colonne d'a cote donc T
AdresseCelluleACalculer = ActiveCell.Address
ActiveCell.Offset(0, -1).Select 'reviens a la cellule de depart
SolverOk SetCell AdresseCelluleCible , MaxMinVal:=3, ValueOf:="1,2",
ByChange:=AdresseCelluleACalculer
SolverSolve 'resolution du solveur
ActiveCell.Offset(1, 0).Select 'incrementation
End while 'fin de boucle

vous sauriez comment l'améliorer SVP ?

@gryzzly: non, je ne peux pas mettre T en fonction de f et des paramètres car il n'y a pas de solutions analytique.
Pourquoi ? parce ma fonction f fait appel a la fonction erreur (erf), et il ne m'est pas possible de la "triturer" pour en sortir T.
Répondre à Tan

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
eriiic, le vendredi 11 juillet 2008 à 16:07:14
et ça ne te met aucune erreur sur SolverReset, SolverOk etc ????
Ce ne sont pas des sub ou fonctions inconnues chez toi ?
Ah...
Répondre à eriiic

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Tan, le samedi 12 juillet 2008 à 04:52:46
A vrai dire, j ai pas encore essaye mais le truc c est que je ne pense pas que le code soit complet.

Je vous tiens au courant.
Répondre à Tan

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
michel_m, le samedi 12 juillet 2008 à 09:59:18
Bonjour tout le monde,

Le solveur provient d' Excel4; tu n'as pas besoin de répéter les paramètres dans la macro car ils sont conservés par l'assistant.

Dans outils-références de l'éditeur VBE, coches solver.xls

ci dessous un exemple de résolution linéaire (détermination de la marge maxi suivant les essais de volumes d''assemblage de cépages pour un viticulteur)

Range("volume").ClearContents
SolverOk SetCell:="marge", MaxMinVal:=1, ValueOf:="0", ByChange:="volume"
SolverSolve (True)

En espèrant que...

Michel
Répondre à michel_m

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Tan, le samedi 12 juillet 2008 à 11:01:43
Bonjour Michel_m,

en effet ce que tu decris est une des manips' qui me manquait. J ai pu reconstitue le tout a partir de l'aide de Microsoft (une fois n'est pas coutume) mais ça reste perfectible (j'expliquerai a la fin)

Tout d'abord le code de ma macro:



Sub solver_automatique()
'
'


While ActiveCell <> "fin" 'debut de la boucle : ca implique que vous avez ecrit fin a la premiere cellule vide sans quoi on tourne a l'infini...
SolverReset
AdresseCelluleCible = ActiveCell.Address 'la ca implique que la cellule selectionne est celle ou vous commencez l'execution de la macro
ActiveCell.Offset(0, -1).Select 'deplacement vers la colonne T
AdresseCelluleACalculer = ActiveCell.Address 'affectation de la variable
ActiveCell.Offset(0, 1).Select 'retour sur colonne f

SolverOk SetCell:=AdresseCelluleCible, MaxMinVal:=3, ValueOf:="1.2", ByChange:=AdresseCelluleACalculer
SolverSolve

ActiveCell.Offset(1, 0).Select 'passage a la ligne suivante
Wend 'fin de la boucle


End Sub




Je rappelle que mes données sont organisées en colonnes comme suit:

a|b|c|T|f
1|5|2|13|1.2
etc. (remarque ce qui ont suivi la conversation depuis le debut auront remarque que T et f ont permutes. Je l'ai fait pour pouvoir vérifier plus facilement ma formule. )

Pour répondre a Eriiic: j'ai effectivement eu le problème du SolverOk inconnu. Et Michel_m (merci a lui) a donne la réponse : pour activer le solveur (et donc qu'il reconnaisse la fonction dans vba), il faut aller dans outils/références et la tu coches solver. S'il n'est pas dans le menu, tu fais parcourir->programs files/Microsoft office/office12/library/solver.xlam (normalement c'est bien cette extension). Et après ça marche ^^

Pourquoi ça reste perfectible ? ben parce que la macro, avec le code actuel renvoi la fenêtre de confirmation du solver autant de fois qu'il est exécute (c est pas drôle et ça ralentit bcp d'avoir a confirmer pour autant de valeurs, mais quand bcp moins que de tout faire manuellement, pour 3000 valeur j ai mis dans les 20 min)
Peut être que Michel_m a la réponse (ou quelqu'un d'autre, on fait comment svp)
Cela dit, enlever la fenêtre ne prévient pas des erreurs (par exemple j'ai eu le droit a quelque valeurs negative, qd on parle d'un temps ça fait quelque désordre)
On pourrait donc compléter pour mettre en valeur les cellules qui marche pas pour les retraiter mais ca c'est un e autre histoire...

Enfin voila, merci a tous ceux qui m'ont conseille, et si quelqu'un sait comment empecher la fenetre du solveur d'apparaitre s'il vous plait, ce serait bienvenue ^^,


et pour ceux que ça intéresse la page de Microsoft qui m'a permis de compléter la macro :

http://support.microsoft.com/kb/153442/fr

Bonne journée !
Répondre à Tan

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Tan, le samedi 12 juillet 2008 à 11:04:35
Et pendant que j'y suis je m'excuse pour les fautes d'orthographe, je ferai attention en me relisant la prochaine fois ^^"
Répondre à Tan

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
eriiic, le samedi 12 juillet 2008 à 11:27:26
Bonjour,

merci à michel pour l'info sur l'activation et à toi pour le complément (effectivement je ne l'avais pas dans la liste).
Pour les confirmations ajoute
application.DisplayAlerts = false avant.
N'oublie de le remettre à true après

eric
Répondre à eriiic

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
michel_m, le samedi 12 juillet 2008 à 11:35:04
Re,

1/pour éviter la fen^tre,
en début de macro tu marques
Application.screenupdating= False
qui fige le défilement de l'écran
Si tu ne rends pas la main au système, tu dois écrire cette instruction avec False. Sinon, tu peux t'en dispenser.

2/A solversolve je rajouterai (true)
3/ pas convaincu par solverreset (source Microsoft ? car cela réinitialise les paramêtres du solveur et apparemment,il faut recommencer les définitions de ta 1° macro)

4/Il ya pas mal de trucs à faire pour optimiser ta macro (les select-sélection sont d'une lenteur extrèmee et occupent de la RAM). Pour cela, il faudrait que tu nous dises à quelle ligne tu commences dans ta colonne F;
petite précision: F est le nom de la colonne ou l'étiquette en entete de ton tableau? il nous faut le nom de la colonne et la ligne de départ.

Dans l'attente

Michel

Pour les fautes d'orthographe, t'inquiètes pas! on a, hélas, plus l'habitude de lire du SMS des ados boutonneux sur ce site...


edit: Salut, Eric, je n'avais pas rafraichi.
petite remarque: ne trouves tu pas que displayalert est dangereux car empêchant l'alerte sur dysfonctionnement?
Répondre à michel_m

13


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Tan, le samedi 12 juillet 2008 à 12:02:05
Re Michel,

Je prends note pour figer l'écran merci !

2/je comprends pas ce que ca change me mettre true a SolverSolve, quelle est la différence ?

3/f: ce n'est pas la colonne (cf. mon premier post), c est le nom de ma fonction

4/D ailleurs la colonne ou ma fonction est écrite est : AG et mon échantillon commence a la ligne 16
J ai pris un peu de place car j ai aussi des fait des stats sur les autres paramètres ^^

Voili voilou ^^
Répondre à Tan

14


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
eriiic, le samedi 12 juillet 2008 à 12:11:51
Pour les confirmations c'est application.DisplayAlerts = false
voir post 11
Répondre à eriiic

15


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
michel_m, le samedi 12 juillet 2008 à 12:22:30
OK,
pour solversolve(true):

ton truc qui réapparait...
copier-coller de l'aide:

SolverSolve(UserFinish, ShowRef)

UserFinish Argument de type Variant facultatif. Affectez-lui la valeur True pour renvoyer les résultats sans afficher la boîte de dialogue Résultats du Solveur

Je regarde le reste tout à l'heure à moins que qqn d'autre s'y colle (ca m'arrangerait)
Michel
Répondre à michel_m

16


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
michel_m, le samedi 12 juillet 2008 à 16:12:08
ci dessous proposition non testée (au besoin, envoie un extrait expurgé de ton classeur sur www.cjoint.com)

Sub solver_automatique()
Dim col As Byte, lig As Long, derlig As Long
Dim AdresseCelluleCible As String, AdresseCelluleACalculer As String

'parametre départ
col = 33 'colonne AG
derlig = Range("AG65536").End(xlUp).Row 'fin échantillon

fige l'écran
Application.ScreenUpdating = False

'parcours de l'échantillon
For lig = 16 To derlig
    AdresseCelluleCible = Cells(lig, col).Address
    AdresseCelluleACalculer = Cells(lig, col - 1).Address
    ' solveur XL4
   SolverOk SetCell:=AdresseCelluleCible, MaxMinVal:=3, ValueOf:="1.2", ByChange:=AdresseCelluleACalculer
    SolverSolve (True)
Next

End Sub

Je confirme qu'il ne faut pas utiliser solverreset

dans l'attente (ça m'étonnerait que ça marche du 1°coup!) ;-)

Michel
Répondre à michel_m

17


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Tan, le mardi 15 juillet 2008 à 14:38:11
Remonte petit topic ^^!

Non plus serieusement, je n'ai pes encore eu le temps de tester le code que vous avez poste Michel, car j'entre dans une periode cruciale car je dois soutenir une recherche (qui n'a aucun je precise avec l'etude pour laquelle j avais besoin de la macro) a la fin du mois. J'ai juste teste sSolversolve(true) pour un faible echantillon de valeurs (10) et je dois dire que je comprends maintenant ce que vous entendiez par la lenteur d'execution de mon code tel qu'il est actuellement.

Je vous tiens au courant, en ne manquant pas de vous remercier pour la precision de vos reponses (faut que je familliarise un peu plus avec la syntaxe)

Cordialement,

Tan
Répondre à Tan

18


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jeff, le jeudi 16 octobre 2008 à 17:11:02
Coucou.
J'ai eu un problème assez similaire. J'ai fait un petit script qui fonctionne, chez moi, je vous le donne, vous verrez ce que vous pouvez en faire...

' Macro3 Macro
' Macro enregistrée le 16/10/2008 par hameje
'
Sheets("Feuil2").Select '(ma feuille de calcul était la seconde...)
SolverReset
SolverOptions MaxTime:=500 '(soyons généreux)
SolverOptions Precision:=0.00001 '(et pas trop imprécis)

For rwIndex = 5 To 504 '(j'avais un solveur à faire tourner sur deux plages de valeurs, la première étant de la ligne 5 à 504. la seconde est parrallèle à celle ci, elle n'est pas présentée ici...)
SolverOk SetCell:=Cells(rwIndex, 9), MaxMinVal:=2, ValueOf:="0", ByChange:=Cells(rwIndex, 5) '(ça, ça veux dire que la cellule à laquelle on s'interresse est la cellule I5 , puis I6, puis... puis I504, et que la cellule dont on veut changer le paramètre est la cellule E5, puis E6, puis... etc)
SolverAdd cellRef:=Cells(rwIndex, 5), relation:=3, FormulaText:=0 '(quelques conditions, ça peut etre utile)
SolverSolve UserFinish:=True '(et pas trop d'informations, j'aime pas cliquer "oui" pour rien)


Next rwIndex '(pour passer à la ligne suivante)

Sheets("Feuil1").Select '(et à la fin, retours à la première page, plus présentable que l'affreux tableau à milles lignes et milles colonnes...)


Ceci dit, c'est aussi un peu (beaucoup) grace à vous tous que j'ai réussi à faire marcher ça, alors merci à tous, et bon courage!
Répondre à jeff

19


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 michel_m, le jeudi 16 octobre 2008 à 18:42:57
Ok, merci pour cette intéressante contribution.
Bonne soirée Michel
Répondre à michel_m

Résultats pour Automatiser le solveur excel

Excel : créer un calendrier automatique (Résolu) J'ai besoin de créer un calendrier automatique dans excel: je rentre une date et les 5 prochaine s'affichent automatiquement en respectant mes critéres (5+ 5jours, + 15 jours, etc...) qlq'un a-t-il la solution? www.commentcamarche.net/forum/affich-3244626-excel-creer-un-calendrier-automatique
Filtre automatiques horizontaux (Résolu) Bonjour, On connaît tous le fonctionnement des filtres automatiques dans Excel. Mais connaîtriez-vous la façon de gérer le même principe mais attribué à des lignes plutôt qu'à des colonnes ? D'avance merci. www.commentcamarche.net/forum/affich-3652921-filtre-automatiques-horizontaux
Gérer de l'astreinte et des RTT sous excel (Résolu) Bonjour, Depuis plusieures semaines, je cherche un moyen de gérer une équipe de 8 personnes en integrand de l'astreinte ainsi que les RTT, le tout automatiquement sous excel. Avec l'aide de differentes visualisation de post different,... www.commentcamarche.net/forum/affich-5669478-gerer-de-l-astreinte-et-des-rtt-sous-excel

Résultats pour Automatiser le solveur excel

Liste déroulante avec saisie semi automatique pour EXCELC'est une procédure qui demande un investissement personnel et qui n'est pas nécessairement facile à comprendre et à réaliser dès la première fois. Afin de rendre cette astuce facile à utiliser, nous allons employer les plages et les formules... www.commentcamarche.net/faq/sujet-8288-liste-deroulante-avec-saisie-semi-automatique-pour-excel
[Excel] Colorer des cellules sur conditionsIl existe dans Excel des fonctions très pratiques mais peu connues et peu utilisées. Exemple : vous souhaitez qu'une cellule se colore automatiquement en rouge (ou autre mise en forme de police, de bordure, de trame) selon une condition : un... www.commentcamarche.net/faq/sujet-3975-excel-colorer-des-cellules-sur-conditions

Résultats pour Automatiser le solveur excel

EXCEL Opérations sur nombres (Résolu)Bonjour, Je souhaiterai faire des opérations automatiques sur excel de telle manière que chaque chiffres d'un nombre soit additionné + 1 ou +2 et aussi soustrait -1 ou -2. Exemple : Le nombre : 38461 ---> +1 ==> 49572 ---------------------------... www.commentcamarche.net/forum/affich-6300880-excel-operations-sur-nombres
Protection feuille excel (Résolu)Bonjour, j'ai un petit souci, j'ai créé une macro pour faire des calculs automatiques sous excel. Pour cela, je copie des données extérieures que je colle dans ma feuille de calcul. Pour que mes formules ne soient pas affectées, je... www.commentcamarche.net/forum/affich-4840065-protection-feuille-excel
[Excel] Couleur des cellules (Résolu)Bonjour tout le monde, J'ai du mal à mettre les cellules d'une colonne en "Forme automatique" sur Excel. J'ai beau sélectionné tout la colonne et cliqué sur "Couleur de remplissant (Automatique)" mais ça reste toujours en rouge.... www.commentcamarche.net/forum/affich-3242142-excel-couleur-des-cellules