
多くの変数がある中での最大最小値計算にソルバーを利用しています.
各変数およびその制約条件が縦に並び,数字違いが横に並んでいます.
1 列毎に最大値・最小値を計算したいのですが,ソルバーですと 1 条件毎 (1 列毎) に条件をハンドで入れ直さねばならないですよね...
そこでユーザー定義関数内にソルバーを組み込み,各変数とその制約条件はユーザー関数の引数として指定という形にして,行全体に数式をコピーすれば結果を求められるようにしたいです.
VBA は全くの素人で,まずは簡単なものでと思い以下のようなユーザー定義関数を作成しましたが,エラーこそ出ないものの変数セル (D6, D7) が初期値のままで全く変化しません (ソルバーが動作している気配無し,関数の戻り値も初期値によって計算された値).
何が問題かアドバイスをお願いします.
------------------------------------------------------------------------------
Function Test1(Target As Range) As Double
SolverReset
SolverAdd CellRef:="$D$6", Relation:=1, FormulaText:="$D$2"
SolverAdd CellRef:="$D$6", Relation:=3, FormulaText:="$D$3"
SolverAdd CellRef:="$D$7", Relation:=1, FormulaText:="$D$4"
SolverAdd CellRef:="$D$7", Relation:=3, FormulaText:="$D$5"
SolverOk SetCell:=Target.Address, MaxMinVal:=1, ValueOf:=0, ByChange:="$D$6:$D$7", Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve UserFinish:=True
SolverFinish KeepFinal:=1
Test1 = Target.Value
End Function
------------------------------------------------------------------------------
D9 セルにこのユーザー定義関数を入力 (=Test1(D10)),
D10 セルには D6, D7 を使用した数式が入っています.
No.1ベストアンサー
- 回答日時:
こんにちは
ソルバーは利用していないので、推測での回答になってしまいますが・・
「ユーザ定義関数」の場合、(ソルバーに限らず)他のセルの値を変更することはできないように制限がかけられています。
(シート関数は基本的に、設定されたセルに値を返すものなので・・)
ソルバーの場合、直接には値を変更してはいませんけれど、間接的に値を変更することになるので、(多分)実行を停止しているのではないかと推測します。
(VBAのエラーにはならないようですが・・)
試しに、ご提示のコードはそのままで、以下のマクロを実行すると結果が得られませんか?
(ご提示のコードに誤りがないことが条件になります)
Sub Test1Test()
Range("D9").Value = Test1(Range("D10"))
End Sub
もしも結果が得られるようであるなら、上記の推測が原因と考えられます。
対策としては、「ユーザ定義関数」を諦めて、通常のマクロから実行するということになると思われます。
もしも、関数のように即時に結果が反映されることをお望みであるなら、シートのChangeイベントなどで、条件となるセルの変更を検知して実行するような仕組みにしておけば、ほぼ同様の効果を得られるのではないかと推測します。
ただし、ソルバーの場合、セルの値がいろいろ変化するので、イベントの制御をきちんと行わないと危険ですけれど。
余談ですが・・
はっきりとはしませんが、条件設定の際に、順序が影響するような感じがします。
SolverOk よりも前に、SolverAdd で Relation:=4 を設定すると、その条件だけ無視されるということがテストしていて発生し、はまりました。
(ByChange のセル範囲を整数に指定しようとしたのですが・・)
同じセルに対する、他の数式での条件はちゃんと設定できるのですが。
あまり、いろいろと試したわけではないのでハッキリとはしませんけれど、上記に関しては順序を変えることで解決しました。
ご回答ありがとうございます!
まさにご指摘の通りで、ご提示いただいたマクロを走らせたところ意図通りにソルバーが動作しました。根本的な制約を理解できていませんでした。。
別のやり方を考えようと思います。自分ではなかなか解決に至りそうになかったので助かりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- Excel(エクセル) エクセルの自動更新のタイミングについて 1 2022/07/20 16:12
- Excel(エクセル) 条件付き書式を使ってユーザー定義。「数字のみ」も「数字+アルファベット」も認識させたい。 2 2022/05/28 07:22
- Visual Basic(VBA) ExcelのVBAを使い、複数シートの同一箇所を、同一条件にて一括でソルバーを回す方法について 1 2022/04/23 11:49
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Excel(エクセル) Application.Volatile利用(excel2003) 1 2023/02/06 10:11
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
- Excel(エクセル) EXCEL値貼り付け(ある条件のもと自動化) 5 2023/06/06 12:21
このQ&Aを見た人はこんなQ&Aも見ています
-
変化させるセルが変化しない
Visual Basic(VBA)
-
excelのソルバーをVBAで複数行繰り返したい
Excel(エクセル)
-
エクセルのソルバー関数について!
Excel(エクセル)
-
-
4
【Excel】マクロにソルバーを組み込んだ時の対処方法
Excel(エクセル)
-
5
エクセル ソルバー セル参照をVBAで
Excel(エクセル)
-
6
EXCELのマクロが回してる途中から遅くなり、困っています
Excel(エクセル)
-
7
ExcelのVBAを使い、複数シートの同一箇所を、同一条件にて一括でソルバーを回す方法について
Visual Basic(VBA)
-
8
エクセルの主軸と第2軸の0を合わせて表示したい
Windows Me・NT・2000
-
9
VBAでソルバーが実行出来ない
Word(ワード)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCOPYを繰り返すと、処理が...
-
【マクロ】オートフィルター を...
-
Vba Array関数について教えてく...
-
算術演算子「¥」の意味について
-
ワードの図形にマクロを登録で...
-
【マクロ】並び替えの範囲が、...
-
vbsでのwebフォームへの入力制限?
-
質問58753 このコードでうまく...
-
【マクロ】開いているブックの...
-
Vba セルの4辺について罫線が有...
-
エクセルのマクロについて教え...
-
エクセルの改行について
-
改行文字「vbCrLf」とは
-
Vba FileSystemObject オブジェ...
-
ダブルクリックで貼り付けた画...
-
VBAの質問(Msgboxについて)です
-
VBAの「To」という語句について
-
VBAでFOR NEXT分を Application...
-
VBAで特定の文字が入った行をコ...
-
VBAでセルの書式を変えずに文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
-
【ExcelVBA】5万行以上のデー...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
【マクロ】並び替えの範囲が、...
-
エクセルの改行について
-
エクセルのマクロについて教え...
-
vb.net(vs2022)のtextboxのデザ...
-
VBAでCOPYを繰り返すと、処理が...
-
VBA ユーザーフォーム ボタンク...
-
エクセルのVBAコードと数式につ...
-
エクセルのVBAコードについて教...
-
[VB.net] ボタン(Flat)のEnable...
-
【マクロ】変数を使った、文字...
-
改行文字「vbCrLf」とは
-
質問58753 このコードでうまく...
-
【マクロ】シートの変数へ入れ...
-
ワードの図形にマクロを登録で...
-
算術演算子「¥」の意味について
おすすめ情報