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

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

オブジェクトの選択(単一/複数選択、グループ)

グラフを複数製作/修正するような作業を日常的に行っています また、そのグラフにテキストボックスが複数グループ化されていたりグラフが複数グループ化されていたりということもよくあります グラフの名前を与えるとそのグラフに一定の処理をするようなマクロを作ったときに 選択したオブジェクトに含まれるグラフオブジェクトの名前を上記マクロに渡してくれるような 仲立ちをするマクロがあればと思っております 1.単一選択/複数選択に対応 2.グラフオブジェクト以外が含まれていても無視するだけでエラー終了しない 3.グループ化されたオブジェクトがあればその中のグラフオブジェクトまで探す という動きを実現したく思っています エクセルのバージョンは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

  • イラレでグループ化されたオブジェクトを選択

    イラレCS5を使っています。 複雑な形状をした複数のオブジェクトがグループ化されたオブジェクトがあるとします。 これの一部を選択したいのですが、 ダイレクト選択ツールを使って、Shiftキーを押しながら選択していくと グループ化されたオブジェクトの中で複数のオブジェクトを同時に選択することが出来ます。 しかしながら、例えば、A、B、Cというオブジェクトを選択した状態で C、D、Eというオブジェクトを選択すると、 Cの選択が外れてしまいます。 簡単なオブジェクトだとCだけ選択し直せば良いのですが、 複雑なオブジェクトだとこういう操作は難しくなってしまいます。 どうすれば、A、B、Cというオブジェクトを選択した状態で C、D、Eというオブジェクトを選択してもABCDEすべてのオブジェクトが 選択出来ますでしょうか?

  • Word2010でオブジェクトをグループ化する

     Word2010で複数の図形をグループ化する方法を教えてください。 ホーム~オブジェクトの選択~カーソルをドラックしてオブジェクトの周囲に選択範囲の四角形が出来ないので次のグループ化に進めません。 複数の図形をシフトを押しながら一つ一つ選択をすればグループ化することはできるのですが・・・ それでは、複数有る細かい図形はうまく選択するのが難しいので オブジェクトの周囲に範囲選択の四角形を作る良い方法がありましたら教えてください。

  • Word グループ化したオブジェクトの選択

    テキストボックス複数個とオートシェイプをグループ化しています。 この図のアンカーを固定したくて、「オブジェクト」を選択しようとマウスで右クリックすると、テキストボックスだけが選択されたり、オートシェイプだけが選択されたりと、なかなか思い通りになりません。 どうすればいいでしょう? 2002を使っています。 描画キャンバスは使っていません。

  • WORD2007で複数のJPG等オブジェクトの選択方法

    WORD2003までは、画面上にある複数のJPGやBMPなどの画像ファイルは白抜き矢印の「オブジェクトの選択」で簡単に選択でき、これにより一括削除やグループ化などができました。これにワードアートが加わっても同様にできました。 しかしWORD2007ではこれができないようです。画面上に2つのJPGと一つのワードアートがあり、それぞれの文字列の折り返しは「前面」とした場合、ホーム→右端の選択から「オブジェクトの選択」をすると1つのワードアートしか選べません。JPGは無視されます。 何かやり方がありましたらご教授のほどお願い致します。

  • VBA 図形グループ化後オブジェクト名取得

    2種類以上のオートシェープ選択し、グループ化した後に、そのグループ化した図形のオブジェクト名を取得したいです。私の取得の流れです。 (1)すでにグループ化前の図形は複数選択されている。 (2)グループ化後には、グループ図として選択されたままになっているはず。 (3)下記でオブジェクト名が取得できるはず。   Selection.ShapeRange.Name ですが、グループ化処理後に、自動的に選択が図形からはずされてしまい、エラーとなってしまいます。 エクセルシート上に他にもグループ化された図形が複数あるため、今対象にしているグループ化した直後の図形のオブジェクト名をどう取得すればよいかがわからないでいます。知りたいのはあくまで、今グループ化したそのオブジェクト名になります。

  • 選択した特定のチャートオブジェクトのみにマクロ

    選択した特定のチャートオブジェクトのみにマクロ VBA初心者です。 現在、1つのシート中に15程度のグラフチャートがありますが、そのうち、選択した特定のグラフチャートのみに縦横軸の最大値最小値を設定する(統一する)マクロを実行したいと考えております。 このとき、どのようにしたら選択した特定のグラフのみにマクロを適用できるかがわかりません。 ご教授お願いいたします!!

  • Excelでグループ化オブジェクトにマクロ登録

    Excelで複数のオブジェクト(オートシェイプ)をグループ化したものにマクロを登録したいのですが、何回やっても登録できません。 どうやれば登録できるのでしょうか?

  • エクセルオブジェクトの有無の確認方法

    VBAでマクロを作成してます。 指定した名前のオブジェクト(たとえばグラフ)が存在しない場合の処理を加えたいのですが、可能でしょうか?

  • VS2008(ASP.NET)で、コントロールを複数選択するには?

    Visual Studio2008 ASP.NETについての質問です(言語:Visual Basic) VS2005のASP.NETでは、Ctrlキーを押しながらコントロールオブジェクトをクリックすると、コントロールオブジェクトを複数選択することができました。 今回、VS2008の評価版、「Visual Studio 2008 Professional Edition」をダウンロードしてASP.NETを動かしてみましたが、上記の操作でコントロールオブジェクトを複数選択することができません。 質問内容は、VS2008のASP.NETで、コントロールオブジェクトを複数選択するにはどのような操作が必要か、というものです。 (例えば、テキストボックスを複数選択し、一括で文字列を右詰にしたい、などの処理を行いたいと考えています) 以上、どうぞよろしくお願い致します。

  • Word2010で「オブジェクトの選択」が機能しません。2003互換モ

    Word2010で「オブジェクトの選択」が機能しません。2003互換モードでは機能します。複数図形の一括選択ができずに困っています。バグじゃないかなとも思えるのですが。

専門家に質問してみよう