[[20150820212633]] 『グラフの最右の値だけ表示』(夏の陣) ページの最後に飛ぶ

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

 

『グラフの最右の値だけ表示』(夏の陣)

 折れ線グラフの最新(最右)のデータラベルの値だけを、表示するマクロを作成しま
 したが、Points(19)の部分が変動するようにしないと、最新の値は表示しないように
 思うのですが、如何でしょうか?

 他にも 表示位置や、フォントも変更するようにしています。
 ご指導よろしくお願いします。

 Sub test()
 
    ActiveSheet.ChartObjects("グラフ 20").Activate
    ActiveChart.SeriesCollection(1).DataLabels.Delete
    ActiveChart.SeriesCollection(1).Points(19).ApplyDataLabels
    ActiveChart.SeriesCollection(1).Points(19).DataLabel.Position = xlLabelPositionAbove
    ActiveChart.SeriesCollection(1).DataLabels.Format.TextFrame2.TextRange.Font.Size = 14

 End sub

< 使用 Excel:Excel2007、使用 OS:Windows7 >


こうでしょうか
 Sub test2()

    With ActiveSheet.ChartObjects("グラフ 20").Chart.SeriesCollection(1)
        If .HasDataLabels Then .DataLabels.Delete
        With .Points(.Points.Count)
            .HasDataLabel = True
            .DataLabel.Position = xlLabelPositionAbove
            .DataLabel.Format.TextFrame2.TextRange.Font.Size = 14
        End With
    End With

 End Sub

(マナ) 2015/08/20(木) 22:56


 マナさんありがとうございます。
 回答いただいたコードを試してみました。
 マクロはエラーも無く終了しますが、グラフは何も
 変わりませんでした。なぜでしょうか?

(夏の陣) 2015/08/21(金) 06:19


これでどうでしょうか

 Sub test3()

    With ActiveSheet.ChartObjects("グラフ 20").Chart.SeriesCollection(1)
        .HasDataLabels = False
        With .Points(.Points.Count)
            DoEvents
            .HasDataLabel = True
            DoEvents
            .DataLabel.Position = xlLabelPositionAbove
            .DataLabel.Format.TextFrame2.TextRange.Font.Size = 14
        End With
    End With

 End Sub

(マナ) 2015/08/21(金) 20:12 修正21:14


 マナさんありがとうございます。
 再度やってみました。
 一旦、各ポイントの値だけの表示がされ、そして削除されて、
 その後、最新のデータも何も現れません。
(夏の陣) 2015/08/21(金) 22:20


では、これではどうでしょうか

 Sub Test4()

    With ActiveSheet.ChartObjects("グラフ 20").Chart.SeriesCollection(1)
        .HasDataLabels = False
        With .Points(.Points.Count)
            .HasDataLabel = True
            Application.Wait Now + TimeValue("0:00:01")
            .DataLabel.Position = xlLabelPositionAbove
            .DataLabel.Format.TextFrame2.TextRange.Font.Size = 14
        End With
    End With

 End Sub

(マナ) 2015/08/21(金) 22:51


 マナさん結果同じでした。
 もう一度よく考えてみます。
 ありがとうございました。
(夏の陣) 2015/08/21(金) 23:33

最近、似た事例がありまして
これで、表示されるなら同じ現象かも。

 Sub test5()

    With ActiveSheet.ChartObjects("グラフ 20").Chart.SeriesCollection(1)
        .HasDataLabels = False
        With .Points(.Points.Count)
            .HasDataLabel = True
            .Select
            .DataLabel.Position = xlLabelPositionAbove
            .DataLabel.Format.TextFrame2.TextRange.Font.Size = 14
         End With
    End With

 End Sub

(マナ) 2015/08/22(土) 10:04


これなら、できるかも

  Sub test6()

    With ActiveSheet.ChartObjects("グラフ 20").Chart.SeriesCollection(1)
        .HasDataLabels = False
        With .Points(.Points.Count)
            .HasDataLabel = True
            .DataLabel.Position = xlLabelPositionAbove
            .DataLabel.Font.Size = 14
        End With
    End With

 End Sub

