下标超出范围错误,指定数组循环的范围

时间:2018-04-12 02:23:54

标签: arrays vba loops outofrangeexception

我的下标超出范围错误。

数组循环的范围一定存在问题,但我觉得范围是声明的,我引用的相应最小值和最大值应该在它们各自数组中的相同位置。

我尝试过Redim(但可能不正确),并明确指定了数组的维度(1到36),但可能也没有正确。

下标超出范围错误发生在For j = MinAllocation(i) To MaxAllocation(i)

'declare variables
Dim Sharpe As Variant
Dim CurrentAllocation As Variant
Dim MaxAllocation As Variant
Dim MinAllocation As Variant
Dim TrialAllocation As Variant
Dim BestAllocation As Variant


inc = Sheet1.Range("B59").Value

'populate variables
CurrentAllocation = Sheet1.Range("S2:S37").Value
MaxAllocation = Sheet1.Range("N2:N37").Value
MinAllocation = Sheet1.Range("P2:P37").Value
TrialAllocation = Sheet1.Range("G2:G37").Value

'Populate trial range with current allocation and populate current Sharpe Ratio
Sheet1.Range("G2:G37").Value = CurrentAllocation
Sharpe = Sheet1.Range("B53").Value

'loop through each cell in the array
Dim i As Long
Dim j As Long


For i = LBound(TrialAllocation) To UBound(TrialAllocation)


   'loop through each possible integer in current cell from corresponding minimum to corresponding maximum
    For j = MinAllocation(i) To MaxAllocation(i) Step inc
    TrialAllocation(i) = j

    'check the total of the trial array and populate worksheet with trial data if the total of the array equals 100 and update timer
    Total = WorksheetFunction.Sum(TrialAllocation)


    If Total = 100 Then
    Sheet1.Range("G2:G37").Value = TrialAllocation

    'Determine how many seconds code took to run
    SecondsElapsed = Round(Timer - StartTime, 2)
    Sheet1.Range("Z42").Value = (SecondsElapsed / 86400)

    'store the trial array if the Sharpe Ratio is greater than the previous highest Sharpe Ratio and further constraints are met (B57 = 0)
    If Sheet1.Range("B53").Value > Sharpe And Sheet1.Range("B57").Value = 0 
    Then
    Sharpe = Sheet1.Range("B53").Value
    BestAllocation = Sheet1.Range("g2:g37").Value

    End If
    End If

    Next Step inc
Next

1 个答案:

答案 0 :(得分:0)

当您获取一系列多个连续单元格的Value属性时,您将获得值的二维数组。如果您在观察窗口中检查MinAllocation,您会看到它类似于“变体/变体(1到36,1到1)”

要从2D数组中获取特定值,您需要为数组的两个维指定下标。因此,MinAllocation(i)将变为MinAllocation(i, 1),依此类推其他数组。

LBoundUBound函数可以使用参数来指定要检查的维度,但是,如果省略此参数,则会检查指定数组的第一个维度。这就是为什么对TrialAllocation的界限的检查没有失败并且似乎产生合理的值