- ベストアンサー
こんなマクロを作るには
マクロ初心者です。 以下のようなことをしたいときにマクロの方法を教えて頂けると助かります。 1)セルA1に、数値を入力。 2)セルB1に、A1の数値を使った複雑な計算を行う。 3)セルC1にある別の既定の数値とB1が同じなるまで、A1の数値を入力し直す。 (例えばA1は、0.1間隔で数値を入力していく) このようなものをマクロで設定したいです。 今はひたすらA1の数値を入力し直して対応しています。 なにとぞよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 それは、メニューのツールの「ゴールシーク」で可能だとは思いますが、「ゴールシーク」の中身の変化値がいくつのか良く分かりません。おそらく、動きからすると、プログラムの中身は、Single型のように見えます。 もちろん、マクロでしたら、以下のような風になります。 なお、以下のコードは、今の段階では、可能とも不可能ともいえません。 理由は、 > (例えばA1は、0.1間隔で数値を入力していく) ということで、 >3)セルC1にある別の既定の数値とB1が同じなるまで、A1の数値を入力し直す。 同じになるというのは、数値は必ずしも同じになるといえません。また、小数を扱うことで、誤差が生じてしまいます。それは、ゴールシークでも、ソルバーでも、近似値でしかできません。マクロ・プログラミングで行う場合は、小数点題何位までと、桁を区切って、それで比較しないとできません。現在は、 Range("C1").Value >= Range("B1").Value という条件にしてあります。「C1 を超えたら止まる」 Application.ScreenUpdating = False を取ると、目に見えるようになるけど、遅くなります。 Sub LoopTest() Dim i As Long Dim flg As Boolean Const LIMIT As Long = 10000 '限界回数 flg = False i = 0 Application.ScreenUpdating = False '画面の変更を止める Do Until Range("C1").Value >= Range("B1").Value Range("A1").Value = i * 0.1 '0.1を付加する i = i + 1 If i > LIMIT Then flg = True: Exit Do Loop Application.ScreenUpdating = True '画面の変更を戻す If flg Then MsgBox "規定の数を超えましたが、値を見つけられませんでした", vbInformation Else Beep End If End Sub
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >目標値に、数値を直接でなく、セルC1を指定したいのですができないのでしょうか? Sub myGoalSeek() Application.Dialogs(xlDialogGoalSeek).Show Range("B1"), Range("C1").Value, Range("A1") End Sub '標準モジュールがベストです このようになりますから、ショートカットにして入れればよいと思います。
お礼
誠にありがとうございました。 おかげさまで使い勝手の良いものができました。 ひとつ分かるともっといろいろと欲が出てくるものですが、 それはまた別の機会にします。 ありがとうございました。
- x0000x
- ベストアンサー率52% (67/127)
ゴールシークの設定 ツール-ゴールシークでダイアログを開きます。 数式入力セルにB1を指定。 目標値にC1の値を入力 変化させるセルをA1に指定。 OKボタン押下。 です。
お礼
ありがとうございました。
補足
ありがおうございます。非常に便利なものでした。 ところで、 目標値に、数値を直接でなく、セルC1を指定したいのですが できないのでしょうか?
補足
早速すばらしい返答ありがとうございます。 まずはこれでやってみます。 ちなみに、マクロを組まなくても良いのなら組みたくないのですが、 「ゴールドシーク」「Single型」ともに全く分かっていません。 取り急ぎ、この名を頼りにヘルプを見てみます。