[[20190326163137]] 『マクロで左上のグラフに名前をつけたい』(gurahu) ページの最後に飛ぶ

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

 

『マクロで左上のグラフに名前をつけたい』(gurahu)

いくつかグラフがあって左上、左真ん中、左下、
続いて中央上、中央真ん中、中央下、
続いて右上、右真ん中、右下、という順番にグラフの名前をつけたいです。

どのグラフに今どんな名前が付けられていて、どのグラフが何番目に作られたグラフかという部分がランダムな為、苦戦しています。

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


やりたい事がもう少し明確であれば、具体的に回答できたかもしれませんが。

今どんな名前が付けられていて グラフを選んだ時点で、左上のセル番地の所がオブジェクト(グラフ)の名前になりますので
現在の名前はわかります。

グラフの名前をつけたい そのまま名前表示されている所で好きな文字列を入れると名前が付けられます。
(ジャンプないで、命名になります)

何番目に作られたグラフか これは難しいですね。
何の為に必要なのでしょうか。

いくつかグラフがあって 非固定なのでしょうか

〜右下、という順番 配置を取得する事はマクロで可能ですが、左上と左真ん中のX座標は正確に同じ、と言った具合に
正確に配置されていないなら、各オブジェクトの中央点を計算して上下左右の関係を導く必要があるので
かなり面倒くさい作業になります。
なおかつ、グラフの配置が
■■■□□
■■□□□
□■■□■
■■■□■
■□■■■
□□□□■(□はグラフなし、■はグラフあり)
とかだったりしたら、シート数次第ですが、自動化するより手でやった方が速そうです。

(通りすがり) 2019/03/26(火) 17:11


 TopLeftCellでセル番地から目的のグラフを判断してみてはどうでしょうかね?

(白茶) 2019/03/26(火) 17:17


整形が崩れまくりました。すみません。再度。
やりたい事がもう少し明確であれば、具体的に回答できたかもしれませんが。

今どんな名前が付けられていて

 ⇒グラフを選んだ時点で、左上のセル番地の所がオブジェクト(グラフ)の名前になりますので現在の名前はわかります。 

グラフの名前をつけたい

 ⇒そのまま名前表示されている所で好きな文字列を入れると名前が付けられます。(ジャンプしないで、命名になります) 

何番目に作られたグラフか

 ⇒ これは難しいですね。 
 何の為に必要なのでしょうか。 

いくつかグラフがあって

 ⇒ 非固定なのでしょうか 

〜右下、という順番

 ⇒ 配置を取得する事はマクロで可能ですが、左上と左真ん中のX座標は正確に同じ、と言った具合に正確に配置されていないなら、各オブジェクトの中央点を計算して上下左右 の関係を導く必要があるのでかなり面倒くさい作業になります。なおかつ、グラフの配置が 
 ■■■□□ 
 ■■□□□ 
 □■■□■ 
 ■■■□■ 
 ■□■■■ 
 □□□□■(□はグラフなし、■はグラフあり) 
 とかだったりしたら、シート数次第ですが、自動化するより手でやった方が速そうです。 
(通りすがり) 2019/03/26(火) 17:19

環境を書いてもらわないと、命令が違ったり、使えなかったりするので、必ず明記してください。 もしMacだったら、動かなくても知りません。 それと、苦戦している、ということは書いたコードがあるでしょうから、まずはそれを見せてもらわないと、どう指導すべきか判らないです。

とりあえず、グラフは必ず9個ある場合(多少は融通をきかせてます)のコード例です。 何番目に作られたか、なんて情報は無視して(通常なら、Nameプロパティ後ろの数字で判別できます)、グラフの置いてある座標を元に、順番にタイトル変更しています。

 Sub test()
    Dim AR As Object
    Dim vw As Variant
    Dim i As Long

    Set AR = CreateObject("System.Collections.ArrayList")

    With ActiveSheet
        For i = 1 To .ChartObjects.Count
            With .ChartObjects(i)
                AR.Add Format(.Left / 10, "0000") & "|" & Format(.Top / 10, "0000") & "|" & .Name
            End With
        Next i
        AR.Sort

        For i = 0 To IIf(AR.Count < 10, AR.Count - 1, 8)
            vw = Split(AR(i), "|")
            With .ChartObjects(vw(2))
                .Chart.ChartTitle.Caption = Array("左上", "左真ん中", "左下", "中央上", "中央真ん中", "中央下", "右上", "右真ん中", "右下")(i)
            End With
        Next i
    End With
 End Sub
(???) 2019/03/26(火) 17:33

説明が不足しておりすみません。

以下のコードを使用しましたら、ばらばらに名前が付いてしまい(たぶんグラフが作られた順?)困っていたのです。

Sub Test()

    i = 1
    For Each MyObj In ActiveSheet.ChartObjects
        MyObj.Name = "Chart " & i
        i = i + 1
    Next MyObj
End Sub
(gurahu) 2019/03/26(火) 17:40

???さま。

このように変えましたらやりたいことができました。

        For i = 0 To IIf(AR.Count < 100, AR.Count - 1, 8)
            vw = Split(AR(i), "|")
            With .ChartObjects(vw(2))
                .Name = "cnt " & i

今後はもっとわかりやすい説明を心がけますね。
ありがとうございました。

(gurahu) 2019/03/26(火) 21:07


 ありゃ。解決したんですね。それは良かったです ^^

 ワタクシ的には
 ChartObjectのNameを書き換えるのが「目的」ではなく、
 実は後続の処理の為の「手段」なのではないかと予想していた訳です。

 もしそうなら
 「この場所にあるChartObject」が取得出来さえすれば、
 処理全体を通してグラフ名からグラフ操作する建付けで組む必要もないよなぁ・・・
 なんて想像していたのでした。

 例えば↓こんな感じの関数作っておくとか。

    Private Function GetChartObjectFromRange(TopLeftArea As Range) As ChartObject
    Rem 引数[TopLeftArea]内にTopLeftCellを有するChartObjectをひとつ返す関数
        Dim co As ChartObject, cl As Range
        For Each co In TopLeftArea.Parent.ChartObjects
            For Each cl In TopLeftArea.Cells
                If co.TopLeftCell.Address = cl.Address Then
                    Set GetChartObjectFromRange = co
                    Exit Function
                End If
            Next
        Next
    End Function

 まったく見当ハズレだった様でスミマセン ^^;

(白茶) 2019/03/26(火) 21:26


コメント返信:

[ 一覧(最新更新順) ]


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