2015-10-24 6 views
2

Код ниже отлично работает в первый раз, когда я запускаю его,Solver Не работает во второй раз, когда я запускаю его

Но когда я запускаю его снова во второй или третий раз, то

его дает мне msgbox, который из решателя говорит, что нашел решение, затем, когда я нажимаю select OK

он просто выходит из под. Не понимаю, почему.

Также я хотел знать, как дать команду OK запросу из диалогового окна Solver через vba? Или просто избегайте этого.

Option Explicit 
Sub MinimizeCost() 

Dim wm, ws, wr As Worksheet 
Dim i, j, FinalRow As Long 
Dim char As Variant 
Dim ScnCap, ScnDem As Range 

Set wm = Sheets("Model") 
Set ws = Sheets("Scenarios") 
Set wr = Sheets("Results") 

For i = 1 To 5 

With ws 
j = i + 1 
    Set ScnCap = .Range(.Cells(5, j), .Cells(7, j)) 
End With 

wm.Range("Capacities") = ScnCap.Value 

With ws 
j = i + 1 
    Set ScnDem = .Range(.Cells(10, j), .Cells(13, j)) 
End With 

ScnDem.Copy 
wm.Range("Demands").PasteSpecial Transpose:=True 

Call Solveit 

FinalRow = wr.Range("A9000").End(xlUp).Row 
FinalRow = FinalRow + 1 

wr.Range("A" & FinalRow + 1) = "Scenario" & " " & i 
wr.Range("A" & FinalRow + 2) = "Shipments" 
wr.Range("F" & FinalRow + 2) = "Total Cost" 

wm.Range("TotalCost").Copy 
wr.Range("F" & FinalRow + 3).PasteSpecial xlPasteValues 

wm.Range("Shipped").Copy 
wr.Range("A" & FinalRow + 3).PasteSpecial xlPasteValues 

SendKeys ("{ESC}") 
wm.Range("A1").Select 
Next i 
End Sub 

Sub Solveit() 

Dim wk As Worksheet 
Set wk = Sheets("Model") 
wk.Select 
    SolverOk SetCell:="$B$20", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$13:$F$15", _ 
     Engine:=2, EngineDesc:="Simplex LP" 
    SolverOk SetCell:="$B$20", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$13:$F$15", _ 
     Engine:=2, EngineDesc:="Simplex LP" 
    SolverSolve 

End Sub 

ответ

0

На microsoft website, это объясняет все о sovler в Excel-VBA. Замена вашей SolverSolve построчно

SolverSolve UserFinish:=True 

следует избегать MsgBox всплывал в конце.

По вопросу о неправильном втором запуске решения я предлагаю добавить SolverReset в начале функции Solveit(). Как объяснено here, это приведет к сбросу ячейки, что может быть проблемой при многократном запуске решателя. А также, вы не должны иметь 2 SolverOk набор в решатель, особенно если они имеют те же свойства ... В конце концов, что-то, как это должно сделать работу:

Sub Solveit() 

Dim wk As Worksheet 
Set wk = Sheets("Model") 
wk.Select 

SolverReset 
SolverOk SetCell:="$B$20", MaxMinVal:=2, ValueOf:=0, _ 
    ByChange:="$C$13:$F$15", Engine:=2, EngineDesc:="Simplex LP" 
SolverSolve UserFinish:=True 

End Sub 

И К Кстати, будьте осторожны с утверждением, как:

wm.Range("Shipped").Copy 
wr.Range("A" & FinalRow + 3).PasteSpecial xlPasteValues 

VBA обрабатывает копирования/вставки очень плохо, если вы просто хотите, чтобы скопировать значение клетки на другую (также работает с Range данных они имеют одинаковую размерность), просто написать:

wr.Range("A" & FinalRow + 3).value = wn.Range("Shipped").value 

Это сделает ваш код более понятным для отладки и более быстрого запуска.