Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 循环求解器VBA_Loops_Excel_Solver_Vba - Fatal编程技术网

Loops 循环求解器VBA

Loops 循环求解器VBA,loops,excel,solver,vba,Loops,Excel,Solver,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", Rela

嗨,我有下面的代码,它通过解算器运行一个优化,我想在循环中运行。单次运行代码为:

    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),供解算器使用,而不是(我想!!!)表示
FormulaText:=“$D$41”
的部分。但是,我遇到了各种错误和投诉(对象“U 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` 

我只需要它来更新它要优化的单元格(并将其置于解算器的约束中),然后更新要复制的单元格以及粘贴它们的位置。任何帮助都将不胜感激。

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

SolverOk SetCell:="$D$36" 'and so on...
无论在解算器参数中有任何地址,都应该传递地址而不是值(这可能非常直观,但不起作用)。因此,您可以执行以下操作:

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

SolverOk SetCell:=Range("$D$36").Value   '... wrong structure
你需要在这个方向上改进你的循环。
如果它对您没有帮助,请提供您所拥有的完整代码。

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

SolverOk SetCell:="$D$36" 'and so on...
Range("E41+Count").Select
无论在解算器参数中有任何地址,都应该传递地址而不是值(这可能非常直观,但不起作用)。因此,您可以执行以下操作:

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

SolverOk SetCell:=Range("$D$36").Value   '... wrong structure
你需要在这个方向上改进你的循环。 如果对您没有帮助,请提供您所拥有的完整代码

Range("E41+Count").Select
这是不正确的语法。首选以下语法:

Range("E41").Offset(Count,0).Select
或者你可以用

Range("E" & 41 + Count).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
这是不正确的语法。首选以下语法:

Range("E41").Offset(Count,0).Select
或者你可以用

Range("E" & 41 + Count).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

你的脚本和它周围的循环是什么样子的?你遇到的确切错误是什么?在什么行中?你有没有查找错误并试图纠正它们?你有没有尝试过用代码将“$D$41”改成其他形式,那是什么样子的?我遇到了一些错误,比如“编译错误:预期的语句结束”。但完整的代码现在只显示对象“U global”的方法“range”失败,并突出显示RangeXXX。选择我认为与我尝试将其粘贴到正确单元格的方式有关的代码。我已使用新代码更新了问题。您应该在调试模式下运行代码,以便可以看到它落在哪一行以及变量是什么BLE具有非预期值。通过选择您启动的第一个子项的子项xxx行,然后按F9,现在它将有一个彩色背景,前面有一个项目符号。当您现在触发代码开始时,它将停止在那里。使用F8,您可以逐行通过代码。鼠标悬停在上方,您可以检查val所有变量的用途。此外,建议激活本地监视窗口以查看所有本地变量和对象。可以。谢谢提示。您的脚本与它周围的循环是什么样子的?您遇到的确切错误是什么?在哪些行中?您是否查找了错误并尝试了补救措施?是否尝试了更改用代码将“$D$41”转换成其他代码,这是什么样子的?我得到了一些错误,比如“编译错误:预期语句结束”。但完整的代码现在只显示对象“U global”的方法“range”失败,并突出显示RangeXXX。选择我认为与我尝试将其粘贴到正确单元格的方式有关的代码。我已使用新代码更新了问题。您应该在调试模式下运行代码,以便可以看到它落在哪一行以及变量是什么BLE具有非预期值。通过选择您启动的第一个子项的子项xxx行,然后按F9,现在它将有一个彩色背景,前面有一个项目符号。当您现在触发代码开始时,它将停止在那里。使用F8,您可以逐行通过代码。鼠标悬停在上方,您可以检查val所有变量的用途。建议激活本地监视窗口以查看所有本地变量和对象。可以。谢谢提示。仍然获取对象“U全局”的方法“范围”失败错误。我已按要求使用代码更新问题。仍然获取对象“U全局”的方法“范围”失败错误。我已使用按要求编写代码。谢谢!效果很好。虽然我需要删除所有“Sheet1.”引用以填充单元格。不确定原因。非常感谢。我发现解算器忽略了行SolverAdd CellRef:=“$S$7”,关系:=2,公式文本:=“1”你知道这是为什么吗?试着通过用户界面来做。这通常是单元格中的错误或单元格中没有公式。你应该创建一个新问题-更多的人会看到它,知道解算器。谢谢。我确实通过界面试过。我会试着玩它。如果我运气不好,我会提出一个新问题,但我认为你可能会问我想先知道。再次感谢。不确定