8
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.com Ads 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.

Using Solver in VBA

Embed Size (px)

DESCRIPTION

Using Solver in VBA

Citation preview

  • 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.