’*** ソルバーがインストールされているか、ロードされているか ***
'ソルバーインストールされているか、されていればパス名を得る
With Application.AddIns
For i = 1 To .Count
If .Item(i).Name = "SOLVER.XLA" Then
If Len(.Item(i).FullName) > 10 Then 'ソルバーインストールされている
Solver_Inst = True
If AddIns("ソルバー アドイン").Installed = True Then 'ソルバー・ロードされている
Solver_Road = True
Solver_FullName = .Item(i).FullName
End If
Exit For
End If
End If
Next i
End With
'ソルバーインストールされているか、されていればパス名を得る
With Application.AddIns
For i = 1 To .Count
If .Item(i).Name = "solver.xla" Then
If Len(.Item(i).FullName) > 10 Then 'ソルバーインストールされている
Solver_Inst = True
If AddIns("ソルバー アドイン").Installed = True Then 'ソルバー・ロードされている
Solver_Road = True
Solver_FullName = .Item(i).FullName
End If
Exit For
End If
End If
Next i
End With
*** ソルバーの実行の前には ****
1)Editor の「ツール」−「参照設定」で 「SOLVER」にチェックを入れる
2)エクセルメニューの「ツール」−「アドイン」で「ソルバーアドイン」にチェックを入れる
(ヘルプの説明)
この関数を使う前に、ソルバー アドインへの参照を設定しておいてください。Visual
Basic モジュールをアクティブにした状態で、[ツール] メニューの [参照設定]
をクリックし、[参照可能なライブラリ ファイル] の [Solver.xla] チェック
ボックスをオンにします。このチェック ボックスが [参照可能なライブラリ ファイル]
に表示されない場合は、[参照] をクリックしてから、Office をセットアップしたフォルダの
\Office\Library にある Solver.xla を開きます。
*** ソルバーの実行 ***
Application.Run "'" & Solver_FullName & "'!SolverReset"
Application.Run "'" & Solver_FullName & "'!SolverOk", "$C$24", 2, "0", "$C$17:$C$23"
Application.Run "'" & Solver_FullName & "'!SolverOptions", 32767, 32767, 0.000001, _
False, False, 1, 2, 1, 5, True, 0.0001, False
Application.Run "'" & Solver_FullName & "'!SolverAdd", "$C$17", 3, "0"
Application.Run "'" & Solver_FullName & "'!SolverAdd", "$C$18", 3, "0"
Application.Run "'" & Solver_FullName & "'!SolverOk", "$C$24", 2, "0", "$C$17:$C$23"
Application.Run "'" & Solver_FullName & "'!SolverSolve", True
以下、ヘルプからの引用です。
*** SolverOk(SetCell, MaxMinVal, ValueOf, ByChange) ***
SetCell 省略可能です。バリアント型 (Variant) の値を使用します。作業中のワークシートの単一セルへの参照を指定します。[ソルバー : パラメータ設定] ダイアログ ボックスの [目的セル] ボックスに相当します。
MaxMinVal 省略可能です。バリアント型 (Variant) の値を使用します。[ソルバー : パラメータ設定] ダイアログ ボックスの [最大値]、[最小値]、[値] に相当します。次に示す値のいずれかを指定してください。
値 設定
1 最大値
2 最小値
3 値と一致
ValueOf 省略可能です。バリアント型 (Variant) の値を使用します。引数 MaxMinVal に 3 を指定した場合は、目的セルの値の目標値を必ず指定してください。
ByChange 省略可能です。バリアント型 (Variant) の値を使用します。目的セルの値が目標値に到達するまで変化させる、セルまたはセル範囲への参照を指定します。[ソルバー : パラメータ設定] ダイアログ ボックスの [変化させるセル] に相当します。
*** SolverOptions(MaxTime, Iterations, Precision, AssumeLinear, StepThru, Estimates, Derivatives,
Search, IntTolerance, Scaling, Convergence, AssumeNonNeg)
***
MaxTime 省略可能です。バリアント型 (Variant) の値を使用します。問題を解決するのに使う時間の制限を秒単位で指定します。値は必ず正の整数にします。一般的で小規模な問題に適した値として、100 秒が標準設定になっていますが、最大で 32,767 秒まで指定できます。
Iterations 省略可能です。バリアント型 (Variant) の値を使用します。問題を解決するのに行う試行の最大反復回数を指定します。値は必ず正の整数にします。一般的で小規模な問題に適した値として、100 回が既定の標準設定になっていますが、最大で 32,767 回まで指定できます。
Precision 省略可能です。バリアント型 (Variant) の値を使用します。問題を解決するときの精度に使用できる範囲は、小数値で 0 〜 1 です。既定の標準の設定は、0.000001 です。たとえば、0.0001 など、小数点以下の桁数を少なく設定すると、精度は低くなります。一般的には、指定する精度が高い (数値が小さい) ほど、解決に到達するまでの時間が長くなります。
AssumeLinear 省略可能です。バリアント型 (Variant) の値を使用します。True を指定すると、問題のモデルの関係が線形であると仮定して計算が行われるので、解決の速度を向上させることができます。ただし、True を指定できるのは、モデルのすべての関係が線形である場合にのみです。既定値は False です。
StepThru 省略可能です。バリアント型 (Variant) の値を使用します。True を指定すると、1 回試行が行われるごとにソルバーが停止します。停止されるたびにマクロを実行させることができ、実行させるマクロは SolverSolve 関数の引数 ShowRef で指定します。False を指定すると、試行は連続して行われます。既定値は False です。
Estimates 省略可能です。バリアント型 (Variant) の値を使用します。一次探索ごとに変化する基本変数の初期推定値を取得するための方法を指定します。1 を指定すると一次式、2 を指定すると二次式が設定されます。一次式による方法では正接ベクトルによる線形外挿法が使われ、二次式による方法では二次外挿法が使われます。既定値は 1 (一次式) です。
Derivatives 省略可能です。バリアント型 (Variant) の値を使用します。目的関数と制約条件の偏導関数を試算する方法として、前進差分または中央差分を指定します。1 を指定すると前進差分、2 を指定すると中央差分が設定されます。中央差分を指定すると、ワークシートの再計算の回数は多くなりますが、"これ以上、解の精度を上げることはできません。" というメッセージが表示されるような問題に対しては有効な場合があります。問題の関数が、グラフ化した場合に滑らかで連続的な線を描かないときには、中央差分を使ってください。標準の設定は前進差分です。既定値は 1 (前進差分) です。
Search 省略可能です。バリアント型 (Variant) の値を使用します。試行を繰り返すときに使われる、探索方向を決めるための方法を指定します。1 を指定すると準ニュートン法、2 を指定すると共役傾斜法が設定されます。標準の設定は準ニュートン法です。準ニュートン法の場合、通常では共役傾斜法よりも多くのメモリが必要ですが、より少ない反復計算で解を求めることができます。また、共役傾斜法の場合、通常では準ニュートン法よりも少ないメモリで解を求めることができますが、精度をよくするためにより多くの反復計算が必要です。大規模な問題を探索するときに、メモリが十分ではない場合は共役傾斜法を使います。共役傾斜法は、繰り返される試行をたどってみると、実行可能な解の間をゆるやかに変化していくようになっている場合に特に有効です。
IntTolerance 省略可能です。バリアント型 (Variant) の値を使用します。問題のいずれかの要素に整数の制限が設定されているときの最適解の誤差の許容範囲は、小数値で 0 〜 1 です。この引数は、制約条件で整数の制限が設定されている場合にのみ有効です。値を大きくすると、問題解決にかかる時間は短くなります。
Scaling 省略可能です。バリアント型 (Variant) の値を使用します。問題で単位が数桁違う数値を扱うとき、計算が行われている間は桁数を自動的に調節する場合は、True を指定します。この設定は、入力 ([ソルバー : パラメータ設定] ダイアログ ボックスの [変化させるセル]) と、出力 ([ソルバー : パラメータ設定] ダイアログ ボックスの [目的セル] と [制約条件]) の大きさにかなりの差がある場合、たとえば、億単位の投資についての最大の利益をパーセント単位で求めるときなどに有効です。単位の調整を行わない場合は、False を指定します。既定値は False です。
Convergence 省略可能です。バリアント型 (Variant) の値を使用します。非線型ソルバーの収束の許容限度の度合いを 0 (ゼロ) から 1 までの小数値で指定します。目的セルの値の相対的な変化量が、直前の 5 回の反復計算でこの収束値よりも小さいとき、ソルバーが停止され、"解が見つかりました。制約条件は満たされました。" というメッセージが表示されます。
AssumeNonNeg 省略可能です。バリアント型 (Variant) の値を使用します。[制約条件] ボックスに下限が設定されていない場合、すべての順応できる (変化させる) セルの下限を 0 (ゼロ) に設定するには、True を指定します。この場合、セルに含まれている値は正の値である必要があります。[制約条件] ボックスに指定された限度だけをソルバーで使用するには、False を指定します。
*** SolverAdd(CellRef, Relation, FormulaText) ***
CellRef 必ず指定します。バリアント型 (Variant) の値を使用します。制約条件を設定する値が入力されているセルまたはセル範囲への参照を指定します。
Relation 必ず指定します。整数型 (Integer) の値を使用します。次に示す制約条件式の左辺と右辺の比較関係を表す値のいずれかを指定してください。4 または 5 を指定すると、引数 CellRef のセルは必ず変更に適応できる値にします。その場合、引数 FormulaText には何も指定しません。
値 比較関係
1 <=
2 =
3 >=
4 引数 CellRef が参照するセルの値を整数に制約する。
5 引数 CellRef が参照するセルの値を 0 (ゼロ) または 1 に制約する。
FormulaText 省略可能です。バリアント型 (Variant) の値を使用します。制約条件式の右辺の値を指定します。
*** SolverSolve(UserFinish, ShowRef) ***
ソルバーの実行
UserFinish 省略可能です。バリアント型 (Variant) の値を使用します。True を指定すると、[ソルバー : 探索結果] ダイアログ ボックスを表示せずに結果を返します。False を指定するか省略すると、結果を返し、[ソルバー : 探索結果] ダイアログ ボックスを表示します。
ShowRef 省略可能です。バリアント型 (Variant) の値を使用します。SolverOptions 関数の引数 StepThru が True の場合にのみ有効です。引数 ShowRef には、マクロ名を文字列として指定します。ソルバーが試行を 1 回行うごとに、指定したマクロが実行されます。