是否可以在公式中实现求解器,以数字方式找到给定函数的零?还是要解决一个优化问题(寻根也可以重新定义为一个优化问题)?
Solver具有一个GUI,基本上可以让您一次求解一个单元格。
您可以使用VBA自动执行此操作,但是输出仍然是静态的,即,如果单元格发生更改,则需要再次运行VBA代码。
相反,如果可以将其实现为公式,则将在其输入更改时自动重新计算。这有可能吗?
让我举例说明现值和内部收益率;是的,我知道Excel具有计算公式,我只是一个例子。
C6:C8是现金流量;内部收益率是导致这些现金流量的净现值为零的比率是否可以在C11中编写公式来计算导致目标函数(C10中的NPV)为零的比率?
基本上像Matlab中的fsolve()
还是Python的scipy一样?
我唯一能想到的就是在VBA中编写UDF来实现诸如二分法或Newton Rhapson算法之类的数值求解方法,但是感觉有点像在重塑车轮。另外,IRR是一个非常简单的情况,但是对于更复杂的计算,我不确定VBA是不是最好的工具。这是唯一的选择吗?
编辑:建议安装Solver插件使某些functions在Excel中可用,例如SolverOk()。但是,据我了解,这些功能将在VBA代码中使用,而不是输入到Excel扩展名中。或者,至少,如果有办法,我还没有找到。例如,如果我按照链接中的语法使用SolverOk()
,则会收到#Value!
错误。这是在按链接中所述启用对规划求解的引用之后。
答案 0 :(得分:0)
我建议使用Define Names
和Worksheet Event
来使规划求解动态化
使用提供的示例,创建以下Names
:
一种。 _Goal
位于C11
b。 _Input
位于C6:C8
C。 _Output
位于C12
d。 _Formula
位于C10
在工作表的module
中,复制以下Worksheet Event
过程:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rGoal As Range, rInput As Range, rOutput As Range, rFormula As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
With Target.Worksheet
Set rGoal = .Range("_Goal")
Set rInput = .Range("_Input")
Set rOutput = .Range("_Output")
Set rFormula = .Range("_Formula")
If Not (Application.Intersect(Target, rInput) Is Nothing) Then
rOutput.ClearContents
rFormula.GoalSeek Goal:=rGoal.Value2, ChangingCell:=rOutput
End If: End With
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub