Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:オブジェクトの選択(単一/複数選択、グループ))

オブジェクトの選択によるグラフ操作マクロの作成

このQ&Aのポイント
  • オブジェクトの選択によるグラフ操作マクロを作成します。単一選択や複数選択に対応し、グラフオブジェクトが含まれていない場合でもエラー終了しません。また、グループ化されたオブジェクト内のグラフオブジェクトも操作することができます。
  • エクセルの2007(または2003)バージョンに対応したマクロです。シート上の全てのグラフに一括処理をしたり、単一選択したグラフに処理をすることができます。
  • このマクロを使用することで、選択したオブジェクトに含まれるグラフオブジェクトの名前を取得することができます。マクロに渡された名前を用いて一定の処理を行うことができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

昔、グループ化されたコントロールを制御しようと作ったのをアレンジしてみました。再帰処理しているのでグループをさらにグループ化したものにも対応しています。(必要ないか..) 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_ShapesType_tbl.html 'チャートタイプの定数 'http://www.nurs.or.jp/~ppoy/access/excel/xlA021.html

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#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

WatchGoo
質問者

お礼

ありがとうございます、グループのグループは頻繁に作られるので助かります。 お礼が遅くなり申し訳ありません

すると、全ての回答が全文表示されます。
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

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 かどうかを追加で調べてます。

すると、全ての回答が全文表示されます。

関連するQ&A