重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

ExcelのVBAにおいて,最小値の抽出方法の質問です.

たとえばA1に変数nがあり,A2にnの関数(例えば=n^4-2n^3+5n-10とか)があるとします.
A1を1から100まで動かしたときのA2の最小値を求めたいのですが,これはそのまま1から100まで値をズラっと出力すれば,あとはそこから最小値を探すだけで求まりますが,こういう方法はとらず,一発でこの最小値を1つのセルに出力させたいのです.

いろいろわけあって,使用するセルを最小限におさえたく,この方法が知りたいのです.

よろしくお願いします.

A 回答 (3件)

単純な方法ですが


Sub test()
n = 1
mx = n ^ 4 - 2 * n ^ 3 + 5 * n - 10
For n = 2 To 100
x = n ^ 4 - 2 * n ^ 3 + 5 * n - 10
If mx > x Then
mx = x
End If
Next
Range("A1").Value = mx
End Sub
    • good
    • 0
この回答へのお礼

こんなにすばやく解答をいただきありがとうございました.

お礼日時:2009/11/22 23:22

A2に


=A1^4-2*A1^3+5*A1-10
と入力します。
ツール―ソルバー
で、
目的セル:$A$2
目標値:最小値
変化させるセル:$A$1
制約条件:$A$1<=100,$A$1>=1,$A$1=整数
として、実行します。
これをマクロ記録で、もう一度実行します。
このマクロをユーザー設定でボタンに登録します。
なお、VBEでツール―参照設定でSOLVERにチェックを入れておきます。
これで、登録ボタンを押すと、$A$2に最小値が表示されます。



     
    • good
    • 1
この回答へのお礼

こんな方法もあるんですね、ありがとうございました。

お礼日時:2009/11/30 21:36

最小値を求めるアルゴリズムというものがあって、情報技術者の試験問題の解説書などに出てくるぐらい常識のもの。


B列の値を求める式など特に質問に持ち出さなくて良い。VBAをやるなら、エクセルVBAのメソッドやプロパティを覚えるほかに、基礎的なアルゴリズムを知ることが必要。
まず起こり得なさそうな数を初期値として(最小値候補値)変数にセット。前にも書いたが、椅子が1つあって、100人が配られた自分の持っている「1枚の数の書かれたカード」をじゃんけんの代わりに見せ合い、小さい方のカードを持っていたものがその椅子に座る(か座り続ける)。
これで全員の、数による「じゃんけん」が終わったら、最後に椅子に残った者のカードに書かれた数が最小値。
最小値・最大値は最後のレコード読むまで決らない。すなわち1回は絶対に全データを読む必要がある。ですから上記より能率的なアルゴリズムは無いだろう。
推測ではMIN関数の内部処理も、言語は別でも、処理ロジック・方法はこれを使っているのではないかな。
ーー
Sub test01()
m = 10000 '起こりえない大きい数
d = Range("A65536").End(xlUp).Row
For i = 1 To d
x = Cells(i, "A")
y = x
'y = f(x)
If m > y Then
m = y
End If
Next i
MsgBox m
End Sub
質問の場合では'y = f(x)のところで関数で式で計算に置き換える。
>m = 10000 '起こりえない大きい数
を設置するのは、第1データから同じパターンの処理をするため。
エクセルなら、m=Cells(1,"A")としても良い。本質問なら第1(行)データにより計算した関数式による計算値をセットする。
    • good
    • 0
この回答へのお礼

返事が遅れてすみません。ありがとうございました。

お礼日時:2009/11/30 21:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!