(マナ) 2015/08/22(土) 10:21


 マナさん、色々と考えていただき、ありがとうございます。 
 test4もtest5も、何も表示されませんでした。
(夏の陣) 2015/08/22(土) 19:07

こちらでは、表示されるですが、困りました
こうするしかないかも。

 Sub test7()
    Dim n As Long

    ActiveSheet.ChartObjects("グラフ 20").Activate
    n = ActiveChart.SeriesCollection(1).Points.Count
    ActiveChart.SeriesCollection(1).DataLabels.Delete
    ActiveChart.SeriesCollection(1).Points(n).ApplyDataLabels
    ActiveChart.SeriesCollection(1).Points(n).DataLabel.Position = xlLabelPositionAbove
    ActiveChart.SeriesCollection(1).DataLabels.Format.TextFrame2.TextRange.Font.Size = 14

 End Sub

(マナ) 2015/08/22(土) 19:24


test7がOKであることが前提ですが、
思いつくところを、やみくもに。

 Sub test8()
    Dim n As Long

    With ActiveSheet.ChartObjects("グラフ 20").Chart.SeriesCollection(1)
        n = .Points.Count
        .HasDataLabels = False
        .Points(n).ApplyDataLabels
        .Points(n).DataLabel.Position = xlLabelPositionAbove
        .DataLabels.Format.TextFrame2.TextRange.Font.Size = 14
    End With

 End Sub

 Sub test9()

    With ActiveSheet.ChartObjects("グラフ 20").Chart.SeriesCollection(1)
        .HasDataLabels = False
        With .Points(.Points.Count)
            .HasDataLabel = True
            .DataLabel.Position = xlLabelPositionAbove
        End With
        .DataLabels.Format.TextFrame2.TextRange.Font.Size = 14
    End With

 End Sub

 Sub test10()

    With ActiveSheet.ChartObjects("グラフ 20").Chart.SeriesCollection(1)
        .HasDataLabels = False
        With .Points(.Points.Count)
            .ApplyDataLabels
            .DataLabel.Position = xlLabelPositionAbove
        End With
        .DataLabels.Format.TextFrame2.TextRange.Font.Size = 14
    End With

 End Sub

(マナ) 2015/08/22(土) 20:00


 マナさん、付き合っていただき、ありがとうございます。
 test8.9.10同じ現象でした。

 気になるのが二つあります。
 ?@test7の変数nが、こちらでマクロを動かすとn=31になっています。
  nはグラフのポイントだと思いますが。
 ?Aマクロスタート以前のグラフの状態は、最新のデータが表示されており、
 アクティブにはなっていません。
 マナさんの設定とこのへんが食い違っているでしょうか?

(夏の陣) 2015/08/23(日) 08:02


グラフはアクティブにしておく必要ありません。
 1)test7でも、表示されなかったということですか
2)nはポイント数です。31個ではないということですか
3)対象のグラフ名は、グラフ 20で間違いありませんか
4)ステップ実行を試していただけますか

(マナ) 2015/08/23(日) 09:37


 マナさん、ありがとうございます。

 1)test7でも、表示されなかったということですか
    表示されませんでした。

 2)nはポイント数です。31個ではないということですか

     nはどのようにして抽出してるんでしょうか?
     横軸に日付けがあり、今日は22日だから、ポイント22に
     ならないといけないのではないでしょうか?

 3)対象のグラフ名は、グラフ 20で間違いありませんか
   20で間違いありませんでした。

 4)ステップ実行を試していただけますか
     ステップ実行とは、どういう意味ですか?
     勉強不足でわかりません。
     ご教示お願いします。
(夏の陣) 2015/08/23(日) 12:43

