[[20200521093657]] 『凡例の表示』(てんぶ) ページの最後に飛ぶ

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

 

『凡例の表示』(てんぶ)

シートにあるすべてグラフにおいて、凡例を昇順に表示するマクロを実行したいです。
よろしくお願いします。

< 使用 Excel:unknown、使用 OS:unknown >


 こういうことでしょうか。

 Sub test()
     Dim sortedlist As Object
     Dim chartobj As ChartObject
     Dim serCol   As SeriesCollection
     Dim ser      As Series
     Dim k        As Long
     Dim s        As String

     Set sortedlist = CreateObject("System.Collections.SortedList")

     For Each chartobj In ActiveSheet.ChartObjects
         Set serCol = chartobj.Chart.SeriesCollection

         '系列の名前をsortedlistに昇順に持つ
         sortedlist.Clear
         For Each ser In serCol
             sortedlist.Add ser.Name, ""
         Next

         'PlotOrderを上記の順序に設定する
         For k = 0 To sortedlist.count - 1
             s = sortedlist.getkey(k)
             serCol.Item(s).PlotOrder = k + 1
         Next
     Next
 End Sub

 なお、系列の表示を変えずに凡例だけ順序を変えることはできないように思います。
(γ) 2020/05/21(木) 21:26

ご対応ありがとうございます。

sortedlist.Add ser.Name, ""
の部分で「項目は既に追加されています。」とエラー表示が出てきます・・・。

これはどのように対処したらよろしいのでしょうか...?
(てんぶ) 2020/05/22(金) 09:45


 系列名が同一というのは想定しにくいですが、
    If Not sortedlist.ContainsKey(ser.Name) Then
         sortedlist.Add ser.Name, ""
    End If
 とでもしてみてください。
(γ) 2020/05/22(金) 10:04

補足:
(1)SortedListは、保存したものを内部で自動的にソートしてくれる容れ物、と考えて下さい。
(2)折れ線はそういうことはないですが、棒グラフ系は凡例のみならず、系列の表示順そのものが変わります。
https://hamachan.info/win7/Excel/graph_hanrei.html
などを参照。
このため、
>なお、系列の表示を変えずに凡例だけ順序を変えることはできないように思います。
と書いています。
(γ) 2020/05/22(金) 10:22

ほとんど同じなので回答しなかったのですが
系列名が重複する可能性があるなら。
 Sub test()
    Dim aryl As Object
    Dim cho As ChartObject
    Dim sers As SeriesCollection
    Dim n As Long
    Dim k As Long

    Set aryl = CreateObject("system.collections.arraylist")

    For Each cho In ActiveSheet.ChartObjects
        Set sers = cho.Chart.SeriesCollection
        n = sers.Count
        If n > 1 Then
            For k = 1 To n
                aryl.Add sers(k).Name
            Next
            aryl.Sort
            For k = 1 To n
                sers(aryl(k - 1)).PlotOrder = n
            Next
            aryl.Clear
        End If
    Next

 End Sub

並び順が希望通りかどうかはわかりません。

(マナ) 2020/05/22(金) 20:24


>並び順が希望通りかどうかはわかりません。

例えば、1月〜12月みたいなのは、11月が先頭になります。

(マナ) 2020/05/22(金) 20:32


系列名が""になっていると、私のもマナさんのもNGになりますね。
こういう場合はどういう順序にしたいのか、ルールを決めないといけないかも。
最後尾ということなんだろうか、それとも今の位置なんだろうか。
 
でも凡例の順序まで気にするなら、普通は系列名をブランクにしておくものだろうか。
まずはそこを手当したほうがいいような。
(γ) 2020/05/22(金) 20:35

コメントありがとうございます。
御二方の解答で実行したところ、γさんのコードでは
serCol.Item(s).PlotOrder = k + 1でコードが無効と表示、

マナさんのコードでは
sers(aryl(k - 1)).PlotOrder = nでコードが無効と表示されてしまいます。

何度もお手数おかけして恐縮ですが、どのようなエラーが生じてしまっているのかよろしくお願いしますm(__)m
(てんぶ) 2020/05/26(火) 10:21


また、系列名が””のものは非表示にするマクロを作ってあり、実際に表示されるのは文字や数字のある系列のみとなっております
(てんぶ) 2020/05/26(火) 10:23

>また、系列名が””のものは非表示にするマクロを作ってあり、

それを提示できませんか

(マナ) 2020/05/26(火) 11:24


ご対応ありがとうございます。
Sub sample()
 Dim ch As ChartObject
 Dim ser As Series

 For Each ch In ActiveSheet.ChartObjects
 For Each ser In ch.Chart.FullSeriesCollection
 ser.IsFiltered = ser.Name = ""
 Next
 Next
End Sub

こちらになります。
(てんぶ) 2020/05/26(火) 11:33


では、これでどうでしょうか。
 Sub test2()
    Dim aryl As Object
    Dim cho As ChartObject
    Dim sers As FullSeriesCollection
    Dim n As Long
    Dim k As Long

    Set aryl = CreateObject("system.collections.arraylist")

    For Each cho In ActiveSheet.ChartObjects
        Set sers = cho.Chart.FullSeriesCollection
        n = sers.Count

        If n > 1 Then
            For k = 1 To n
                If Not sers(k).IsFiltered Then
                    aryl.Add sers(k).Name
                End If
            Next
            n = aryl.Count
            If n > 1 Then
                aryl.Sort
                For k = 1 To n
                    sers(aryl(k - 1)).PlotOrder = n
                Next
            End If
            aryl.Clear
        End If
    Next

 End Sub

(マナ) 2020/05/26(火) 11:53


       sers(aryl(k - 1)).PlotOrder = n
やはりこの部分でパラメータが無効ですと表示されてしまいます...
(てんぶ) 2020/05/26(火) 14:07

エラーで止まったときの
aryl(k - 1)の値はどうなっていますか。

(マナ) 2020/05/26(火) 18:21


コメント返信:

[ 一覧(最新更新順) ]


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