重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

グラフを複数製作/修正するような作業を日常的に行っています
また、そのグラフにテキストボックスが複数グループ化されていたりグラフが複数グループ化されていたりということもよくあります

グラフの名前を与えるとそのグラフに一定の処理をするようなマクロを作ったときに
選択したオブジェクトに含まれるグラフオブジェクトの名前を上記マクロに渡してくれるような
仲立ちをするマクロがあればと思っております

1.単一選択/複数選択に対応
2.グラフオブジェクト以外が含まれていても無視するだけでエラー終了しない
3.グループ化されたオブジェクトがあればその中のグラフオブジェクトまで探す

という動きを実現したく思っています

エクセルのバージョンは2007(2003も利用することができる環境です)
現状ではシート上の全てのグラフに一括処理をするか
単一選択したグラフに処理をするかの二種類のマクロまで作ることができます

A 回答 (3件)

昔、グループ化されたコントロールを制御しようと作ったのをアレンジしてみました。

再帰処理しているのでグループをさらにグループ化したものにも対応しています。(必要ないか..)

Dim myObjects As Collection
Dim myObjectsCounter As Long

Private Sub getItem()
Dim obj As Shape, subObj As Shape
Dim sh As Worksheet

Set myObjects = New Collection
Set sh = ActiveSheet

myObjectsCounter = 0
For Each obj In sh.Shapes
Select Case obj.Type
Case Is = msoGroup
Call getGroupItems(obj)
Case Else
myObjectsCounter = myObjectsCounter + 1
myObjects.Add Item:=obj, Key:=CStr(myObjectsCounter)
End Select
Next
'Collectionの情報にアクセスする例
Call listToImidiate(sh)
End Sub

Private Sub getGroupItems(shpGroup As Variant)
Dim subObj As Shape

For Each subObj In shpGroup.GroupItems
Select Case subObj.Type
Case Is = msoGroup
Call getGroupItems(subObj)
Case Else
myObjectsCounter = myObjectsCounter + 1
myObjects.Add Item:=subObj, Key:=CStr(myObjectsCounter)
End Select
Next
End Sub

Private Sub listToImidiate(sh As Worksheet)
Dim shp As Shape
Dim myChart As ChartObject

For Each shp In myObjects
If shp.Type = msoChart Then
Set myChart = sh.ChartObjects(shp.Name)
'チャートのタイプを取得する例 この様に取得したチャートにアクセスできます。
Debug.Print myChart.Chart.ChartType
End If
Next
End Sub

'ShapeやChartのタイプの定数は下記リンク先等をご覧下さい。
'シェイプタイプの定数
'http://www.asahi-net.or.jp/~zn3y-ngi/YNxv212_Sha …
'チャートタイプの定数
'http://www.nurs.or.jp/~ppoy/access/excel/xlA021. …
    • good
    • 0

#2です。

すっきりさせてみました。ご参考まで。

Dim myChartCollection As Collection
Dim myChartCounter As Long

Sub test()
Dim myChart As ChartObject
Set myChartCollection = New Collection

Call getGroupedChart(ActiveSheet, myChartCollection)
For Each myChart In myChartCollection
Debug.Print myChart.Chart.ChartType
Next
End Sub

Private Sub getGroupedChart(sh As Worksheet, myChartCollection As Collection)
Dim obj As Shape, subObj As Shape
Dim myChartObject As ChartObject

myChartCounter = 0
For Each obj In sh.Shapes
Select Case obj.Type
Case Is = msoGroup
Call getGroupItems(sh, obj)
Case msoChart
myChartCounter = myChartCounter + 1
Set myChartObject = sh.ChartObjects(obj.Name)
myChartCollection.Add Item:=myChartObject, Key:=CStr(myChartCounter)
End Select
Next
End Sub

Private Sub getGroupItems(sh As Worksheet, shpGroup As Variant)
Dim subObj As Shape
Dim myChartObject As ChartObject

For Each subObj In shpGroup.GroupItems
Select Case subObj.Type
Case Is = msoGroup
Call getGroupItems(sh, subObj)
Case msoChart
myChartCounter = myChartCounter + 1
Set myChartObject = sh.ChartObjects(subObj.Name)
myChartCollection.Add Item:=myChartObject, Key:=CStr(myChartCounter)
End Select
Next
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます、グループのグループは頻繁に作られるので助かります。

お礼が遅くなり申し訳ありません

お礼日時:2012/04/06 11:12

Option Explicit



Private col As Collection

Sub test()
  Dim c
  
  Set col = New Collection
  Call chkTypename(Selection)
  If col.Count > 0 Then
    For Each c In col
      Debug.Print c
    Next
  End If
  Set col = Nothing
End Sub

Function chkTypename(x)
  Dim xi

  Select Case TypeName(x)
     
      Case "ChartArea"
        col.Add x.Parent.Parent.Name
      Case "ChartObject"
        col.Add x.Name
      Case "DrawingObjects"
        For Each xi In x
          Call chkTypename(xi)
        Next
      Case "GroupObject"
        For Each xi In x.ShapeRange.GroupItems
          Call chkTypename(xi)
        Next
      Case "Shape"
        If x.Type = msoChart Then
          col.Add x.Name
        End If
      Case Else
        'Debug.Print TypeName(x)
  End Select
End Function

こんな感じで。
基本的には、TypeName関数を使って調べると良いかと。

複数選択時のSelectionは"DrawingObjects"になりますから
そこから再度、単体別にチェックすれば良いです。

GroupObjectについては.ShapeRange.GroupItemsをチェックすれば良いですが
各GroupItemはTypeName"Shape"しか返さないので
Shape.Type が msoChart かどうかを追加で調べてます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!