IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Solver VBA_Macro si convergence


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut Solver VBA_Macro si convergence
    Bonsoir,

    Je sollicite une aide s'il-vous plait pour savoir juste si il était possible de définir une action selon le résultat d'une fenêtre Solver. Je veux dire que si le Solver trouve une solution alors VBA exécute une macro juste derrière, si il ne converge pas alors une autre macro... J'ai bien essayé d'appliquer des mises en forme avec un V à côté des cellules étant dans les conditions du Solver (si conditions validées), un X si conditions non validées et ensuite de dire que si il n'y a que des V dans les cases alors on fait la macro suivante mais c'est pas très pro et en plus certaines des cellules appelées dans le solveur sont cachées pour pas qu'on voit les étapes de calcul .

    J'aimerais donc trouver un moyen de dire à Excel que si la fenêtre "Le solveur n'a pas trouvé de solution..." apparaît alors macro1, si la fenêtre "Le solveur a trouvé..." alors macro2.
    J'ai rien trouvé la dessus sauf la commande UserFinish mais qui elle me permet uniquement de valider la fenêtre.

    Merci d'avance pour toute réponse éventuelle.

    Bonne soirée,
    Cdlt.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 271
    Par défaut
    Bonjour,

    Peux-tu me dire ce que te renvois le solver quand "il ne trouve pas se solution".

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    Alors si il ne converge pas il renvoie

    Nom : Capture.PNG
Affichages : 982
Taille : 26,5 Ko

    Si il converge il renvoie

    Nom : Capture2.PNG
