确定最小值,下标超出范围误差

时间:2016-05-25 20:38:44

标签: excel vba excel-vba

这里的第一次海报,业余VBA-ist。我已经在Matlab中获得了过去的代码逻辑经验,但我发现VBA超出了我的范畴。下面是我用来确定具有多个峰值的特定数据集的局部最小值和最大值的代码。不幸的是,数据是“嘈杂”;意思是有多个局部最大值/最小值,因为我们遵循由于抄表波动引起的真实极值之间的趋势。
我已经编辑了一些我在别处找到的代码,我认为它会确定这些真正的最小点(我可以通过流量开始/停止时确定它们),因为最大值似乎永远不会成为问题。但是当它到达星号行(第二轮lngCnt = lngCnt + 1)时,会出现“运行时错误9:下标超出范围”。我试图研究这个问题,但是我无法理解修复它的规定,或者看看答案是如何应用于我的代码的。

这是我正在使用的代码:

Sub maxmin()
Dim X
Dim Y
Dim lngRow As Long
Dim lngCnt As Long

X = Range([A2], Cells(Rows.Count, "C").End(xlUp)) 'self defining function for the range over which the data will be analyzed, data in spreadsheet must start in L26
Y = Application.Transpose(X) 'creates a column rather than a row


For lngRow = 2 To UBound(X, 1) - 1 'defines the function for the long variable row, to the upper bound of the column
    If X(lngRow, 3) > X(lngRow - 1, 3) Then 'logic statement to assist in max/min
        If X(lngRow, 3) > X(lngRow + 1, 3) Then 'logic statement
            lngCnt = lngCnt + 1
            Y(1, lngCnt) = X(lngRow, 1)
            Y(2, lngCnt) = X(lngRow, 2)
            Y(3, lngCnt) = X(lngRow, 3)
        End If
    Else
        If X(lngRow - 1, 1) < 100 Then 'this and the following line determine where the min is located based off the change in flow rate
            If X(lngRow, 1) > 150 Then
                lngCnt = lngCnt + 1
                Y(1, lngCnt) = X(lngRow, 1)
                Y(2, lngCnt) = X(lngRow, 2)
                Y(3, lngCnt) = X(lngRow, 3)
            End If
        End If
    End If
Next lngRow

ReDim Preserve Y(1 To 3, 1 To lngCnt)

Range("D2:F4300 ") = Application.Transpose(Y) 'prints my data to desired cells
End Sub

样本数据集(大约55分钟的时间段,其中椭圆代表该趋势的延续)将为:

0    3000  
0    2900  
0    2850  
0    2825  
0    2800  
24   2800  
23   2775   
21   2775  
19   2750  
170  3400  
245  3600  
290  3800  
290  4000  
290  4200  
...  
305  11600  
175  11800  
23   11700  
19   11600  
20   11500  
0    11400  
0    11300  
0    11200  
0    11100  

使用该行编制索引会给我一个下标错误吗?

此外,任何人都可以提供更好的方法将我的输出数组扩展到这个需要的单元格吗?我已经尝试使用lngCnt值,但它不起作用。以前,代码使用数组值代替100和150.

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

Range("D2:F4300") = Application.Transpose(Y)

可能是

Range("D2").resize(Ubound(Y,2), Ubound(Y,1)).Value = Application.Transpose(Y)

如果没有转置,你可以翻转边界:

Range("D2").resize(Ubound(Y,1), Ubound(Y,2)).Value = Y