[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロで左上のグラフに名前をつけたい』(gurahu)
いくつかグラフがあって左上、左真ん中、左下、
続いて中央上、中央真ん中、中央下、
続いて右上、右真ん中、右下、という順番にグラフの名前をつけたいです。
どのグラフに今どんな名前が付けられていて、どのグラフが何番目に作られたグラフかという部分がランダムな為、苦戦しています。
< 使用 Excel:unknown、使用 OS:unknown >
今どんな名前が付けられていて グラフを選んだ時点で、左上のセル番地の所がオブジェクト(グラフ)の名前になりますので
現在の名前はわかります。
グラフの名前をつけたい そのまま名前表示されている所で好きな文字列を入れると名前が付けられます。
(ジャンプないで、命名になります)
何番目に作られたグラフか これは難しいですね。
何の為に必要なのでしょうか。
いくつかグラフがあって 非固定なのでしょうか
〜右下、という順番 配置を取得する事はマクロで可能ですが、左上と左真ん中のX座標は正確に同じ、と言った具合に
正確に配置されていないなら、各オブジェクトの中央点を計算して上下左右の関係を導く必要があるので
かなり面倒くさい作業になります。
なおかつ、グラフの配置が
■■■□□
■■□□□
□■■□■
■■■□■
■□■■■
□□□□■(□はグラフなし、■はグラフあり)
とかだったりしたら、シート数次第ですが、自動化するより手でやった方が速そうです。
(通りすがり) 2019/03/26(火) 17:11
TopLeftCellでセル番地から目的のグラフを判断してみてはどうでしょうかね?
(白茶) 2019/03/26(火) 17:17
今どんな名前が付けられていて
⇒グラフを選んだ時点で、左上のセル番地の所がオブジェクト(グラフ)の名前になりますので現在の名前はわかります。
グラフの名前をつけたい
⇒そのまま名前表示されている所で好きな文字列を入れると名前が付けられます。(ジャンプしないで、命名になります)
何番目に作られたグラフか
⇒ これは難しいですね。 何の為に必要なのでしょうか。
いくつかグラフがあって
⇒ 非固定なのでしょうか
〜右下、という順番
⇒ 配置を取得する事はマクロで可能ですが、左上と左真ん中のX座標は正確に同じ、と言った具合に正確に配置されていないなら、各オブジェクトの中央点を計算して上下左右 の関係を導く必要があるのでかなり面倒くさい作業になります。なおかつ、グラフの配置が ■■■□□ ■■□□□ □■■□■ ■■■□■ ■□■■■ □□□□■(□はグラフなし、■はグラフあり) とかだったりしたら、シート数次第ですが、自動化するより手でやった方が速そうです。 (通りすがり) 2019/03/26(火) 17:19
とりあえず、グラフは必ず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.