プロが教えるわが家の防犯対策術!

どうしても出来ないので教えていただきたいのですが

エクセルでA列に延々と数値データが入っています
グラフにするとノイズのような小さな山が続いて次に大きな山が二つでき
またノイズのような小さな山が続く

ってこんな感じの数値データなのですが
このデータから一つ目の大きな山の最大値を抽出したいんです
一つ目の山の方が大きいとは限らないので
MAX関数は使えません
山はデータ中のどこにできるかわからないので
何行から何行までって限定することもできません

わかり辛い表現で申し訳ないのですが
よろしくお願いします

A 回答 (6件)

恐らくVBAでないと難しいと思われます。


(関数でもやろうと思えば出来なくもない気はしますが・・・)
問題は、大きな山と言っていますが、何をもって大きな山とするかということです。
ある数値を基準にその数値を超えたら大きな山とするのか、隣合う数値を比較し、数値差がある値以上であれば大きな山とするかです。
そのポイントさえ決めてしまえば、後はそんなに難しくないと思います。

この回答への補足

わかりずらい表現ですいません
実は機械を動作させたときの電流を計測しているのですが
電源オンから動作を終了するまでの電流で最初は全くのノイズが出ている状態からスタートして動作電流が流れてまたノイズに戻るって感じの波形になります

動作電流とノイズははっきりと区別できるくらいの違いがあります山はふたこぶらくだのこぶみたいな感じで出るので
その一つ目の山のピーク値がとりたいんです

補足日時:2006/08/31 19:02
    • good
    • 0
この回答へのお礼

質問しながら、忘れた頃の締め切りになって
本当にすいませんでした
結局、うまくいかず未だグラフより、数値を読みとっております
どうもありがとうございました

お礼日時:2007/12/23 11:39

構想だけですが。


まずノイズをカットするために、使えないとおっしゃる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でなんとかなりませんか?

この回答への補足

回答ありがとうございます
やってみたんですけど、確かにノイズはカットできますが、やはり最初の山のピーク値をどうやって抽出すればいいのかが、わかりません
わかりづらい表現で申し訳ないのですが
よろしくおねがいします

補足日時:2006/08/31 19:07
    • good
    • 0

こんにちは。



元のデータは何ですか?
株価の推移の曲線のそれぞれを山を出すものに似ています。その上に点(散布図のマーカー)を乗せます。

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,"")

これで、それぞれの山が取れます。
区間の幅は、ご自身でお決めください。

なお、散布図で、マーカーを取る時は、同じ項目軸を取らないと、まったく違う場所に行ってしまいます。

この回答への補足

回答ありがとうございます
データは電流値でグラフとしてはふたこぶらくだのこぶのような形になります
これの一つ目の山のピーク値を出したいんです

補足日時:2006/08/31 19:29
    • good
    • 0

こんばんは。

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)

となります。ただし、あくまでも、区間の取り方によって、山の数が変わります。

でも、確か、きれいな山を描いているなら、例えば、ヒストグラムのふたこぶの山とかなら、別の方法があったような気がします。
    • good
    • 0
この回答へのお礼

質問しながら、忘れた頃の締め切りになって
本当にすいませんでした
結局、うまくいかず未だグラフより、数値を読みとっております
どうもありがとうございました

お礼日時:2007/12/23 11:38

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は調整願います。
    • good
    • 0

試して戴けましたでしょうか?

この回答への補足

回答ありがとうございました
すいません会社ではパソコンを何人かで共有しておりまして、まだ試せていません
一度ためしてからお礼をと思っていましたので
返事が遅れています

補足日時:2006/09/12 06:10
    • good
    • 0
この回答へのお礼

質問しながら、忘れた頃の締め切りになって
本当にすいませんでした
結局、うまくいかず未だグラフより、数値を読みとっております
どうもありがとうございました

お礼日時:2007/12/23 11:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています