2014-12-15 5 views
1

Я пытаюсь настроить цикл для Solver для данных, хранящихся в 300 столбцах. Это то, что я до сих пор:VBA Excel Solver Code - Looping by Columns

Sub SolverProp() 

    SolverReset 

    SolverOk SetCell:="$B$20", MaxMinVal:=3, ValueOf:="$B$3", ByChange:="$B$28", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 


    SolverSolve 

End Sub 

Этот код решает, что мне нужно для данных, содержащихся в столбце B. Он изменяет B28 до B20 не равна B3. Я пытаюсь сделать это так, чтобы на каждые 300 случаев (настроенных точно так же) он решает уравнение. Например, чтобы решить столбец C код будет выглядеть следующим образом:

Sub SolverProp() 

    SolverReset 

    SolverOk SetCell:="$C$20", MaxMinVal:=3, ValueOf:="$C$3", ByChange:="$C$28", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 


    SolverSolve 

End Sub 

ответ

1

Вы можете использовать свойство Address объекта Range перебрать все 300 столбцов.

Прежде всего вам понадобятся 3 переменные для хранения местоположений SetCell, ValueOf и ByChange.

Dim setCellRange as Range, valueOfRange as Range, byChangeRange as Range 

Set setCellRange = ActiveSheet.Range("B20") 
Set valueOfRange = ActiveSheet.Range("B3") 
Set byChangeRange = ActiveSheet.Range("B28") 

Затем вы можете использовать следующий цикл для итерации по каждому столбцу.

Dim i as Long 

For i = 1 to 300 

    SolverReset 

    SolverOk SetCell:=setCellRange.Address, MaxMinVal:=3, ValueOf:=valueOfRange.Address, ByChange:=byChangeRange.Address, _ 
    Engine:=1, EngineDesc:="GRG Nonlinear" 


    SolverSolve 

    Set setCellRange = setCellRange.Cells(1, 2) 
    Set valueOfRange = valueOfRange.Cells(1, 2) 
    Set byChangeRange = byChangeRange.Cells(1, 2) 

Next i 

Надеюсь, это поможет!

+0

@YYi Hu Это выглядит многообещающим, но я получаю сообщение об ошибке в сообщении solver, когда я его выполняю. Вот он: Ошибка в модели. Убедитесь, что все ячейки и ограничения действительны. –

0

Я выбрал указанное выше, поскольку оно обеспечивает рабочее решение. Чтобы добавить к нему, мне пришлось изменить модель, поскольку кажется, что свойство ValueOf не будет принимать диапазон в качестве входных данных, мне пришлось переработать мой модуль, чтобы он возвращал 0 при выполнении условий. Итерационная часть вышеуказанного ответа в порядке, и я принял это как ответ.