在使用rand()函数的单元格上使用Solver加载项
我有一个蒙特卡罗仿真模型,我需要设置一个参数(服务级别)至less95%。 问题是,据我所知,当Solver运行时,它会尝试不同的解决scheme,但是由于RAND()函数,目标单元格总是在不停地变化。 有什么办法可以解决这个问题吗? 禁用RAND()暂时更改? 我试图将计算切换到手动,但不起作用,因为那么目标单元根本不会更新。 我感谢任何帮助,谢谢!
你可能做的是创build你自己的=RAND()
函数(我们称之为MYRAND()
函数),它需要一个ON/OFF
input。 这个想法是:
- 您打开VBE编辑器并将模块添加到您的工作簿;
-
你插入你的“随机开/关function”,如下所示:
Public Function MYRAND(ByVal activation As String) As Double Application.Volatile If activation = "ON" Then MYRAND = Rnd() Else MYRAND = Application.Caller.Value End If End Function
现在,你可以把一个包含“ON / OFF”的列表框放到一个单元格中(比方说A1),并将其引用到单元格中,如=MYRAND(A1)
。 从现在开始,如果A1的值为ON
,那么函数将返回您期望从=RAND()
函数获得的经典结果。 但是,如果它处于OFF
,那么它将跳过计算并将之前的值存入内部。
像这样,您将模拟Calculation Manual/Automatic
的效果,但只将其应用于RAND()
函数,其余部分保持独立。
根据解算器的原始作者 ,它被devise为使用Excel的内置逻辑来确定需要重新计算的内容。 这意味着在每一步,求解器都会调整一个值,然后要求Excel重新计算。 在那个时候, Rand
函数将会运行,因为它们是不稳定的。
我会推荐的是把你的随机生成的数字和硬编码到你的工作表(粘贴特殊的 – >值),然后运行求解器,然后把你的电话Rand
回来,一旦你的模型校准。