我今天注意到一些新的东西会给我带来有关Excel求解器的问题,所以我想跳上它。
我正在使用VBA依次应用求解器向下移动一张纸(例如,该表属于"工作簿1")。这一切都很好,我对求解器的结果感到满意。是的...我担心的是:当我有第二个相当大的工作簿打开(让我们称此"工作簿2"),这绝对没有与我当前的工作簿的链接时,Solver的运行时间约为20倍。p>自然而然的事情是,最合理的事情是在求解器运行时没有"工作簿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
存在'Workbook 2'的存在是相关的,但不是因果关系。就我而言,有一个特定的工作簿会导致求解器放缓。大多数其他人都没有。导致放缓的工作簿约为4MB。更大的工作簿不会导致放缓。造成放缓的那个并不是我所知的最大知识包含宏或VB。我建议将此问题显示给开发原始求解器的前线系统。