シートAにソルバーを使用しようとしました。シートAに「= rand()」というセルがいくつかあります。あるいは、Application.Volatile
というカスタム関数を使ってシート上の式を書いています。私はソルバを実行しているときにこれらの揮発性セルの再計算を止めたいので、ソルバープログラムでApplication.Calculation = xlCalculationManual
を使用しましたが、ソルバーを実行した後に判明しました。私はどこで間違っているのですか?VBAでソルバーを使用するときに、再計算をオフに切り替えるにはどうすればよいですか?
答えて
これを回避するために、2通りの方法があります。
ソルバを使用しないでください!あなたが自分のサブを書く場合は、
Range.Calculate
を使うことができますが、計算はこのセルを計算するだけです(他のすべてのセルは無視されます)。数式を変更して、繰り返しを実行します。オプション - >数式 - >繰り返し計算を有効にします。
:今、あなたは(ヘルパー細胞A1/A2式)を以下のように計算する必要はありません式真/偽保持している(または1/0または何でも)ヘルパー細胞および変更を使用
=IF(A1,A2,[your old formula])
このように、A1がtrue
の場合、計算前の値を出力します。
私が知る限り、ソルバーは新しいサイクルがテストされるたびにCalculate
を実行するので、他の方法はありません。
EDIT:全体の時間は、あなたが簡単なトリック(再びヘルパー細胞)を使用することができ、揮発性である必要はありません
揮発性のUDFを持つことが必要とされている:
A1: [volatile function like =NOW() or =RAND()]
A2: =MY_UDF(A1)
モジュール内:
Public Function MY_UDF(a As Variant) As Double
a = a
MY_UDF = Now
End Function
A1がvolatileを保持している限り、UDFは毎回再計算されます。しかし、A1を空にする(または、それを非揮発性であるとする)場合、UDFに提出された値に変更はなくなります。この方法でExcel/VBAは変更が行われないと仮定し、再計算のためにスキップします。このようにして、ヘルパーセルが不揮発性である限り、ワークブック内のすべての揮発性機能を停止するだけで、独自のRAND
-UDF(もちろん別の名前)を構築することもできます。
注意:A1(この例では)を不揮発性にした後、最初の計算はそれがvolatileであるように1回も実行されます。 A1をある値から別の値(0〜1など)に変更すると、1回実行されます。
スプレッドシートに任意の値を設定し、任意の値を再計算したり、ボラティリティをオンまたはオフにすることができます。
まず、1セル名前付き範囲を作成し、標準のコードモジュールに次のコードを入れて、次に「トリガー」
を言う:
Function SemiVolatileRand(x As Variant) As Double
SemiVolatileRand = x - x + Rnd()
End Function
Sub ReSample()
Randomize
Range("trigger").Value = Range("trigger").Value + 0.01
End Sub
はボタンにReSample
サブを取り付けます。 =RAND()
の出現箇所をすべて =SemiVolatileRand(trigger)
に置き換えます。ボタンを押すたびに再計算されます。また、完全なボラティリティを元に戻したい場合は、数式=RAND()
をトリガーセルに入れてください。 (この最後のケースで完全なボラティリティを得ることは、私のコードがのダミー変数であることを要求するように思えたので、ややポテンシャルのないx - x
)。
Randomize
は、システムクロックから乱数ジェネレータを再配置します。セッションごとに少なくとも1回は呼び出す必要があります。そうしないと、VBA rnd
を使用するExcelワークブックを開くたびに、ランダムな値の同じシーケンスが取得されます。あなたは空白のブックを作ることによって及びThisWorkbook
コードモジュールプットでこれを確認することができます。
Private Sub Workbook_Open()
MsgBox Rnd()
End Sub
メッセージブロックが同じ値にブックを開くたびに表示されます。一方、MsgBox
の前に行Randomize
を置くと、開くたびに異なる値が得られます。
rnd
を使用する予定がある場合は、ワークブック公開イベントは文Randomize
を置くための自然な場所です。
私がRandomize
を関数自体に入れなかったのは、CPUサイクルを節約したことと、正確に同じシステム時間で乱数ジェネレータを再シードする一定割合の時間。最近のバージョンのExcelを使用している現代のアーキテクチャでは不可能かもしれませんが、タイマーの機能がシステムクロックに関係なく1ミリ秒の分解能を持つため、Randomize Timer
(他のコードを読むときに遭遇することがあります)があった場合には時々発生します。
私が持っているコードには、ボタンをバイパスしてトリガーセルを変更するだけで、再シードができないという欠点があります。これが懸念される場合は、1つの可能性は次のようになります:
公共初期化
ブールとして機能SemiVolatileRand(バリアントとしてx)のダブル として初期化されていない場合は、 ランダム化 初期化= Trueの エンド SemiVolatileRandの場合= x - x + Rnd() 最終機能rnd
が正しくシードされていないと、この機能が実行されなくなります。
Excel自体がワークシート機能Rand()
で自動的にシード処理を行うため、厳密にはVBAの複雑さです。
なぜあなたはReSample()サブルーチンにRandomizeを入れますか? – Nicholas
@NicholasLiu擬似乱数ジェネレータをシードすることでした。編集を参照してください。 –
- 1. モーダルオーバーレイをオフに切り替えるにはどうすればよいですか?
- 2. Googleマップのオートコンプリートのオン/オフを切り替えるにはどうすればよいですか?
- 3. Google拡張機能のcontent_scriptのオン/オフを切り替えるにはどうすればよいですか?
- 4. どのようにC++で簡単に算術演算を切り替えることができますか?
- 5. どのように切り替えるかDatabaseGeneratedOption.Identityをオン/オフで実行時に
- 6. インタラクティブモードで「期待する」と「する」を切り替えるにはどうすればよいですか?
- 7. ボタンを使用してAndroidスタジオのページを切り替えるにはどうすればよいですか?
- 8. 以下のコードを使用してクラスを切り替えるにはどうすればよいですか?
- 9. コマンドラインツールのみを使用してSubversionリポジトリを切り替えるにはどうすればよいですか?
- 10. チェックボックスを使用してメニューバーのステータス項目をオンとオフに切り替えるにはどうすればよいですか?
- 11. EmacsのECBでキーボードを使ってブラウザウィンドウに切り替えるにはどうすればいいですか?
- 12. Visual Studio 2010でウィンドウレイアウトをすばやく切り替えるにはどうすればよいですか?
- 13. onblurとjavascriptを使用して小計を計算するにはどうすればよいですか?
- 14. iPadでキーボードレイアウトをプログラム的に切り替えるにはどうすればよいですか?
- 15. iOSシミュレータでBluetoothをオンに切り替えるにはどうすればよいですか?
- 16. スパンを表示するにはhtisリンクを切り替えるにはどうすればいいですか
- 17. ボタンを新しいアクティビティに切り替えるにはどうすればよいですか?
- 18. 青色ではなくiOSグレースケールでスイッチを切り替えるにはどうすればよいですか?
- 19. iOSアプリでスキン(またはテーマをデザイン)を切り替えるにはどうすればよいですか?
- 20. グループ合計を計算するにはどうすればよいですか?
- 21. アクティビティの切り替え時に参照を削除するにはどうすればよいですか? [Android]
- 22. 切り捨てられた近似を計算するにはどうすればよいですか?
- 23. Androidで1ボタンから別のボタンに切り替えるにはどうすればよいですか?
- 24. モデルのインスタンスを切り替えるフォームを作成するにはどうすればよいですか?
- 25. 必須ではない場合、実際にiAdをオフに切り替えるにはどうすればよいですか?
- 26. GreaseMonkeyを使用してページ上でUnselectableをオフ/オフにするにはどうすればよいですか?
- 27. Eclipse C++:ヘッダーファイルと実装ファイルを素早く切り替えるにはどうすればよいですか?
- 28. GPSとネットワークプロバイダを切り替えるにはどうすればよいですか?
- 29. iOS開発で新しいView Controllerを切り替えるにはどうすればよいですか?
- 30. タブとpushViewControllerを同時に切り替えるにはどうすればいいですか?
あなたは確かに正しいです。ソルバーが再計算せずにその魔法を行うことは明らかに不可能です。なぜなら、最適化するよう求められている関数や制約は*スプレッドシートの式で構成されているからです。 –
しかし、ソルバーが操作するシート全体/シート全体を再計算する理由を教えてください。なぜそれは範囲を使用しません。計算する?私は非線形OLSを行っていたときにこの問題に遭遇しましたが(ソルバーをスキップする機会はありませんでしたが)、最適化関数(SolverOkの第1引数)が揮発性のものN個の異なる最適化関数を得るためにそれらを使用しているので、単に揮発性である!)、それらは最適化に直接関与しないが、最適化関数を変更するので変更できない。これは物語です:( – Nicholas
ところで、値として新しい領域にコピーするのはどうでしょうか? – Nicholas