Excel 求解器循环遍历公式中的行
Excel Solver Looping through rows in formulas
D G
529.01 531.27
523.26 524.33
515.00 516.18
507.00 507.24
497.99 503.48
504.76 504.92
494.94 495.98
498.84 502.98
494.65 503.23
505.57 505.68
500.01 508.19
511.00 512.5
507.25 519.28
521.48 536.33
535.59 542.17
538.53 539
Formula in L14: =SUMPRODUCT($L:$P,$L:$P)
Formula in L13: =SUMPRODUCT($L:$L,D7:D11)
Formula in M13: =SUMPRODUCT($M:$M,D7:D11)
Formula in N13: =SUMPRODUCT($N:$N,D7:D11)
Formula in O13: =SUMPRODUCT($O:$O,D7:D11)
Formula in P13: =SUMPRODUCT($P:$P,D7:D11)
我的求解器宏代码是:
SolverOk SetCell:="$I", MaxMinVal:=3, ValueOf:=0, ByChange:="$L:$P", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverOk SetCell:="$I", MaxMinVal:=3, ValueOf:=0, ByChange:="$L:$P", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve True
我的专栏 I 是:
=G12-$L
我的K栏是:
=$L
行数 D7:D11 应该每向下一行递增 1。以这种方式,我们一直向下,直到我们到达 D105,这就是该列结束的时候。
我目前在一个 objective 函数值上有 Solver 运行,但我需要对 G 列中的每个单元格执行此操作,不包括 G 中的前 5 个单元格。
我面临的问题是我在 Solver 的 objective 函数中的单元格有其他单元格也是公式的函数,所以我不知道如何通过迭代来更改公式通过它们并在继续之前将求解器答案写入 K 列。
例如,我们从 G6 开始,因为我们使用 D1-5 的值来获取 G6 的值。该公式如下所示:
**
Formula in L13: =SUMPRODUCT($L:$L,D7:D11)
Formula in M13: =SUMPRODUCT($M:$M,D7:D11)
Formula in N13: =SUMPRODUCT($N:$N,D7:D11)
Formula in O13: =SUMPRODUCT($O:$O,D7:D11)
Formula in P13: =SUMPRODUCT($P:$P,D7:D11)
**
现在求解器应该像这样更改 G7 的公式:
Formula in L13: =SUMPRODUCT($L:$L,D8:D12)
Formula in M13: =SUMPRODUCT($M:$M,D8:D12)
Formula in N13: =SUMPRODUCT($N:$N,D8:D12)
Formula in O13: =SUMPRODUCT($O:$O,D8:D12)
Formula in P13: =SUMPRODUCT($P:$P,D8:D12)
对于 G8 Solver 应将公式更改为:
Formula in L13: =SUMPRODUCT($L:$L,D9:D13)
Formula in M13: =SUMPRODUCT($M:$M,D9:D13)
Formula in N13: =SUMPRODUCT($N:$N,D9:D13)
Formula in O13: =SUMPRODUCT($O:$O,D9:D13)
Formula in P13: =SUMPRODUCT($P:$P,D9:D13)
如何在使用 Solver 时迭代这样的公式?
这应该能带你到某个地方。只需将您的范围设置为命名的内容,并添加一个将 RowShift 递增 1 的循环变量...在测试电子表格中使用它...
Dim workingRange As Range
Set workingRange = Sheets(1).Range("A7:A11")
'alternate version, assuming you are in some sort of i-j double loop
Set workingRange = Sheets.Range( Cells(7+i,7+j) , Cells(11+i,7+j) ) 'G7:G11
'now you have some options....
workingRange.Value = "testing"
workingRange.Formula = "=Abs(B1)"
'if working with cells() and indices, the R1C1 style may be for you...
workingRange.FormulaR1C1 = "= {formula here} "
这是 R1C1 表示法的文档,超级简单。
https://msdn.microsoft.com/en-us/library/office/ff823188.aspx
此致,凯文
D G
529.01 531.27
523.26 524.33
515.00 516.18
507.00 507.24
497.99 503.48
504.76 504.92
494.94 495.98
498.84 502.98
494.65 503.23
505.57 505.68
500.01 508.19
511.00 512.5
507.25 519.28
521.48 536.33
535.59 542.17
538.53 539
Formula in L14: =SUMPRODUCT($L:$P,$L:$P)
Formula in L13: =SUMPRODUCT($L:$L,D7:D11)
Formula in M13: =SUMPRODUCT($M:$M,D7:D11)
Formula in N13: =SUMPRODUCT($N:$N,D7:D11)
Formula in O13: =SUMPRODUCT($O:$O,D7:D11)
Formula in P13: =SUMPRODUCT($P:$P,D7:D11)
我的求解器宏代码是:
SolverOk SetCell:="$I", MaxMinVal:=3, ValueOf:=0, ByChange:="$L:$P", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverOk SetCell:="$I", MaxMinVal:=3, ValueOf:=0, ByChange:="$L:$P", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve True
我的专栏 I 是:
=G12-$L
我的K栏是:
=$L
行数 D7:D11 应该每向下一行递增 1。以这种方式,我们一直向下,直到我们到达 D105,这就是该列结束的时候。 我目前在一个 objective 函数值上有 Solver 运行,但我需要对 G 列中的每个单元格执行此操作,不包括 G 中的前 5 个单元格。
我面临的问题是我在 Solver 的 objective 函数中的单元格有其他单元格也是公式的函数,所以我不知道如何通过迭代来更改公式通过它们并在继续之前将求解器答案写入 K 列。
例如,我们从 G6 开始,因为我们使用 D1-5 的值来获取 G6 的值。该公式如下所示: **
Formula in L13: =SUMPRODUCT($L:$L,D7:D11)
Formula in M13: =SUMPRODUCT($M:$M,D7:D11)
Formula in N13: =SUMPRODUCT($N:$N,D7:D11)
Formula in O13: =SUMPRODUCT($O:$O,D7:D11)
Formula in P13: =SUMPRODUCT($P:$P,D7:D11)
**
现在求解器应该像这样更改 G7 的公式:
Formula in L13: =SUMPRODUCT($L:$L,D8:D12)
Formula in M13: =SUMPRODUCT($M:$M,D8:D12)
Formula in N13: =SUMPRODUCT($N:$N,D8:D12)
Formula in O13: =SUMPRODUCT($O:$O,D8:D12)
Formula in P13: =SUMPRODUCT($P:$P,D8:D12)
对于 G8 Solver 应将公式更改为:
Formula in L13: =SUMPRODUCT($L:$L,D9:D13)
Formula in M13: =SUMPRODUCT($M:$M,D9:D13)
Formula in N13: =SUMPRODUCT($N:$N,D9:D13)
Formula in O13: =SUMPRODUCT($O:$O,D9:D13)
Formula in P13: =SUMPRODUCT($P:$P,D9:D13)
如何在使用 Solver 时迭代这样的公式?
这应该能带你到某个地方。只需将您的范围设置为命名的内容,并添加一个将 RowShift 递增 1 的循环变量...在测试电子表格中使用它...
Dim workingRange As Range
Set workingRange = Sheets(1).Range("A7:A11")
'alternate version, assuming you are in some sort of i-j double loop
Set workingRange = Sheets.Range( Cells(7+i,7+j) , Cells(11+i,7+j) ) 'G7:G11
'now you have some options....
workingRange.Value = "testing"
workingRange.Formula = "=Abs(B1)"
'if working with cells() and indices, the R1C1 style may be for you...
workingRange.FormulaR1C1 = "= {formula here} "
这是 R1C1 表示法的文档,超级简单。
https://msdn.microsoft.com/en-us/library/office/ff823188.aspx
此致,凯文