[[20230307133008]] 『ChartObjectsの並び替え』(ぷすぷす) ページの最後に飛ぶ

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

 

『ChartObjectsの並び替え』(ぷすぷす)

シート内の複数のグラフを指定したタイトル名順に横一列に並べたい。

例えば
グラフが3種類あってタイトル名がNo1,No2、No3とあるとして
左からNo2,No3,No1の順に横一列に並べるVBAを教えて欲しい。

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


グラフだけですか?元になるデータと離れ離れになりますよ。
もろもろ考えると、データ範囲も併せて、カットアンドペーストで、
手で適切な位置に移動させたほうが手っ取り早いと思いますよ。

(簡単に) 2023/03/07(火) 15:30:33


教えを乞うんだったら、もう少し丁寧な言葉を使ったらどうやねん。

(老婆心) 2023/03/07(火) 15:39:20


 例えばの話...

    Sub Chart_List()
        Dim co As ChartObject, v(), i As Long
        ReDim v(0 To ActiveSheet.ChartObjects.Count, 1 To 2)
        v(0, 1) = "Name"
        v(0, 2) = "Title"
        For Each co In ActiveSheet.ChartObjects
            i = i + 1
            v(i, 1) = co.Name
            v(i, 2) = co.Chart.ChartTitle.Text
        Next
        With [A20].Resize(i + 1, 2) '←場所適当です
            .Value = v
            .AutoFilter
        End With
    End Sub
    Rem ==================================================================
    Rem この間にAutoFilter.Rangeを希望の順に並べ替えておく
    Rem ==================================================================
    Sub Chart_Sort()
        Dim co As ChartObject, i As Long, xpos As Single
        With ActiveSheet.AutoFilter.Range
            For i = 2 To .Rows.Count
                Set co = ActiveSheet.ChartObjects(.Cells(i, 1).Value)
                co.Top = 0
                co.Left = xpos
                xpos = xpos + co.Width
            Next
        End With
    End Sub

(白茶) 2023/03/07(火) 16:17:13


白茶さん、参考のコードをありがとうございます。

A20(B20)から下方に名前とタイトルがソートされて表示されます。

>Rem この間にAutoFilter.Rangeを希望の順に並べ替えておく

思うに、昇順と降順に並び替えできますが
No1,No2、No3とあるとしてNo2,No3,No1の順のようにはどうやったら並び替えられるのですか?
話が見えていないので間違っているならアドバイスお願いします。
(ぷすぷす) 2023/03/07(火) 17:32:36


 あー・・・いやいや

 >No2,No3,No1の順
 がどういった順番なのか分かんないから、自分で順番決めちゃってね。って事です。

 並び順の法則がどっかにあるなら、その情報をくっ付けてソートすればよし。
 無いなら自分で連番等の情報を書き加えてからソートしてもよし。
 (ていう意味では、もう1列用意しとくべきですかね)

 最終的には「希望の順に並んだ[Name]列」が欲しいだけです。

(白茶) 2023/03/07(火) 18:25:11


情報が不足していました。

No1,No2,No3は、タイトル名を簡易に命名しただけで
タイトル_1,タイトル_5,タイトル_10でも良い名前です。

これをタイトル_5、タイトル_10、タイトル_1などのように
希望の任意の順番に並べたく名前自体には規則性や法則はありません。

順番と言う言葉がソートを想定される言葉なのが
 悪かったようで任意にと言った方が正確です。
 
「もう1列用意しとくべきですかね」
ですが、ここに「希望の順に並んだ[Name]列」を記載すると言う意味でしょうか?

ChartTitle.Textでタイトルを抜き出してコピペして
「希望の順に並んだ[Name]列」を作成すると言う手段も思いつきましたが
達人さんならもっと他の方法を御存知ではないかと相談しました。
(ぷすぷす) 2023/03/07(火) 19:10:01


 > 「もう1列用意しとくべきですかね」
 > ですが、ここに「希望の順に並んだ[Name]列」を記載すると言う意味でしょうか?

 「並び順」そのものを書き込む為の列を... ってつもりだったんですけどね。

    Sub Chart_List()
        Dim co As ChartObject, v(), i As Long
        ReDim v(0 To ActiveSheet.ChartObjects.Count, 1 To 3)
        v(0, 1) = "Name"
        v(0, 2) = "Title"
        v(0, 3) = "Sort" '←もう1列用意しとくの部分
        For Each co In ActiveSheet.ChartObjects
            i = i + 1
            v(i, 1) = co.Name
            v(i, 2) = co.Chart.ChartTitle.Text
        Next
        With [A20].Resize(i + 1, 3) '←
            .Value = v
            .AutoFilter
        End With
    End Sub

 の実行結果が仮に↓こうだった場合、

 __|___A____|_____B_____|___C____
 20|Name    |Title      |Sort    
 21|Chart 1 |タイトル_1 |        
 22|Chart 2 |タイトル_5 |        
 23|Chart 3 |タイトル_10|        

 __|___A____|_____B_____|___C____
 20|Name    |Title      |Sort    
 21|Chart 1 |タイトル_1 |       2
 22|Chart 2 |タイトル_5 |       1 ← B列の情報から「任意の並び順」を判断出来る「人」が判断すれば
 23|Chart 3 |タイトル_10|       3   C列に順番を付ける事ができるので、

 __|___A____|_____B_____|___C____
 20|Name    |Title      |Sort     ← 付番後にC列で表全体をソートすれば
 21|Chart 2 |タイトル_5 |       1
 22|Chart 1 |タイトル_1 |       2
 23|Chart 3 |タイトル_10|       3
      ↑
   ココの情報を使ってChart_Sortが実行出来る。という事です。

 付番する作業に際しては何度かに分けてちょっとずつソート結果を確認しながら進める事も出来ますし、
 この部分の作業だけ他人に外注するなり、関数等で別表から並び順を取得するなり、
 「任意」である以上、もうその辺はお好きにどうぞ。って感じです。(達人さんか否かは関係ありません)

(白茶) 2023/03/07(火) 20:01:34


白茶さん、ありがとうございます。
(ご丁寧な実行結果の例もあり判りやすく理解が深まりました。)

もう1列用意して並び順を任意に指定しこれを利用してNAMEをソートするのですね。
私に取っては目からウロコの手法です。
(コピペする手間を考えると雲泥の差です。)

このような手法を知っていると賢者さんの引き出しの多さですね。

他でも応用が効くので活用させていただきます。

お世話になり感謝いたします。
(ぷすぷす) 2023/03/08(水) 08:09:07


コメント返信:

[ 一覧(最新更新順) ]


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