using solver in vba
DESCRIPTION
Using Solver in VBATRANSCRIPT
-
Peltier Technical
Services, Inc.
- Custom Excel
Solutions
PTS Blog: Charts
and Things
Jon's Excel and
Charting Pages
- Jon's Charts -
Tutorials - Excel
- Site Index and
Search - RSS
www.bonavistasystems.comAds by Goooooogle
Excel Books
Books that I own and
use while developing
in Excel
Goods and Services
Excel or charting
related products and
services which I use or
feel are worthwhile
additions
Using Solver in VBA
Contents
Solver and Conventional VBA
Avoiding Solver Reference Problems
Preparing Solver for First Use
Solver Links
Solver and Conventional VBA
Solver is a powerful analysis tool, bundled with Excel and used for optimization and simulation of business
and engineering models. It can be even more powerful if used in conjunction with VBA, to automate solving of
multiple models which use different input parameters and constraints.
In a simple example, there are two factors in B5 and B6. The product (=B5*B6) is calculated in B8. Solver will
be used to find the maximum value of the target cell (the product in B8), subject to the constraint that both
factors (B5:B6) shall not exceed a value of 4. Select Solver from the Tools menu, and enter the appropriate
conditions and constraints in the Solver Parameters dialog.
Click the Solve button, and another dialog indicates whether a solution is found and offers some options.
Using Solver in VBA http://peltiertech.com/Excel/SolverVBA.html
1 de 8 19/08/2008 05:21 p.m.
-
If you record a macro while you use Solver, you will get something like the following:
Sub SolverMacro1()'' SolverMacro1 Macro' Macro recorded by Jon Peltier' SolverOk SetCell:="$B$8", MaxMinVal:=1, ValueOf:="0", ByChange:="$B$5:$B$6" SolverAdd CellRef:="$B$5:$B$6", Relation:=1, FormulaText:="4" SolverOk SetCell:="$B$8", MaxMinVal:=1, ValueOf:="0", ByChange:="$B$5:$B$6" SolverSolveEnd Sub
SolverAdd adds constraints to the Solver model. SolverOK defines the cell to optimize, how to optimize it, and
what cells to change during the Solver optimization. The macro recorder wrote this line twice, so the first
occurrence can be removed. To prevent parameters from a different Solver optimization interfering with the
macro's optimization, Solver should be reset prior to running, using SolverReset. SolverSolve has an optional
UserFinish argument; if UserFinish is False or omitted, the second dialog shown above will ask the user
whether to save the optimization, but if UserFinish is True, Solver will end without the dialog. A modified
Solver macro is shown below:
Sub SolverMacro2()'' SolverMacro2 Macro' Macro fixed up by Jon Peltier' SolverReset SolverAdd CellRef:="$B$5:$B$6", Relation:=1, FormulaText:="4" SolverOk SetCell:="$B$8", MaxMinVal:=1, ValueOf:="0", ByChange:="$B$5:$B$6" SolverSolve TrueEnd Sub
When you try to run this macro, you get a compile error. The command SolverReset is highlighted, and the
following error message appears.
In order to use a macro based on an installed add-in, you must first make sure that the add-in is installed,
then you must set a reference to the add-in in the workbook containing the code that calls the add-in's
procedures.
To install an add-in, on Excel's Tools menu, choose Add-Ins. If the add-in is shown on the list, check the box
in front of its name. If the add-in is not found, click Browse, navigate to the add-in file*, then when it appears
Using Solver in VBA http://peltiertech.com/Excel/SolverVBA.html
2 de 8 19/08/2008 05:21 p.m.
-
on the add-in list, check its checkbox. Solver was already installed, or we would not have been able to record
a macro using it.
*Depending on your Office and Windows versions, the default Excel add-ins library is "C:\Program
Files\Microsoft Office\OFFICE11\Library" or "C:\Documents and Settings\{username}\Application
Data\Microsoft\AddIns". By default in Excel 2003, Solver is located in "C:\Program Files\Microsoft
Office\OFFICE11\Library\SOLVER".
To set a reference to an add-in, it must first be installed. Then on the VB Editor's Tools menu, select
References. This lists all open workbooks and installed add-ins, as well as a huge list of resources installed on
the host computer. Find the add-in in the list, and check the box in front of its name.
Using Solver in VBA http://peltiertech.com/Excel/SolverVBA.html
3 de 8 19/08/2008 05:21 p.m.
-
With a reference set to Solver, SolverMacro2
will run as expected. In addition, the Solver
library will be accessible through the VB
Editor's Object Browser (right), and you will
have the benefit of Intellisense (below) while
editing code that uses members of the Solver
library.
Using Solver in VBA http://peltiertech.com/Excel/SolverVBA.html
4 de 8 19/08/2008 05:21 p.m.
-
Avoiding Solver Reference Problems
The code you write to run Solver will work on your computer, and on any computer with the same versions of
Excel and Solver. In fact, it should work on any computer that has later versions of Excel and Solver. If you
want to distribute your workbook with VBA code written for Solver, you should write the code using the
earliest expected version of Excel (e.g., Excel 2000), so it will work on all versions that users may have
installed (e.g., Excel 2000, 2002, and 2003). When the workbook is first opened on a given computer, it finds
the references resources, or more recent versions if available.
This sounds easy, but sometimes it isn't. Perhaps you developed a workbook in Excel 2003 for your
department to use, but you have to send it to a supplier, and the supplier hasn't upgraded past Excel 2000. Or
perhaps the workbook must be shared amongst a group of users who have different versions of Excel and
Solver installed. In these cases, a computer with an earlier version of Solver installed will choke on the
reference to a later version of Solver.
It is possible, of course, to install add-ins and set references using VBA. This can be tricky, and in Microsoft
Office 2002 and later, the user has to grant permission for VBA code to access any VB projects. Without this
permission, references to installed components cannot be set.
To avoid issues with installing add-ins and setting references to various resources, your code can be modified
so that it is called using Application.Run. Without a reference to the add-in, you lose IntelliSense and the
Object Browser, and your code suffers from a small (probably imperceptible) performance penalty. However,
you gain simpler, more reliable execution. The syntax is straightforward: Application.Run is followed by the
procedure name in double quotes, followed by a comma separated list of arguments being passed to the
procedure:
Application.Run "SubName", Argument1, Argument2,...
If Application.Run is used to return the calculated result of a function, the syntax is slightly different, with a
variable set equal to Application.Run, with the procedure and arguments enclosed within parentheses:
MyVariable = Application.Run("Function", Argument1, Argument2,...)
The SolverMacro2 procedure above is easily modified to use Application.Run:
Sub SolverMacro3()'' SolverMacro3 Macro' Macro fixed up by Jon Peltier' Edited to use Application.Run to avoid reference problems' Application.Run "SolverReset" Application.Run "SolverAdd", "$B$5:$B$6", 1, "4" Application.Run "SolverOk", "$B$8", 1, "0", "$B$5:$B$6" Application.Run "SolverSolve", TrueEnd Sub
A more general version of a Solver procedure is shown below. This includes more informative comments, and
it provides a notice to the user about the success of the Solver optimization.
Sub RunSolver() '' Adjusted for Application.Run() to avoid Reference problems with Solver '' Peltier Technical Services, Inc., Copyright 2007. All rights reserved.
Using Solver in VBA http://peltiertech.com/Excel/SolverVBA.html
5 de 8 19/08/2008 05:21 p.m.
-
' reset Application.Run "Solver.xla!SolverReset"
' set up new analysis Application.Run "Solver.xla!SolverOk", "Blah1", 1, , "BlahBlah1"
' add constraints Application.Run "Solver.xla!SolverAdd", "Blah2", 3, 0 Application.Run "Solver.xla!SolverAdd", "Blah3", 2, "BlahBlah3"
' run the analysis Result = Application.Run("Solver.xla!SolverSolve", True)
' finish the analysis Application.Run "Solver.xla!SolverFinish"
' report on success of analysis If Result
-
If Not bSolverInstalled Then ' (re)install Solver Application.AddIns("Solver Add-In").Installed = True ' check whether Solver is installed (should be true) bSolverInstalled = Application.AddIns("Solver Add-In").Installed End If
If Not bSolverInstalled Then MsgBox "Solver not found. This workbook will not work.", vbCritical CheckSolver = False End If
If CheckSolver Then ' initialize Solver Application.Run "Solver.xla!Solver.Solver2.Auto_open" End If
On Error GoTo 0
End Function
Solver Links
Frontline Systems
Frontline Systems has developed Solver add-ins for Excel and other applications. The standard Excel Solver
add-in can be upgraded to a premium Solver version or to other specialized Solvers, and there are versions
for use with other programming platforms. While the capabilities of Solver are very extensive, the online
documentation is somewhat sparse.
Solver Tutorial
Standard Excel Solver
Optimization Solutions with the Microsoft Excel Solver (examples)
Controlling the Solver with VBA
Microsoft
Solver (list of articles about Solver and Excel 2003)
Introduction to optimization with the Excel (2003) Solver tool
How to create Visual Basic macros by using Excel Solver in Excel 97
Perform What-If Analysis with the Excel 2007 Solver Tool
Around the Web
Microsoft Excel Solver add-in Examples (Vertex42)
Teaching Linear Programming using Microsoft Excel Solver
Using Solver for LP Problems
Solving a Linear Program Using the Excel Solver
www.bonavistasystems.com Feedback - Ads by Google
PTS Blog
Radar-XY Combination Chart
19 Aug 2008
In Plot your data around the clock, Chandoo proposed a complicated bubble chart to show website
traffic vs. time of day. I thought it was daring of Chandoo to try such a unique treatment of the
data, but I found the bubbles difficult to interpret, and it was distracting
Time is on My Side
18 Aug 2008
Chandoo saw a post at Smashing Magazine showing Top 10 creative ways to display time, and he
took a crack at duplicating a polar clock using an Excel donut chart. Chandoo did a fine job with his
copy of Pixel Breakers Polar Clock, though the style itself is tricky
Rolling Wheel Animation
Using Solver in VBA http://peltiertech.com/Excel/SolverVBA.html
7 de 8 19/08/2008 05:21 p.m.
-
17 Aug 2008
A college science professor named Roger Blickensderfer wrote to me about an animation he was
working on. He wanted to trace the path followed by a point on the rim of a rolling wheel. Roger had
cobbled something together, and I fiddled with it, and it kind of worked.
Peltier Technical Services, Inc.We can customize or automate any example from this site, or build a new one for you. Todiscuss your project or obtain a quote, please contact me at [email protected]
PTS Blog: Charts and Things
Jon's Excel and Charting Pages - Jon's Charts - Tutorials - Excel - Site Index and Search - RSS
Peltier Technical Services, Inc., Copyright 2008. All rights reserved.You may link to this article or portions of it on your site, but copying is prohibited without permission of PeltierTechnical Services.
Microsoft Most Valuable
Professional
My MVP Profile
Using Solver in VBA http://peltiertech.com/Excel/SolverVBA.html
8 de 8 19/08/2008 05:21 p.m.