指定数组循环范围的下标超出范围错误
Subscript out of range error specifying the range of the loop of an array
我有一个下标超出范围的错误。
一定是数组循环的范围有问题,但我觉得范围是声明的,我引用的相应最小值和最大值应该在它们各自数组中的相同位置。
我试过 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
当您获取一系列多个连续单元格的 Value
属性 时,您会得到一个二维数组的值。如果你检查手表 window 中的 MinAllocation
,你会看到它类似于 "Variant/Variant(1 to 36, 1 to 1)"
要从二维数组中获取特定值,您需要为数组的两个维度指定下标。因此,MinAllocation(i)
将变为 MinAllocation(i, 1)
等其他数组。
LBound
和 UBound
函数可以带一个参数来指定要检查的维度,但是当省略时,将检查指定数组的第一个维度。这就是为什么 TrialAllocation
的边界检查没有失败并且似乎产生了合理的值
我有一个下标超出范围的错误。
一定是数组循环的范围有问题,但我觉得范围是声明的,我引用的相应最小值和最大值应该在它们各自数组中的相同位置。
我试过 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
当您获取一系列多个连续单元格的 Value
属性 时,您会得到一个二维数组的值。如果你检查手表 window 中的 MinAllocation
,你会看到它类似于 "Variant/Variant(1 to 36, 1 to 1)"
要从二维数组中获取特定值,您需要为数组的两个维度指定下标。因此,MinAllocation(i)
将变为 MinAllocation(i, 1)
等其他数组。
LBound
和 UBound
函数可以带一个参数来指定要检查的维度,但是当省略时,将检查指定数组的第一个维度。这就是为什么 TrialAllocation
的边界检查没有失败并且似乎产生了合理的值