在使用rand()函数的单元格上使用Solver加载项

时间:2015-04-26 22:40:00

标签: excel vba excel-vba random solver

我有一个蒙特卡罗模拟模型,我需要将我的一个参数(服务水平)设置为至少95%。问题是,据我所知,当Solver运行时,它会尝试不同的解决方案,但由于RAND()函数,目标单元格一直在不断变化。有什么方法可以解决这个问题吗?禁用RAND()暂时改变?我试图将计算切换到手动,但这不起作用,因为目标单元格根本不更新。感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:2)

您可能要做的是创建自己的=RAND()函数(让我们称之为MYRAND()函数),其中ON/OFF输入。这个想法是:

  1. 打开VBE编辑器并将模块添加到工作簿中;
  2. 您插入"随机开/关功能",如下所示:

    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
    
  3. 现在,你可以把一个包含" ON / OFF"的列表框进入一个单元格(让我们说A1)并像=MYRAND(A1)一样将它引入单元格。从现在开始,如果A1的值为ON,则该函数将返回您期望从=RAND()函数获得的经典结果。但是,如果它位于OFF,那么它将跳过计算并将之前的值放在其中。

    像这样你可以模拟Calculation Manual/Automatic的效果,但只将它应用于RAND()函数,让所有其他函数独立。

答案 1 :(得分:1)

根据解算器的original authors,它旨在使用Excel的内置逻辑来确定需要重新计算的内容。这意味着在每一步,求解器都会调整一个值,然后让Excel重新计算。在那个时间点,Rand函数将运行,因为它们是不稳定的。

我建议您将随机生成的数字和硬编码放入工作表(粘贴特殊 - >值),然后运行解算器,然后将调用重新放入Rand你的模型已经过校准。