今度こそ、わかったかも。
 グラフのデータ範囲は1ヶ月用に設定してあって、
 日々データを入力していくと、グラフが伸びていくのですね。

 Sub test11()
    Dim i As Long

    With ActiveSheet.ChartObjects("グラフ 20").Chart.SeriesCollection(1)
        .HasDataLabels = False
        For i = .Points.Count To 1 Step -1
            If Not IsEmpty(.Values()(i)) Then
                With .Points(i)
                    .HasDataLabel = True
                    .DataLabel.Position = xlLabelPositionAbove
                    .DataLabel.Font.Size = 14
                End With
                Exit For
            End If
        Next
    End With

 End Sub

(マナ) 2015/08/23(日) 14:17


 マナさん、ありがとうございます。
 きちんとと思いどりおりに表示されました。
 最初の説明が足らなかったです。すみませんでした。

 申し訳ありませんが、もう一問お付き合いください。
 提示したグラフ名は20のみですが、グラフが一つの
 シートにグラフ名が20から30まで続きであります。
 回答頂いたものを列記したら良いかもしれませんが
 ループしたら良いと思うのですが、要領を得ません。
 よろしく、おねがいします。

(夏の陣) 2015/08/23(日) 17:01


すべてのグラフ対象ということなら、グラフ名の確認は不要になります。

 対象とするかどうかを名前で判断するなら、名前の付け方を工夫すればよいと思います。
 他には、グラフのタイプやセル位置で判断することでもよいです。

 Sub test12()
    Dim co As ChartObject
    Dim i As Long

    For Each co In ActiveSheet.ChartObjects
        If co.Name Like "グラフ 2[0-9]" Or co.Name Like "グラフ 30" Then
            With co.Chart.SeriesCollection(1)
                .HasDataLabels = False
                For i = .Points.Count To 1 Step -1
                    If Not IsEmpty(.Values()(i)) Then
                        With .Points(i)
                            .HasDataLabel = True
                            .DataLabel.Position = xlLabelPositionAbove
                            .DataLabel.Font.Size = 14
                        End With
                        Exit For
                    End If
                Next
            End With
        End If
    Next

 End Sub

(マナ) 2015/08/23(日) 19:29


 マナさん、すべてのグラフ対象ということなら、グラフ名の確認は不要
 ということですが、
 回答いただいた、If co.Name Like "グラフ 2[0-9]" Or co.Name Like "グラフ 30" Then
 の部分、特にグラフ 2[0-9]がわかりません。
 どこまでもお手数ですが教えてください。

(ジョン) 2015/08/23(日) 22:56


すべてのグラフが対象であれば、
If co.Name Like 〜が必要なくなるという意味です。
削除してもらって結構です。

 以下は、マクロを実行したくないグラフも同じシートにある場合の話です。
その場合は、グラフ名が○○ならば実行とか、××でないならば実行
とするなど、対象のグラフかどうか判断させる必要があるので
その例が
>If co.Name Like "グラフ 2[0-9]" Or co.Name Like "グラフ 30" Then
です。
と書いていて気付きました。2個めのLikeは=でよかったです。
If co.Name Like "グラフ 2[0-9]" Or co.Name = "グラフ 30" Then
  
で、質問のグラフ 2[0-9]ですが、
[0-9]は、0〜9の数字1文字という意味です。
なので、グラフ 20〜29になります。
グラフ 2# でもよいです。

 ただ、グラフ ○とか、エクセルが勝手につけた名前をそのまま使わずに、
私ならば判断しやすい名前に変更します。
対象とするグラフの名前をすべて、例えば「夏の陣」としてみてください。
その場合のコードは、
If co.Name = "夏の陣" Then
とすればよいので、簡単です。

(マナ) 2015/08/24(月) 19:31


 マナさん、If co.Name Like "グラフ 2[0-9]" Or co.Name Like "グラフ 30" Thenの意味
 よくわかりました。
 仕事柄グラフをよく使うので、これから先、活用させていただきます。
 最後まで、お付き合いいただき、ありがとうございました。

(夏の陣) 2015/08/24(月) 19:59


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.