[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『折れ線グラフのデータに山と谷の印を付けたい』(正)
いつもお世話になります。
教えてください。
折れ線グラフのデータの山にはMと、谷にはVの印を付けたい。
山も谷もその都度、最初に出た値のみ付けたい。
A列に日付、B列に値、C列に山:谷
C列に入れる数式を教えてください。
下記に参照例を記します。
日付 値 山:谷
10月3日 150
10月4日 140
10月5日 100 V
10月6日 120
10月7日 150
10月11日 160 M
10月12日 140
10月13日 110
10月14日 90 V
10月13日 90
10月14日 110
10月17日 150 M
10月18日 150
10月19日 150
10月20日 140
10月21日 130 V
10月24日 160
10月25日 170 M
10月26日 110
10月27日 110
10月28日 100 V
11月1日 130
宜しくお願いします。
< 使用 Excel:Excel2010、使用 OS:Windows10 >
回答ではありません。
・10月13日、10月14日が 2回登場しているのは、なにか『いじわる』をしているのですか? それとも、単なる記載ミスですか?
・単なる記載ミスで、2回目の 10月13日、10月14日が 10月15日、10月16日だった場合、 10月14日の 90 が V という判定はできないのでは? 10月16日が 80 かもしれませんから。 判定できるとすれば、10月15日で、ここに V ではないですか?
(β) 2016/11/18(金) 20:43
すみません。単なる記載ミスです。
気が付きませんでした。
日付を下記の通り訂正しました。
宜しくお願いします。
日付 値 山:谷
10月3日 150
10月4日 140
10月5日 100 V
10月6日 120
10月7日 150
10月11日 160 M
10月12日 140
10月13日 110
10月14日 90 V
10月17日 90
10月18日 110
10月19日 150 M
10月20日 150
10月21日 150
11月1日 140
11月2日 130 V
11月4日 160
11月7日 170 M
11月8日 110
11月9日 110
11月10日 100 V
11月11日 130
(正) 2016/11/19(土) 01:16
(γ) 2016/11/19(土) 08:29
ありがとうございます。
ご指摘の(1),(2)の件 下記の説明でよろしいでしょうか
イ、本日の値が前日の値より大きく、翌日の値が本日の値より、小さくなったときに本日の値(日)をMとします。
ロ、もし本日の値が前日の値より大きく、翌日以降の値が本日の値と同じの場合は、翌日以降で本日の値より小さくなったときに、同じ値の最初の値(日)をMとします。
ハ、本日の値が前日の値より小さく、翌日の値が本日の値より、大きくなったときに本日の値(日)をVとします。
ニ、もし本日の値が前日の値より小さく、翌日以降の値が本日の値と同じの場合は、翌日以降で本日の値より大きくなったときに、同じ値の最初の値(日)をVとします。
自分はデータでグラフを描いて、目で見てC列にM,Vを入力しました。
>(3)式における、IFやANDの使い方が不明なんですか?
イ、ハに関してはIF,AND関数を使用してできるのですが、ロ、ニの場合(10/14,10/19)の場合の数式ができないのです。
>(4)ラベルを表示する方法は既知のことなんですね?
グラフツール→レイアウト→データラベルの事でしょうか
これでデータに値は表示することはできますが、グラフにM、Vを表示することは知りません。
宜しくお願いします。
(正) 2016/11/19(土) 10:21
Option Explicit
Sub test() Dim cht As Chart Dim ser As Series Dim v Dim i As Long Dim tmp As Long
On Error Resume Next Set cht = ActiveChart On Error GoTo 0 If cht Is Nothing Then MsgBox ("グラフを選択してから実行してください") Exit Sub End If
Set ser = cht.SeriesCollection(1) v = ser.Values
ser.HasDataLabels = False
tmp = 0 For i = 2 To UBound(v) If v(i) > v(i - 1) Then tmp = i ElseIf tmp > 0 Then If v(i) < v(i - 1) Then ser.Points(tmp).HasDataLabel = True ser.Points(tmp).DataLabel.Text = "M" tmp = 0 End If End If Next
tmp = 0 For i = 2 To UBound(v) If v(i) < v(i - 1) Then tmp = i ElseIf tmp > 0 Then If v(i) > v(i - 1) Then ser.Points(tmp).HasDataLabel = True ser.Points(tmp).DataLabel.Text = "V" tmp = 0 End If End If Next
End Sub
(マナ) 2016/11/19(土) 11:42
早速のご教示ありがとうございます。
マクロはどうも慣れないもので、折角教えてもっらても、使い方からよくわかりません。
どうもすみません。
マクロも少しづつ勉強させていただきます。
どなたか数式で教えて下さるのを待っています。
(正) 2016/11/19(土) 12:32
マクロ向きの処理なんですけどねぇ・・
(1) D1セル =COUNT(B:B)+2
(2) C3セル =IF(D3="","",CHOOSE(SIGN(IFERROR(MATCH(D3,D4:INDEX(D:D,$D$1),0),10000)-IFERROR(MATCH(N(NOT(D3)),D4:INDEX(D:D,$D$1),0),10000))+2,"","",IF(D3,"V","M"))) (3) D3セル =IF(B2<B3,0,IF(B3<B2,1,""))
C3:D3を一括選択して、フィルダウン
<結果図> 行 ____A____ _B_ ___C___ _D_ 1 日付 値 山:谷 24 2 10月3日 150 3 10月4日 140 1 4 10月5日 100 V 1 5 10月6日 120 0 : : : : 18 11月4日 160 0 19 11月7日 170 M 0 20 11月8日 110 1 21 11月9日 110 22 11月10日 100 V 1 23 11月11日 130 0
(半平太) 2016/11/19(土) 15:38
早速ご教示下されありがとうございます。
実際のデータに数式を入れて確認させて頂きました。
実に希望通りのものに出来上がりました。
うれしいです。
今後とも宜しくご指導お願いいたします。
(正) 2016/11/19(土) 18:36
(γ) 2016/11/19(土) 19:09
別法をご教示下され、ありがとうございます。
この方法はいいですね。
この方法でしたら数式の意味が私にもすぐに理解できました。
マナさんのマクロも使用法を教えて頂いたので一度試してみます。
皆さんに色々教えて頂きありがたいです。
今後とも宜しくお願いします。
(正) 2016/11/20(日) 06:05
ありがとうございます。
マクロが動きました。グラフにM,Vが表示しました。
表示位置が中央で見にくかったので、データラベルで左にすると見やすくなりました。
ありがとうございました。
(正) 2016/11/20(日) 06:59
>この方法はいいですね。
>この方法でしたら数式の意味が私にもすぐに理解できました。
わたしも、そう思いました。
簡単な式なのに、わたしには思いつけない。
ちょっと悔しいです。
わたしの場合はすぐに考えるのを放棄しマクロでとなります。
で、いつまでたっても自分では考えられない。
>表示位置が中央で見にくかったので、データラベルで左にすると見やすくなりました。
マクロだと、例えば、データラベルを、こんな感じに配置できます。
手作業では面倒ですが、そんなこと気にする必要ないのが
マクロのいいところです。
Option Explicit
Sub test2() Dim cht As Chart Dim ser As Series Dim r As Range Dim v Dim i As Long Dim tmp As Long
On Error Resume Next Set cht = ActiveChart On Error GoTo 0 If cht Is Nothing Then MsgBox ("グラフを選択してから実行してください") Exit Sub End If
Set ser = cht.SeriesCollection(1) Set r = Range(Split(ser.Formula, ",")(2)) v = ser.Values
r.Offset(, 1).ClearContents ser.HasDataLabels = False
tmp = 0 For i = 2 To UBound(v) If v(i) > v(i - 1) Then tmp = i ElseIf tmp > 0 Then If v(i) < v(i - 1) Then With ser.Points(tmp) .HasDataLabel = True .DataLabel.Position = xlLabelPositionAbove .DataLabel.Text = "M" End With r(tmp, 2).Value = "M" tmp = 0 End If End If Next
tmp = 0 For i = 2 To UBound(v) If v(i) < v(i - 1) Then tmp = i ElseIf tmp > 0 Then If v(i) > v(i - 1) Then With ser.Points(tmp) .HasDataLabel = True .DataLabel.Position = xlLabelPositionBelow .DataLabel.Text = "V" End With r(tmp, 2).Value = "V" tmp = 0 End If End If Next
End Sub
(マナ) 2016/11/20(日) 08:36
ありがとうございます。
回答を追加して下さっていたのですね。
本日気が付きました。
これは素晴らしいです。シートにもグラフにも同時にV、Mが表示されます。
大いに利用させていただきます。
今後とも宜しくお願いします。
(正) 2016/11/29(火) 13:14
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.