- ベストアンサー
エクセルでもVBAでもいいのですが
どうしても出来ないので教えていただきたいのですが エクセルでA列に延々と数値データが入っています グラフにするとノイズのような小さな山が続いて次に大きな山が二つでき またノイズのような小さな山が続く ってこんな感じの数値データなのですが このデータから一つ目の大きな山の最大値を抽出したいんです 一つ目の山の方が大きいとは限らないので MAX関数は使えません 山はデータ中のどこにできるかわからないので 何行から何行までって限定することもできません わかり辛い表現で申し訳ないのですが よろしくお願いします
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2006/9/3 ユーザー名 : ' ' NoizeCut = 2 lastl = Range("A65536").End(xlUp).Row Range("B1").FormulaR1C1 = "=MAX(C[-1])/" & NoizeCut Range("B2:B" & lastl).FormulaR1C1 = "= IF(RC[-1]<R1C,0,RC[-1])" Range("C2:C" & lastl).FormulaR1C1 = "=IF(RC[-1]=0,0,R[-1]C+1)" yama1num = WorksheetFunction.Max(Range("C2:C" & lastl)) yama1row = WorksheetFunction.Match(yama1num, Range("C2:C" & lastl), 0) - yama1num + 2 Debug.Print yama1num, yama1row Range("C" & yama1row & ":C" & yama1row + yama1num - 1).ClearContents yama2num = WorksheetFunction.Max(Range("C2:C" & lastl)) yama2row = WorksheetFunction.Match(yama2num, Range("C2:C" & lastl), 0) - yama2num + 2 Debug.Print yama2num, yama2row If yama2row < yama1row Then yama1row = yama2row yama1num = yama2num End If MsgBox "最初の山の最大値は" & WorksheetFunction.Max(Range("A" & yama1row & ":A" & yama1row + yama1num - 1)) End Sub でっちあげです。NoizeCutは調整願います。
その他の回答 (5)
- yokomaya
- ベストアンサー率40% (147/366)
試して戴けましたでしょうか?
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。Wendy02です。 例えば、私の#3の例で言えば、 時系列に対して、 1つ目 =INDEX(B1:C25,SMALL(INDEX((C2:C26<>"")*ROW(C2:C26),,),COUNTIF(C2:C26,"")+1),1) 2つ目 =INDEX(B1:C25,SMALL(INDEX((C2:C26<>"")*ROW(C2:C26),,),COUNTIF(C2:C26,"")+2),1) となります。ただし、あくまでも、区間の取り方によって、山の数が変わります。 でも、確か、きれいな山を描いているなら、例えば、ヒストグラムのふたこぶの山とかなら、別の方法があったような気がします。
お礼
質問しながら、忘れた頃の締め切りになって 本当にすいませんでした 結局、うまくいかず未だグラフより、数値を読みとっております どうもありがとうございました
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 元のデータは何ですか? 株価の推移の曲線のそれぞれを山を出すものに似ています。その上に点(散布図のマーカー)を乗せます。 VBAでは、特殊なアルゴリズムを使って出しますが、そういうコードは、逆にむつかしくなるような気がします。株価とは限りませんが、以下のようなサンプルを作ってみました。 (行数は省略:1行目から) サンプル A B C 1 高値 高値更新 区間高値 115.8 115.9 116.1 115.7 115.9 116.9 116.9 116.9 116.9 118.3 118.3 119.4 119.4 122.3 122.3 125.0 125.0 125.0 123.4 125.7 125.7 126.3 126.3 126.3 123.7 123.9 124.0 121.9 120.4 116.9 116.9 120.0 123.0 123.0 123.0 118.7 B7 からの数式 (区間は5行) = 5日間 =IF(A7>MAX(A2:A6),A7,"") C2 からの数式 =IF(AND(B2>0,B3=""),B2,"") これで、それぞれの山が取れます。 区間の幅は、ご自身でお決めください。 なお、散布図で、マーカーを取る時は、同じ項目軸を取らないと、まったく違う場所に行ってしまいます。
補足
回答ありがとうございます データは電流値でグラフとしてはふたこぶらくだのこぶのような形になります これの一つ目の山のピーク値を出したいんです
- yokomaya
- ベストアンサー率40% (147/366)
構想だけですが。 まずノイズをカットするために、使えないとおっしゃるMAXを算出して、その2~5分の一(適切な値は自分で決めて下さい)以下のデータは無視します。 例えばB列が空きなら、B1に =MAX(A1:A65536)/3 [仮に3/1を適用する場合] B2に =IF(A2<B$1,0,A2) それを下方向にオートフィルします。 その結果残ったデータで山というのはノイズと見なされなかったデータが連続している部分になるかと思います。 C3に =IF(B3=0,0,C2+1) それを下方向にオートフィルすると連続している部分がよくわかるので後はVBAでなんとかなりませんか?
補足
回答ありがとうございます やってみたんですけど、確かにノイズはカットできますが、やはり最初の山のピーク値をどうやって抽出すればいいのかが、わかりません わかりづらい表現で申し訳ないのですが よろしくおねがいします
- tk-p
- ベストアンサー率75% (6/8)
恐らくVBAでないと難しいと思われます。 (関数でもやろうと思えば出来なくもない気はしますが・・・) 問題は、大きな山と言っていますが、何をもって大きな山とするかということです。 ある数値を基準にその数値を超えたら大きな山とするのか、隣合う数値を比較し、数値差がある値以上であれば大きな山とするかです。 そのポイントさえ決めてしまえば、後はそんなに難しくないと思います。
お礼
質問しながら、忘れた頃の締め切りになって 本当にすいませんでした 結局、うまくいかず未だグラフより、数値を読みとっております どうもありがとうございました
補足
わかりずらい表現ですいません 実は機械を動作させたときの電流を計測しているのですが 電源オンから動作を終了するまでの電流で最初は全くのノイズが出ている状態からスタートして動作電流が流れてまたノイズに戻るって感じの波形になります 動作電流とノイズははっきりと区別できるくらいの違いがあります山はふたこぶらくだのこぶみたいな感じで出るので その一つ目の山のピーク値がとりたいんです
お礼
質問しながら、忘れた頃の締め切りになって 本当にすいませんでした 結局、うまくいかず未だグラフより、数値を読みとっております どうもありがとうございました
補足
回答ありがとうございました すいません会社ではパソコンを何人かで共有しておりまして、まだ試せていません 一度ためしてからお礼をと思っていましたので 返事が遅れています