ここに初めてのアマチュアVBA-ist。私はMatlabで過去のコードロジックを経験しましたが、VBAが私を超えていることがわかりました。以下は、複数のピークを持つ特定のデータセットのローカル最小値と最大値を決定するために使用しているコードです。残念ながら、データは "ノイズが多い"ものです。メーターの読みの変動による真の極値との間の傾向に従うと、複数の極大/極小があることを意味します。
私は、最大値が決して問題には見えないので、私が他の場所で見つけたコードを編集しました。しかし、それが星印された行(lngCnt = lngCnt + 1の第2ラウンド)に到達すると、「ランタイムエラー9:添え字が範囲外です」があります。私は問題を研究しようとしましたが、それを修正するために何が処方されているのか理解できず、答えが私のコードにどのように適用されているのか見ることができませんでした。私が使用しています。ここ最小値、下付き文字の範囲外エラーを確認する
が私のコードです:(省略記号は、その傾向の継続を表して約55分の期間にわたって、)データの
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
サンプルセットは次のようになります。
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の代わりに配列値を使用していました。
ありがとうございました!
スターを付けた行は「下付き範囲外」エラーが発生することはありません - あなたは確信していますそれは問題の行ですか? –
また、あなたの 'X'は寸法(#rows、3)を持っていますので、転置' Y'は(3、#rows)になります。 Redim Preserveを使用して*両方のディメンションを調整することはできません。これは、任意の多次元配列の最後のディメンションでのみ機能します。 –
ありがとうございました! redng文が、lngCnt(私には意味をなさない)を示すデバッグにもかかわらず、添え字エラーを投げていたことが判明しました。 @TimWilliams 2番目の質問については、それを達成する簡単な方法はありますか? –