这里的第一次海报,业余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.
提前感谢您的帮助!
答案 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