2016-03-14 63 views
0

所以这是我的问题。我正在尝试编写一个使用求解器执行函数的循环。基本上它从一个单元开始,运行求解器,将目标和约束单元移动到正确的单元,解决,移动目标和约束单元到右边14,解决,右边一个,解决,右边14解决,直到它找到一个空白。Excel中的VBA循环与求解器

这里是前几行代码,告诉你我在长版本中做什么。

Range("RI6").Select 
    SolverOk SetCell:="$RI$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$RG$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$RI$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$RI$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("RJ16").Select 
    SolverOk SetCell:="$RJ$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$RJ$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$RJ$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$RJ$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("RX16").Select 
    SolverOk SetCell:="$RX$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$RX$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$RX$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$RX$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("RY16").Select 
    SolverOk SetCell:="$RY$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$RY$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$RY$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$RY$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("SM16").Select 
    SolverOk SetCell:="$SM$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$SM$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$SM$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$SM$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("SN16").Select 
    SolverOk SetCell:="$SN$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$SN$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$SN$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$SN$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("TB16").Select 
    SolverOk SetCell:="$TB$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$TB$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$TB$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$TB$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("TC16").Select 
    SolverOk SetCell:="$TC$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$TC$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$TC$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$TC$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("TQ16").Select 
    SolverOk SetCell:="$TQ$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$TQ$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$TQ$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$TQ$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("TR16").Select 
    SolverOk SetCell:="$TR$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$TR$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$TR$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$TR$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("UF16").Select 
    SolverOk SetCell:="$UF$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$UF$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$UF$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$UF$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 
Range("UG16").Select 
    SolverOk SetCell:="$UG$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$UG$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$UG$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$UG$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 

非常感谢您的任何帮助/建议。

+0

您似乎没有任何问题。你的代码是否真的有用?如果是这样 - 你可以通过循环缩短它。 –

+0

如果你需要编写循环的帮助,那么你可能想看看下面的网站:http://www.homeandlearn.org/excel_vba_for_loops.html – Ralph

+0

我的问题是如何做细胞运动,我试图循环,不能让它正常工作。代码在写出很长的路时起作用,但不是当我尝试循环时。 –

回答

0

第一部分与其他部分看起来不同,所以我没有将它包含在“循环”中,但是如果差异是由于拼写错误,它会很容易添加。

Range("RI6").Select 
    SolverOk SetCell:="$RI$16", MaxMinVal:=3, ValueOf:=0.15, ByChange:="$RG$1", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$RI$1", Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:="$RI$1", Relation:=1, FormulaText:="87" 
    SolverSolve (True) 

的一种方式循环将如下:

Dim Temp As String, TempArray As Variant 

    TempArray = Array("RJ16", "RX16", "RY16", "SM16", "SN16", "TB16", "TC16", "TQ16", "TR16", "UF16", "UG16") 
    For i = 0 To UBound(TempArray) 
     Range(TempArray(i)).select 
     Temp = Cells(1, Range(TempArray(i)).Column).Address 
     SolverOk SetCell:=TempArray(i), MaxMinVal:=3, ValueOf:=0.15, ByChange:=Temp, Engine:=1, EngineDesc:="GRG Nonlinear" 
     SolverAdd CellRef:=Temp, Relation:=3, FormulaText:="74" 
     SolverAdd CellRef:=Temp, Relation:=1, FormulaText:="87" 
     SolverSolve (True) 
    Next i 
1

未经测试,但也许像...

Option Explicit 

Sub SolverLop() 
Dim i As Long 
Dim cnt As Integer 
cnt = 0 
For i = 477 To ActiveSheet.UsedRange.Columns.Count 

    SolverReset 
    SolverOk SetCell:=Cells(16, i).Address, MaxMinVal:=3, ValueOf:=0.15, ByChange:=Cells(16, i).Address, _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:=Cells(1, i).Address, Relation:=3, FormulaText:="74" 
    SolverAdd CellRef:=Cells(1, i).Address, Relation:=1, FormulaText:="87" 
    SolverSolve Userfinish:=True 

    cnt = cnt + 1 
    If cnt = 2 Then 
     i = i + 14 
     cnt = 0 
    End If 
Next 

End Sub 

请确保您有在工具求解器检查的参考 - >参考文献 - >求解器。

P.S. 477是与上面例子中起始列“RJ”相关的列号......要获得任何列的列号,只需在空白单元格中输入以下内容:=column(indirect("A2")) ...将“A2”替换为列想要找到的号码。

+0

我正在研究一些非常相似的东西,但是你的更清洁。您应该分享477是列号,或者输入一个转换,以便OP可以输入起始范围,并从中收集列号#。 –