与求解器VBA循环

您好我有以下的代码,运行一个单一的优化,通过求解器,我想循环运行。 单个运行代码是:

Sub Macro4 SolverReset SolverOk SetCell:="$D$36", MaxMinVal:=2, ValueOf:="0", ByChange:="$D$7:$R$7" SolverAdd CellRef:="$S$7", Relation:=2, FormulaText:="1" SolverAdd CellRef:="$D$7:$R$7", Relation:=1, FormulaText:="$D$6:$R$6" SolverAdd CellRef:="$D$7:$R$7", Relation:=3, FormulaText:="$D$5:$R$5" SolverAdd CellRef:="$D$37", Relation:=2, FormulaText:="$D$41" SolverOk SetCell:="$D$36", MaxMinVal:=2, ValueOf:="0", ByChange:="$D$7:$R$7" SolverSolve UserFinish:=True SolverFinish KeepFinal:=1 Range("D37").Select Selection.Copy Range("E41").Select ActiveSheet.Paste Range("D36").Select Application.CutCopyMode = False Selection.Copy Range("F41").Select ActiveSheet.Paste Range("D36").Select Range("D7:R7").Select Application.CutCopyMode = False Selection.Copy Range("I41").Select ActiveSheet.Paste End Sub 

求解器优化到$ D $ 41(除其他限制之外)的值,然后通过复制几个单独的单元格和一个数组,然后将它们粘贴在原始目标单元格旁边(即,到第41行)来粘贴解决scheme。 不过,我试图通过使用一个循环(或更好的select)来优化每列中的每个单元格,然后在粘贴解决scheme之前,通过使其与列中的每个单元格进行优化单个运行代码。 例如,我正试图合并下面的代码

  Sub Complete() ' ' ' Dim Count As Double Dim Count2 As Integer Dim increment As Double increment = Range("C43").Value strt = Range("C41").Value fnsh = Range("C42").Value For Count = strt To fnsh Step increment Count2 = Count / increment Range("D41").Offset(Count2, 0) = Count Next Count End Sub 

它会生成一列目标值(从strt到fnsh,使用增量),以供Solver取而代之(我认为!!!)表示FormulaText:="$D$41" 。 然而,我遇到了各种错误和抱怨(Object'_Global'failed的方法'范围',突出显示了“Range(E41 + Count”)行select。我有的完整代码是:

 `Sub Macro5() Dim Count As Double Dim Count2 As Integer Dim increment As Double increment = Range("C43").Value strt = Range("C41").Value fnsh = Range("C42").Value For Count = strt To fnsh Step increment Count2 = Count / increment Range("D41").Offset(Count2, 0) = Count SolverReset SolverOk SetCell:="$D$36", MaxMinVal:=2, ValueOf:="0", ByChange:="$D$7:$R$7" SolverAdd CellRef:="$S$7", Relation:=2, FormulaText:="1" SolverAdd CellRef:="$D$7:$R$7", Relation:=1, FormulaText:="$D$6:$R$6" SolverAdd CellRef:="$D$7:$R$7", Relation:=3, FormulaText:="$D$5:$R$5" SolverAdd CellRef:="$D$37", Relation:=2, FormulaText:="$D$41:$D$41+Count" SolverOk SetCell:="$D$36", MaxMinVal:=2, ValueOf:="0", ByChange:="$D$7:$R$7" SolverSolve UserFinish:=True SolverFinish KeepFinal:=1 Range("D37").Select Selection.Copy Range("E41+Count").Select ActiveSheet.Paste Range("D36").Select Application.CutCopyMode = False Selection.Copy Range("F41+Count").Select ActiveSheet.Paste Range("D7:R7").Select Application.CutCopyMode = False Selection.Copy Range("I41+Count").Select ActiveSheet.Paste Next Count End Sub` 

我只是需要它来更新它正在优化的单元格(并将其放在求解器的约束中),然后更新要复制的单元格以及将其粘贴到哪里。 任何帮助将不胜感激。

 Range("E41+Count").Select 

这是不恰当的语法。 以下是首选:

 Range("E41").Offset(Count,0).Select 

或者你可以使用

 Range("E" & 41 + Count).Select 

一般来说,避免使用前面没有表格名称的范围。 另外,只有在需要的时候select,几乎不会。 这是一个不使用任何Select方法的例子。

 Sub Complete() Dim lStrt As Long, lFnsh As Long Dim lCount As Long, lCount2 As Long Dim lIncrement As Long For lCount = lStrt To lFnsh Step lIncrement lCount2 = lCount / lIncrement Sheet1.Range("D41").Offset(lCount2, 0).Value = lCount SolverReset SolverOk SetCell:="$D$36", MaxMinVal:=2, ValueOf:="0", ByChange:="$D$7:$R$7" SolverAdd CellRef:="$S$7", Relation:=2, FormulaText:="1" SolverAdd CellRef:="$D$7:$R$7", Relation:=1, FormulaText:="$D$6:$R$6" SolverAdd CellRef:="$D$7:$R$7", Relation:=3, FormulaText:="$D$5:$R$5" SolverAdd CellRef:="$D$37", Relation:=2, FormulaText:=Sheet1.Range("D41").Offset(lCount2, 0).Address SolverOk SetCell:="$D$36", MaxMinVal:=2, ValueOf:="0", ByChange:="$D$7:$R$7" SolverSolve UserFinish:=True SolverFinish KeepFinal:=1 Sheet1.Range("E41").Offset(lCount2, 0).Value = Sheet1.Range("D37").Value Sheet1.Range("F41").Offset(lCount2, 0).Value = Sheet1.Range("D36").Value Sheet1.Range("D7:R7").Copy Sheet1.Range("I41").Offset(lCount2, 0) Next lCount End Sub 

让我们考虑你的基础解算器代码的第一行的一部分。 有:

 SolverOk SetCell:="$D$36" 'and so on... 

无论你在Solver参数中有什么地址,你都应该传递地址而不是值(这可能是非常直观的,但它不工作)。 所以你会做这样的事情:

 SolverOk SetCell:=Range("$D$36").Address '... structure ok 

但不是:

 SolverOk SetCell:=Range("$D$36").Value '... wrong structure 

比你需要改善你的方向。 如果没有帮助,请提供完整的代码。