[[20161118174614]] 『折れ線グラフのデータに山と谷の印を付けたい』(正) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『折れ線グラフのデータに山と谷の印を付けたい』(正)

いつもお世話になります。
教えてください。

折れ線グラフのデータの山には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


回答ではありません。
不明な点は何ですか?
 
(1)山、谷の定義は明確なんですか?定義があればそれを明示してください。
そこまでは貴兄が提示すべきことです。
前後の数値とだけ比較して判定するのですか?
それとも、+2,-2期以上の数値も影響するのですか?
 
(2)「最初に出た値のみ付けたい。」の意味が不明。
最初とは、どの範囲の期間をいうのか? (Vの100は2回登場するが)
  
(3)式における、IFやANDの使い方が不明なんですか?
 
(4)ラベルを表示する方法は既知のことなんですね?
そのあたりを明確にしてください。

(γ) 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


数式だけでC列にV,Mを設定する別法を示します。
 
D列を補助に使います。
 
D2セル
=IF(B3>B2,"u",IF(B3<B2,"d",D3))
以下の行にコピーペイスト。
 
(その心は、
・次の営業日に上昇していれば、"u"
・次の営業日に低下していれば、"d"
・次の営業日に同じであれば、次の日のD列の値とする。)
 
C3セル
=IF(AND(D2="d",D3="u"),"V",IF(AND(D2="u",D3="d"),"M",""))
以下の行にコピーペイスト。
(D列で見て
・前の営業日が"d"で、今日が"u"なら、谷("V")
・前の営業日が"u"で、今日が"d"なら、山("M") )
 
としてみてください。
 
====
マナさんのマクロを推奨します。
グラフのラベルに直接、MVを書き込むことまで実現されています。
提示されたマクロを、標準モジュールにコピーペイストします。
・グラフをアクティブ(選択状態)にしたうえで、
・マクロ test を実行する
だけです。

(γ) 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.