最近のExcelでVBAから埋め込みグラフを操作するのに、2系統のオブジェクトモデルを利用できます。
ChartsObjectsメソッドでChartObjectオブジェクトを取得してChartObject.Chartプロパティ経由で取得する方法と、
ShapesコレクションからShapeオブジェクトを取得してShape.Chartプロパティ経由で取得する方法の
2系統です。
この2系統で取得したChartオブジェクトについて、あらためてテストをしてみました。
ChartObjects(1)とShapes(1)は異なる
アクティブなワークシートに埋め込みグラフが存在し、他には図形が存在しない状態で、以下のSubプロシージャを実行しました。
Dim cho As ChartObject
Set cho = ActiveSheet.ChartObjects(1)
Dim shp As Shape
Set shp = ActiveSheet.Shapes(1)
Debug.Print shp Is cho
Debug.Print ObjPtr(cho)
Debug.Print ObjPtr(shp)
Worksheet.ChartObjectsメソッドの戻り値と、Worksheet.Shapes.[_Default]の戻り値を、オブジェクト変数に代入しておいて、
Set cho = ActiveSheet.ChartObjects(1)
Set shp = ActiveSheet.Shapes(1)
Is演算子で比較した結果と、
Debug.Print shp Is cho
それぞれのメモリ番地を出力しています。
Debug.Print ObjPtr(cho)
Debug.Print ObjPtr(shp)
結果は以下のとおりです。
False
680047016
676325224
人間が操作する対象としては同じものですが、ActiveSheet.ChartObjects(1)で取得したChartObjectオブジェクトと、ActiveSheet.Shapes(1)で取得した埋め込みグラフを表すShapeオブジェクトは、別のオブジェクトと認識されています。
ChartObjects(1).ChartとShapes(1).Chartは同じ
つづいて先ほどのSubプロシージャにコードを追加して、以下のように変更してから再度実行します。
Dim cho As ChartObject
Set cho = ActiveSheet.ChartObjects(1)
Dim shp As Shape
Set shp = ActiveSheet.Shapes(1)
Debug.Print shp Is cho
Debug.Print ObjPtr(cho)
Debug.Print ObjPtr(shp)
Debug.Print shp.Chart Is cho.Chart
Debug.Print ObjPtr(cho.Chart)
Debug.Print ObjPtr(shp.Chart)
先ほどのオブジェクト変数からChartオブジェクトを取得してIs演算子で比較した結果と、
Debug.Print shp.Chart Is cho.Chart
それぞれのメモリアドレスを出力しています。
Debug.Print ObjPtr(cho.Chart)
Debug.Print ObjPtr(shp.Chart)
今度の結果は以下のとおりです。
False
680047016
676325224
True
672842568
672842568
ActiveSheet.ChartObjects(1).Chartで取得したChartオブジェクトと、ActiveSheet.Shapes(1).Chartで取得したChartオブジェクトは、同じオブジェクトと認識されています。
最終更新日時:2021-09-03 11:11
- Newer:Word VBAでテーブルスタイルの名前一覧を
- Older:VBAでテーブルスタイルの名前一覧を
Home » エクセルマクロ・Excel VBAの使い方 » グラフ・Chart » ChartObjects経由のChartとShapes経由のChartは同じなのか