VBA求解器循环只保留最后一个循环结果

时间:2017-11-20 16:48:38

标签: excel vba excel-vba for-loop solver

抱歉,这是另一个VBA Solver循环问题。我已经阅读了这里和其他地方发布的许多其他问题/答案,但是对VBA不熟悉(这是我尝试的第一件事),我无法查明我的错误。

我希望在更改单元格Ji和Ki(保持结果)时将单元格Ii设置为0,其中i是第3到第21行。

我当前的代码没有出现任何错误,但结果只保留在循环的最后一行 - 请指教!我尝试使用range()和range.offset(来自其他示例)而不是cell(),并且还将活动工作表设置为无效。

我正在使用Excel 2011 for Mac。

Sub SolveTwo()
    'Not sure if this is necessary
    Dim row As Integer
    'Begin loop
    For row = 3 To 21
        'Test code shows it is stepping through loop
        Cells(row, "U").Value = row
        'Grab starting values from other columns
        Cells(row, "J").Value = Cells(row, "S").Value
        Cells(row, "K").Value = Cells(row, "T").Value
        'Solver Code
        SolverReset
        SolverOptions Precision:=1e-05
        SolverOk SetCell:=Cells(row, "I").Address, _
        MaxMinVal:=3, ValueOf:=0, _
        ByChange:=Cells(row, "J").Address & "," & Cells(row, "K").Address, _
        Engine:=1, EngineDesc:="GRG Nonlinear"
        SolverSolve UserFinish:=True
        SolverFinish KeepFinal:=1
        'Not sure if below is necessary
        'SolverSave SaveArea:=Cells(row, "J").Address & "," & Cells(row,"K").Address
    Next row
End Sub

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

Sub SolveTwo()

    Dim myRow As Integer

    For myRow = 3 To 21
        With Worksheets(2)
            .Cells(myRow, "U") = myRow
            .Cells(myRow, "J") = Worksheets(1).Cells(myRow, "S")
            .Cells(myRow, "K") = Worksheets(1).Cells(myRow, "T")
        End With

        'add your solver code here.

    Next myRow
End Sub

如果您正在执行的工作表是第一个,它将在Worksheets(2)中生成一些结果。此外,不要将Row用作变量名,因为它在VBEditor中使用。

答案 1 :(得分:0)

遇到相同的问题,即仅保留最后一个求解程序调用的解决方案。

这是由Excel for Mac的求解器异步运行引起的,并且求解器宏仅在调用代码完成后才启动。因此,求解器参数会被调用代码重复重置,但是直到最后一次迭代后,求解器才会运行。

目前尚无解决方案,但这是两个解决方法。第一个模块有两个模块:一个常规模块调用一次求解器,另一个第二类模块在工作表计算时触发(求解器在完成时启动重新计算),并调用第二个模块。循环来回迭代。请参阅此处,了解J Peltier的出色解决方案,但我尚未尝试过:solution 1

我使用的解决方案2是从Apple Script调用求解器。这是一个例子。宏中的控制流将工作表单元格用于循环计数器等,而我的宏被shift-opt-cmd-O调用。我的求解器通常在10秒内完成,所以我等待了15秒。

on run {input, parameters}
-- Click “Microsoft Excel” in the Dock.
set timeoutSeconds to 2.0
set uiScript to "click UI Element \"Microsoft Excel\" of list 1 of application process \"Dock\""
my doWithTimeout(uiScript, timeoutSeconds)
-- Press ⇧⌥⌘O
repeat 496 times
    set timeoutSeconds to 2.0
    set uiScript to "keystroke \"Ø\" using {shift down, option  down, command down}"
    my doWithTimeout(uiScript, timeoutSeconds)
    delay 15
    say "done"
end repeat
return input
end run

希望有帮助!