【问题标题】:VBA Solver Loop Keeps Only Last Loop ResultsVBA 求解器循环仅保留最后一个循环结果
【发布时间】:2017-11-20 16:48:37
【问题描述】:

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

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

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

我正在使用 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

【问题讨论】:

    标签: vba excel for-loop solver


    【解决方案1】:

    有同样的问题,即只保留最后一次求解器调用的解决方案。

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

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

    我使用的解决方案 2 是从 Apple 脚本调用求解器。这是一个例子。宏中的控制流将工作表单元格用于循环计数器等,我的宏由 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
    

    希望有帮助!

    【讨论】:

      【解决方案2】:

      试试这样的:

      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 中使用。

      【讨论】:

      • 它仍然只将结果保存在 J21 和 K21 中,没有其他行,即使它似乎在计算它们。
      • 我已经修改了“row”变量。 :)
      猜你喜欢
      • 2020-05-06
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2013-03-08
      • 2015-06-17
      相关资源
      最近更新 更多