Home » excel » Excel Solver VBA won't let one cell be bounded by two constraints (min and max)

Excel Solver VBA won't let one cell be bounded by two constraints (min and max)

Posted by: admin April 23, 2020 Leave a comment

Questions:

I am trying to solve an optimization problem where one of the input variables must be bounded by a minimum and a maximum constraint. Because I don’t run SolverReset at the end, I can tell afterwards that Solver is ignoring the third constraint ($F$5 <= 1). I can also tell because sometimes it gives me an answer where $F$5 > 1.

When I use Solver manually I’m able to add in the third constraint. I’ve tried recording the macro to see what I’m missing, but I’m still stumped. I’m running Excel 2007. Any ideas? Thanks,

Public Sub SEDMSolver()

SolverReset
SolverAdd CellRef:="$F$5", Relation:=3, FormulaText:="0.1"
SolverAdd CellRef:="$F$4", Relation:=3, FormulaText:="0"
SolverAdd CellRef:="$F$5", Relation:=1, FormulaText:="1"
SolverOk SetCell:="$G$8", MaxMinVal:=2, ValueOf:="0", ByChange:="$F$4:$F$5"
SolverSolve userFinish:=True

End Sub
How to&Answers:

Solver can be a bit fluky. Try setting your MaxMinVal=2 line above the first. When I run solver macros, I always have to set that above the constraints. Occasionally it will throw errors.

I tried to replicate your issue (using excel 2010), but it works for me. With the MxMinVal at the beginning and end. You could try restarting your machine and excel and see if the issue remains. But your code does work for me, all three constraints load.

Another general suggestion I would have for your code is to add:

Application.Calculation = xlAutomatic  

This will turn the calculations to automatic. I have had it get turned off while running more complex macros involving solver.

Answer:

Set some cell (e.g H9) to 1 and use reference to this cell in a code.
SolverAdd CellRef:=”$F$5″, Relation:=1, FormulaText:=”$H$9″

Answer:

From my experience using solver and trying to automate it with VBA, the best solution is to not automate Excel’s sorver but write your own iteration to solve for your target.
for example

 For j = 1 To 100
 result = someCalculation
        If result > minConstraint Then
           result = j - 1
           Exit For
        Else
        End If
 Next j