框架;压力测试“;Excel模型

框架;压力测试“;Excel模型,excel,vba,Excel,Vba,我有一个“黑盒”excel模型,有一张工作表。它有两个输入,分别命名为“Input1”和“Input2”,还有一个输出,分别命名为“output”。我写了一个宏来测试这个模型对输入变化的敏感性,但我想知道是否有更优雅的方法来做到这一点: 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

我有一个“黑盒”excel模型,有一张工作表。它有两个输入,分别命名为“Input1”和“Input2”,还有一个输出,分别命名为“output”。我写了一个宏来测试这个模型对输入变化的敏感性,但我想知道是否有更优雅的方法来做到这一点:

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

这个宏的问题是,它要求每个输入变量都有一个for循环,如果有多个输入,就会变得相当乏味。我试图找出是否有一种方法可以对其进行编码,这样我就可以定义
n
输入(命名为“Input1”、“Input1”到“Inputn”),以及它们的最小值和最大值,并让宏自动循环通过Input1 Inputn的相关值不确定,但这可能就是您要寻找的:只需修改包含参数名称和值范围的数组

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
子测试模型输入()
将SHT模型设置为工作表,将SHT结果设置为工作表
Dim arrNames、arrMin、arrMax、arrStep、arrVals、x
尺寸rw为长,lb、ub、n、增量为布尔值
“####在此处修改输入参数
arrNames=数组(“Input1”、“Input2”、“Input3”)
arrMin=数组(1,1,1)
arrMax=数组(4、5、6)
arrStep=Array(1,1,1)
“####完成参数设置
Set shtModel=thishworkbook.Sheets(“模型”)
Set shtResults=thishworkbook.Sheets(“结果”)
rw=1
arrVals=arrMin
lb=LBound(arrNames)
ub=UBound(arrNames)
n=(ub-lb)+1
shtResults.UsedRange.ClearContents
做
rw=rw+1
对于x=lb至ub
shtModel.Range(arrNames(x)).Value=arrVals(x)
下一个x
带shtResults.行(rw)
.单元格(1).调整大小(1,n).值=arrVals
.Cells(n+1).Value=shtModel.Range(“输出”).Value
以
对于x=lb至ub
如果arrVals(x)
不确定,但这可能就是您要寻找的:只需修改包含参数名称和值范围的数组即可

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
子测试模型输入()
将SHT模型设置为工作表,将SHT结果设置为工作表
Dim arrNames、arrMin、arrMax、arrStep、arrVals、x
尺寸rw为长,lb、ub、n、增量为布尔值
“####在此处修改输入参数
arrNames=数组(“Input1”、“Input2”、“Input3”)
arrMin=数组(1,1,1)
arrMax=数组(4、5、6)
arrStep=Array(1,1,1)
“####完成参数设置
Set shtModel=thishworkbook.Sheets(“模型”)
Set shtResults=thishworkbook.Sheets(“结果”)
rw=1
arrVals=arrMin
lb=LBound(arrNames)
ub=UBound(arrNames)
n=(ub-lb)+1
shtResults.UsedRange.ClearContents
做
rw=rw+1
对于x=lb至ub
shtModel.Range(arrNames(x)).Value=arrVals(x)
下一个x
带shtResults.行(rw)
.单元格(1).调整大小(1,n).值=arrVals
.Cells(n+1).Value=shtModel.Range(“输出”).Value
以
对于x=lb至ub
如果arrVals(x)
输入是否需要如您所示嵌套,还是可以是线性的?@Doug Glancy我不知道您的意思。在我展示的示例中,我想在我定义的范围内测试“Input1”和“Input2”的所有可能组合。也可以在这里看到:我指的是嵌套循环,j在I的内部。这似乎没有必要。看起来每个循环都可以遵循上一个循环。无论如何,我认为@jtolle的建议是好的。如果它对你有效,也许你可以在这里发布一个答案,并且为了完整起见接受它。输入是否需要像你所展示的那样嵌套,或者是线性的?@Doug Glancy我不确定你的意思。在我展示的示例中,我想在我定义的范围内测试“Input1”和“Input2”的所有可能组合。也可以在这里看到:我指的是嵌套循环,j在I的内部。这似乎没有必要。看起来每个循环都可以遵循上一个循环。无论如何,我认为@jtolle的建议是好的。如果它对你有效,也许你可以在这里发布一个答案,并且为了完整起见接受它。所以如果我决定我需要4个输入,我只需要在每个参数数组中添加第4个值?我喜欢它,谢谢你的回答。所以,如果我决定需要4个输入,我只需要在每个参数数组中添加第4个值?我喜欢,谢谢你的回答。