Affichages : 962
Taille : 29,0 Ko

  4. #4
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 271
    Par défaut
    Regardes ce liens,

    http://msdn.microsoft.com/fr-fr/libr...ffice.15).aspx

    Si tu affiches le résultat dans une cellule tu as un #N/A dans le cas où il n'y a pas de solution?

    Regardes le code que te renvois l'enregistreur de macro en cas de solution non trouvée.

    Si il te renvois une référence, tu peux l'utiliser dans un if.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    Tout d'abord merci pour les réponses.

    Je vois où tu veux en venir mais je ne sais pas trop comment faire pour renvoyer la réponse du solveur en fait. Sur le lien que tu m'as donné il y a un truc super interressant (exactement ce que je cherche), c'est le renvoi du chiffre entre 0 et 20.

    Je souhaiterais en fait executer une maccro si le chiffre renvoyé est 5 "Le Solveur ne peut pas trouver de solution réalisable." ou si c'est 0 "Le solveur a trouvé une solution.Tous les contraintes et les conditions d'optimalité sont respectées." ou 1 "Le solveur a convergé à la solution actuelle.Tous les contraintes sont satisfaites."

    Mais comment accéder à ce chiffre ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 271
    Par défaut
    Mais comment accéder à ce chiffre ?
    Pour moi le plus simple c'est l'enregistreur de macro.

    Tu fais ta procédures "à la main" pour un cas où tu es certains de ne pas avoir de solution. Après tu regardes dans ta macro ce que ça donne et tu récupères la partie qui t'intéresse.

    Sinon poste le code complet et je regarderai.

  7. #7
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    je te recommande un peu de lecture
    http://jpcheck.developpez.com/tutori...ur-sous-excel/
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    Citation Envoyé par had4789 Voir le message
    Pour moi le plus simple c'est l'enregistreur de macro.

    Tu fais ta procédures "à la main" pour un cas où tu es certains de ne pas avoir de solution. Après tu regardes dans ta macro ce que ça donne et tu récupères la partie qui t'intéresse.

    Sinon poste le code complet et je regarderai.
    Alors voilà j'ai fais un petit code très basique et rapide juste pour illustrer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Test()
     
        SolverReset
     
        SolverOk SetCell:="$D$4", MaxMinVal:=2, ValueOf:=0, ByChange:="$D$4", Engine:=1 _
            , EngineDesc:="GRG Nonlinear"
     
        SolverAdd CellRef:="$D$4", Relation:=3, FormulaText:="$D$5"
        SolverAdd CellRef:="$D$4", Relation:=1, FormulaText:="$D$6"
        SolverAdd CellRef:="$D$7", Relation:=1, FormulaText:="$D$6"
     
        SolverSolve
     
    End Sub
    En gros, trouver D4 min tel que D4>= D5, D4<=D6 et D7<=D6. Donc ça marche si D6>2*D4 sinon ça marche pas.

    Comme j'ai en réalité beaucoup de conditions avec des solvers qui se succèdent, j'aimerais dire que si le solver ne trouve pas de solution alors on sort de la macro et on met par exemple une MsgBox où un truc du genre quoi.

    Ci-joint le fichier:

    Solver.rar

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    Citation Envoyé par jpcheck Voir le message
    Salut,

    je te recommande un peu de lecture
    http://jpcheck.developpez.com/tutori...ur-sous-excel/
    C'est de là que je me suis inspiré Bon comme je ne suis pas non plus un pro du VBA, je me suis peu-être tout simplement mal inspiré aussi c'est probable...

    Bon après si c'est un truc trop long ne vous embêtez pas, j'ai réussis à planquer les conditions dans une feuille cachée et si elles sont valides ça renvoie un message ^^. C'est sûr c'est pas du gros code mais ça fait l'affaire en attendant.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 271
    Par défaut
    Quand ça ne marche pas tu as quoi dans ta cellule D4?

    Essais ça;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    On Error GoTo Sortie
     
     
     
        SolverReset
     
        SolverOk SetCell:="$D$4", MaxMinVal:=2, ValueOf:=0, ByChange:="$D$4", Engine:=1 _
            , EngineDesc:="GRG Nonlinear"
     
        SolverAdd CellRef:="$D$4", Relation:=3, FormulaText:="$D$5"
        SolverAdd CellRef:="$D$4", Relation:=1, FormulaText:="$D$6"
        SolverAdd CellRef:="$D$7", Relation:=1, FormulaText:="$D$6"
     
        SolverSolve
     
    Sortie:
        If Err = 9 Then Exit Sub
    Je parts du principe que le fait qu'il n'y ai pas de résultat possible est une erreur de type 9 alors on sort du sub.

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    Ca marche pas. J'ai essayé aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    On Error GoTo Sortie
     
     
     
        SolverReset
     
        SolverOk SetCell:="$D$4", MaxMinVal:=2, ValueOf:=0, ByChange:="$D$4", Engine:=1 _
            , EngineDesc:="GRG Nonlinear"
     
        SolverAdd CellRef:="$D$4", Relation:=3, FormulaText:="$D$5"
        SolverAdd CellRef:="$D$4", Relation:=1, FormulaText:="$D$6"
        SolverAdd CellRef:="$D$7", Relation:=1, FormulaText:="$D$6"
     
        SolverSolve
     
    Sortie:
        If Err = 5 Then MsgBox "error5"
    en faisant exprès pour qu'il trouve "Le solveur ne peut pas trouver de solution réalisable" mais ça marche pas non plus.

    A mon avis cela vient du fait qu'il ne considère pas comme erreur l'action de ne pas converger. Et quand ça amrche pas alors il laisse la valeur mini c'est à dire 3 dans mon cas.

  12. #12
    Membre chevronné
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Par défaut
    bonjour,

    alors pourquoi ne pas dire que si la valeur renvoyée est la valeur mini (3) alors on sort de la sub

    peut être cela a déjà été essayé?

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    En fait là c'est un petit fichier d'exemple simplifié mais en vrai j'ai énormément de conditions dans mon solveur et j'ai exactement 6 solveurs qui se suivent. Je dois avant d'autoriser le passage au solveur suivant m'assurer que le précédent a bien trouvé une solution sinon dire de quitter la maccro des solveurs et envoyer un message en disant "Le solveur ne peut pas converger, veuillez vérifier vos entrées... blablabla".

  14. #14
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    En fait, si tu passes par des Application.Run, ton Resultat pourra avoir 4 valeurs principales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      ' code en amont
      Result = Application.Run("Solver.xla!SolverSolve", True)
     
      ' Fin du processus
      Application.Run "Solver.xla!SolverFinish"
     
      ' rapport sur le succès de l'analyse
      If Result <= 3 Then
        ' Result = 0, la solution trouvée, optimalité et contraintes satisfaites 
        ' Result = 1, convergent, les contraintes satisfaites 
        ' Result = 2, ne peuvent pas améliorer le résultat, contraintes satisfaites 
        ' Result = 3, Arrêté à itérations maximales
    D'une manière générale, SolverSolve donne les résultats suivants (en anglais, les valeurs 0 à 3 donnant un résultat suffisant pour être considéré comme valable) :
    0 Solver found a solution. All constraints and optimality conditions are satisfied.
    1 Solver has converged to the current solution. All constraints are satisfied.
    2 Solver cannot improve the current solution. All constraints are satisfied.
    3 Stop chosen when the maximum iteration limit was reached.
    4 The Set Cell values do not converge.
    5 Solver could not find a feasible solution.
    6 Solver stopped at user's request.
    7 The conditions for Assume Linear Model are not satisfied.
    8 The problem is too large for Solver to handle.
    9 Solver encountered an error value in a target or constraint cell.
    10 Stop chosen when maximum time limit was reached.
    11 There is not enough memory available to solve the problem.
    12 Another Excel instance is using SOLVER.DLL. Try again later.
    13 Error in model. Please verify that all cells and constraints are valid.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    Comme cela ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub Test()
     
    Dim Result As Integer
     
        SolverReset
     
        SolverOk SetCell:="$D$4", MaxMinVal:=2, ValueOf:=0, ByChange:="$D$4", Engine:=1 _
            , EngineDesc:="GRG Nonlinear"
     
        SolverAdd CellRef:="$D$4", Relation:=3, FormulaText:="$D$5"
        SolverAdd CellRef:="$D$4", Relation:=1, FormulaText:="$D$6"
        SolverAdd CellRef:="$D$7", Relation:=1, FormulaText:="$D$6"
     
    ' code en amont
      Result = Application.Run("Solver.xla!SolverSolve", True)
     
      ' Fin du processus
      Application.Run "Solver.xla!SolverFinish"
     
      ' rapport sur le succès de l'analyse
      If Result <= 3 Then MsgBox "ok ça marche"
     
    End Sub
    C'est bon ça marche !!! Merci encore, au début ça déconnait mais c'était de ma faute car mon solveur est .xlam et non .xla ^^. MErci à tous pour votre aide et désolé du dérangement.

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Tu as aussi la fonction solverfinish() qui peut servir.
    Résolu mais je met quand même l'adresse. C'est le site de l'éditeur du solver, on trouve des choses intéressantes.
    http://www.solver.com/content/basic-...inish-function

    eric

  17. #17
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 53
    Par défaut
    Bon même si le problème est résolu, je post des fois que ça intéresse un jour quelqu'un. Je suis arrivé (en trifouillant un peu au piff j'avoue) à la solution la plus simple du monde

    Il suffit de taper le nom que l'on veut donner à la variable juste avant "SolverSolve". Sur le code de base il suffit de remplacer par exemple "Valeur = SolverSolve" au lieu du simple "SoverSolve" de base. Merci encore à tous pour vos conseils sans quoi je ne serais pas arrivé là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Test()
     
        SolverReset
     
        SolverOk SetCell:="$D$4", MaxMinVal:=2, ValueOf:=0, ByChange:="$D$4", Engine:=1 _
            , EngineDesc:="GRG Nonlinear"
     
        SolverAdd CellRef:="$D$4", Relation:=3, FormulaText:="$D$5"
        SolverAdd CellRef:="$D$4", Relation:=1, FormulaText:="$D$6"
        SolverAdd CellRef:="$D$7", Relation:=1, FormulaText:="$D$6"
     
        Valeur= SolverSolve 
    
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C] Solver Sudoku
    Par AuraHxC dans le forum C
    Réponses: 1
    Dernier message: 03/01/2007, 15h28
  2. Réponses: 54
    Dernier message: 18/10/2006, 19h08
  3. Réponses: 5
    Dernier message: 30/11/2005, 11h54
  4. Convergence d'une série
    Par j.p.mignot dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 24/11/2005, 19h27
  5. [VB6] Utiliser le solver d'Excel
    Par Peltchag dans le forum VB 6 et antérieur
    Réponses: 30
    Dernier message: 04/11/2005, 17h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo