2011-10-03 164 views
1

我有一个“黑匣子”excel模型与1张。它有2个输入,命名范围为“Input1”和“Input2”,以及一个输出,命名范围为“输出”。我写了一个宏以测试它的输入该模型的变化的敏感度,但我想知道如果有一个更优雅的方式来做到这一点:“压力测试”Excel模型框架

Sub LoopMacro() 

Dim outrow As Integer 
outrow = 1 

For i = 1 To 10 Step 0.5 
    Range("Input1").Value = i 

    For j = 1 To 10 Step 0.5 
     Range("Input2").Value = j 

     Output outrow 
     outrow = outrow + 1 

    Next j 
Next i 
End Sub 

Sub Output(outrow As Integer) 

Sheets("Output").Cells(outrow, 1) = Range("Input1").Value 
Sheets("Output").Cells(outrow, 2) = Range("Input2").Value 
Sheets("Output").Cells(outrow, 3) = Range("Output").Value 

End Sub 

这种宏观的问题是,它需要的为每个输入变量循环,如果我有更多的输入,会变得非常乏味。我试图弄清楚是否有编写代码的方法,以便我可以定义n输入(名为ranged“Input1”,“Input1”,“Inputn”)以及它们的最小值和最大值,并将宏自动循环输入Input1-Inputn的相关值

+0

输入是否需要如您所示嵌套,或者它们可以是线性的? –

+0

@Doug格兰西我不确定你的意思。在我展示的例子中,我想在我定义的范围内测试“Input1”和“Input2”的所有可能组合。 – Zach

+1

在what-if分析菜单下查看Excel“数据表”:http://office.microsoft.com/en-us/excel-help/calculate-multiple-results-by-using-a-data-table- HP010072656.aspx。另见这里:http://stackoverflow.com/questions/4640336/using-a-sheet-in-an-excel-user-defined-function/4640866#4640866 – jtolle

回答

1

不确定,但这可能是您要查找的内容:只需修改包含参数名称和值范围的数组即可。

Sub TestModelInputs() 

    Dim shtModel As Worksheet, shtResults As Worksheet 
    Dim arrNames, arrMin, arrMax, arrStep, arrVals, x 
    Dim rw As Long, lb, ub, n, incr As Boolean 

    '###modify input parameters here 
    arrNames = Array("Input1", "Input2", "Input3") 
    arrMin = Array(1, 1, 1) 
    arrMax = Array(4, 5, 6) 
    arrStep = Array(1, 1, 1) 
    '###done with parameter setup 

    Set shtModel = ThisWorkbook.Sheets("Model") 
    Set shtResults = ThisWorkbook.Sheets("Results") 

    rw = 1 
    arrVals = arrMin 
    lb = LBound(arrNames) 
    ub = UBound(arrNames) 
    n = (ub - lb) + 1 
    shtResults.UsedRange.ClearContents 

    Do    
     rw = rw + 1 
     For x = lb To ub 
      shtModel.Range(arrNames(x)).Value = arrVals(x) 
     Next x 

     With shtResults.Rows(rw) 
      .Cells(1).Resize(1, n).Value = arrVals 
      .Cells(n + 1).Value = shtModel.Range("Output").Value 
     End With 

     For x = lb To ub 
      If arrVals(x) < arrMax(x) Then 
       arrVals(x) = arrVals(x) + arrStep(x) 
       Exit For 
      Else 
       If x = ub Then 
        Exit Do 
       Else 
        arrVals(x) = arrMin(x) 
       End If 
      End If 
     Next x 
    Loop 

End Sub 
+0

所以如果我决定我需要4个输入,我只是添加第四个值到每个参数数组?我喜欢它,谢谢你的回答。 – Zach