2016-05-25 11 views
1

ここに初めてのアマチュア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の代わりに配列値を使用していました。

ありがとうございました!

+0

スターを付けた行は「下付き範囲外」エラーが発生することはありません - あなたは確信していますそれは問題の行ですか? –

+0

また、あなたの 'X'は寸法(#rows、3)を持っていますので、転置' Y'は(3、#rows)になります。 Redim Preserveを使用して*両方のディメンションを調整することはできません。これは、任意の多次元配列の最後のディメンションでのみ機能します。 –

+0

ありがとうございました! redng文が、lngCnt(私には意味をなさない)を示すデバッグにもかかわらず、添え字エラーを投げていたことが判明しました。 @TimWilliams 2番目の質問については、それを達成する簡単な方法はありますか? –

答えて

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 
+0

ありがとう!私は本当にあなたの助けに感謝します –

関連する問題