我需要在一个工作表中运行Solver(" Sheet1")以获取名为" air"的参数的不同值,此参数不是Solver参数的一部分,但它对结果有影响,所以我在" Sheet2"使用" air"的不同值并为每个" air"制作了一个代码来运行Solver。价值回归"恢复"一些来自Sheet1的结果并将它们放在" Sheet2"
这是我为" Sheet2"
制作的代码Sub F1()
Dim air() As Variant
air = Selection.Value 'Selection of different % of "air" from a table in Sheet2
i = UBound(air, 1) 'Length of air array
For j = 1 To i
Sheet1.Range("$H$35").Value = air(j, 1) 'Change parameter "air" of Sheet1
Call Sheet1.Resolver 'Run Solver on Sheet1 to obtain new results
ActiveCell.Offset(j - 1, 1).Value = Sheet1.Range("$P$132").Value 'Paste new result "$P$132" from Sheet1 on a cell one space right to "air" in table from Sheet2
ActiveCell.Offset(j - 1, 2).Value = Sheet1.Range("$A$54").Value 'Paste new result "$A$54" from Sheet1 on a cell two spaces right to "air" in table from Sheet2
ActiveCell.Offset(j - 1, 3).Value = Sheet1.Range("$P$117").Value 'Paste new result "$P$117" from Sheet1 on a cell three spaces right to "air" in table from Sheet2
Next j
End Sub
这是Sheet1的子解析器:
Sub Resolver()
SolverReset
SolverOk SetCell:=Range("$A$51"), MaxMinVal:=3, ValueOf:="0", ByChange:=Range("$H$36:$H$38,$A$54"), Engine:=1
SolverAdd CellRef:=Range("$A$45"), Relation:=2, FormulaText:=0
SolverAdd CellRef:=Range("$A$47"), Relation:=2, FormulaText:=0
SolverAdd CellRef:=Range("$A$49"), Relation:=2, FormulaText:=0
SolverOptions AssumeNonNeg:=False
SolverSolve UserFinish:=True
SolverFinish KeepFinal:=1
End Sub
此代码正在运行,但如果我将它们与手动运行子解析器获得的结果进行比较,则会得到错误的值。例如:
使用第一个代码:
air x y z
0,10 56,52 35,08 7.093,49
0,20 56,52 35,08 5.716,48
0,30 56,52 35,08 4.787,19
0,35 56,52 35,08 4.427,32
手动使用第二个代码:
air x y z
0,10 74,29 57,79 9.324,50
0,20 67,19 48,13 6.796,69
0,30 60,08 39,43 5.089,14
0,35 56,52 35,08 4.427,32
在第一个代码的结果中,只有最后一行是可以的,因为在运行F1之前,我手动运行Resolver,其值为" air"。如果我改变" air"的顺序它们是相同的,只有0.35行是可以的。
然后我意识到在" Sheet2"在运行F1之后,单元格的价值为$ A $ 51,$ H $ 36:$ H $ 38,$ A $ 54,$ A $ 45,$ A $ 47,$ A $ 49(同样在Resolver中使用)为0,所以现在我认为问题是解析器正在" Sheet2"而不是" Sheet1"。所以我尝试了以下内容:
Sub Resolver()
SolverReset
SolverOk SetCell:=Sheet1.Range("$A$51"), MaxMinVal:=3, ValueOf:="0", ByChange:=Sheet1.Range("$H$36:$H$38,$A$54"), Engine:=1
SolverAdd CellRef:=Sheet1.Range("$A$45"), Relation:=2, FormulaText:=0
SolverAdd CellRef:=Sheet1.Range("$A$47"), Relation:=2, FormulaText:=0
SolverAdd CellRef:=Sheet1.Range("$A$49"), Relation:=2, FormulaText:=0
SolverOptions AssumeNonNeg:=False
SolverSolve UserFinish:=True
SolverFinish KeepFinal:=1
End Sub
但是不起作用,我该如何运行" Resolver"在" Sheet1"?谢谢!
答案 0 :(得分:0)
解决了,我不知道它是否是脏代码,但是正在运行。
在F1上添加以下代码:
Sheet1.Select
在致电Resolver之前。
和
Sheet2.Select
返回Sheet2和"粘贴"数据。
然后:
Sub F1()
On Error GoTo errHandler
Application.ScreenUpdating = False
Dim air() As Variant
air = Selection.Value 'Selection of different % of "air" from a table in Sheet2
i = UBound(air, 1) 'Length of air array
For j = 1 To i
Sheet1.Range("$H$35").Value = air(j, 1) 'Change parameter "air" of Sheet1
Sheet1.Select
Call Sheet1.Resolver 'Run solver on Sheet1 to obtain new results
Sheet2.Select
ActiveCell.Offset(j - 1, 1).Value = Sheet1.Range("$P$132").Value 'Paste new results "$P$132" from Sheet1 on a cell 1 space right to "air" in table from Sheet2
ActiveCell.Offset(j - 1, 2).Value = Sheet1.Range("$A$54").Value 'Paste new results "$A$54" from Sheet1 on a cell 2 spaces right to "air" in table from Sheet2
ActiveCell.Offset(j - 1, 3).Value = Sheet1.Range("$P$117").Value 'Paste new results "$P$117" from Sheet1 on a cell 3 spaces right to "air" in table from Sheet2
Next j
Application.ScreenUpdating = True
errHandler:
Application.ScreenUpdating = True
End Sub
使用
Sub F1()
On Error GoTo errHandler
Application.ScreenUpdating = False
....(code)...
....(code)...
Application.ScreenUpdating = True
errHandler:
Application.ScreenUpdating = True
End sub
避免更改工作表之间的闪烁。