【发布时间】:2013-03-08 01:33:16
【问题描述】:
您好,我有以下代码通过求解器运行单个优化,我想在循环中运行。单次运行代码为:
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 行)。效果很好。但是,我试图让它运行一列目标单元格,方法是让它依次优化列中的每个单元格,通过使用循环(或更好的替代方案),然后将解决方案粘贴到它旁边,就像它为单次运行代码。例如,我正在尝试将其与以下代码合并
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'的方法'Range'失败-突出显示“Range(E41 + Count”)行。选择。我拥有的完整代码是:
`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`
我只需要它更新它正在优化的单元格(并将其置于求解器的约束中),然后更新要复制的单元格以及粘贴它们的位置。任何帮助将不胜感激。
【问题讨论】:
-
你的脚本在它周围有什么样的循环?您遇到的确切错误是什么以及在哪些行中?您是否查看过错误并尝试纠正它们?你有没有试过用代码把“$D$41”改成别的东西,那是什么样子的?
-
我收到诸如“编译错误:预期语句结束”之类的错误。但是现在完整的代码只说对象'_global'的方法'范围'失败并突出显示 RangeXXX.Select 代码,我认为它与我尝试将其粘贴到正确的单元格中的方式有关。我已经用新代码更新了问题。
-
您应该在调试模式下运行代码,这样您就可以看到它落在哪一行以及哪些变量具有预期值以外的值。通过选择您开始的第一个 sub 的 Sub xxx 行来执行此操作,然后按 F9,现在它将有一个彩色背景和一个项目符号在它前面。当您现在触发代码的开始时,它将停在那里。使用 F8,您可以逐行浏览代码。通过鼠标悬停,您可以检查所有变量的值。此外,建议激活本地监视窗口以查看所有局部变量和对象。
-
会的。感谢您的提示。