【发布时间】:2021-01-03 10:50:32
【问题描述】:
我今天注意到一些新的东西,这会在未来给我带来关于 Excel 求解器的问题,所以我想了解一下。
我正在使用 VBA 顺序应用求解器向下移动工作表(假设此工作表属于“工作簿 1”)。这一切都很好,我对 Solver 的结果很满意。耶...我担心的是:当我打开第二个相当大的工作簿(我们称之为“工作簿 2”)时,它与我当前的工作簿绝对没有链接,求解器的运行时间大约是 20 倍。
当然,最合理的做法是在 Solver 运行时不打开“工作簿 2”。现在这是我的解决方案,但是,在不久的将来,我需要同时打开两个工作簿。所以我提出以下问题:
为什么求解器在打开两本书的情况下运行需要更长的时间,即使它甚至没有触及其中一本?
如果怀疑者担心我的代码在这里做一些不寻常的事情,那就是:
Sub ExampleSeqSolver()
Dim Iter As Long
Dim Time0 As Double
Dim Duration As Double
Application.ScreenUpdating = False
' Solver requires that it is working on the 'active sheet', silly but w/e
Sheets("Sheet1").Activate
' watch optimization efficiency
Time0 = Timer
For Iter = 2 To 13
' my data are sometimes related to adjacent rows so I was considering supplying an initial solution to reduce the number of runs
' Sheets("Sheet1").Range("$AC$" & ITER & ":$AI$" & ITER) = _
' Sheets("Sheet1").Range("$AC$" & ITER - 1 & ":$AI$" & ITER - 1)
If Cells(Iter, 1) <> 0 Then
SolverReset
SolverOptions AssumeNonNeg:=True, Iterations:=100
SolverAdd CellRef:="$AK" & Iter, Relation:=2, FormulaText:="1"
SolverOK SetCell:="$AW$" & Iter, MaxMinVal:="2", ByChange:=Sheets("Sheet1").Range("$AC$" & Iter & ":$AI$" & Iter), Engine:=1
SolverSolve True
End If
Next Iter
' report optimization duration
Duration = Round(Timer - Time0, 2)
MsgBox "Optimization finished in " & Duration & " seconds", vbInformation
Application.ScreenUpdating = True
End Sub
【问题讨论】:
-
你有没有测试过设置
Application.Calculation到xlCalculationManual有什么效果? (我认为即使整体计算方法是“手动”,Solver 也会强制计算活动工作表。) -
“为什么求解器在打开两本书时需要更长的时间才能运行,即使它甚至没有触及其中一本?” > 可能是因为你没有足够的 RAM/Memory,这也是现在 32 位软件的问题。
-
@YowE3K 好主意!我在想同样的事。起初犹豫尝试,因为我担心我的目标函数不会更新。试一试,没有变化。我认为计算方法可能总是在应用程序级别处理(即使求解器正在控制它。即,一切都被设置回自动)。好主意,谢谢!
-
@KDavis,这是可能的。请原谅我对内存分配的无知,但是如果我查看任务管理器,我有大约 4G 的空闲空间,而 Excel 只使用了大约 200,000 K。这是否意味着我没有对系统或 32 位应用程序限制施加压力?