抱歉,这是另一个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
答案 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
希望有帮助!