ShapesとDrawingObjectsの相違点と使い方

マクロVBAで図(オートシェイプ等)を扱う時にいろいろ調べていくと、
図(オブジェクト)のコレクションが二つあることに気づきます。
Shapes コレクション
DrawingObjects コレクション
WEBのサンプルや書籍では多くはShapesが使われているはずですが、時々DrawingObjectsを見かけることもあります。
VBAではShapesとDrawingObjectsのどちらを使っても、目的の図(オートシェイプ等)を扱う事が出来ます。
本サイト内でも、基本的にはShapesですが、DrawingObjectsを紹介しているページもあります。
オートシェイプを他ブックの同じ位置に貼り付ける(Shapes,DrawingObjects)
DrawingObjectsは古いVBAにあったもので、互換性のために残されているものになります。
従って現在では、非表示メンバになっています。
この二つのコレクションの相違点を確認し、どのような場合にDrawingObjectsを使うと便利かを考えてみます。
Shapes コレクション
Shapeオブジェクトの詳細については、
第97回.図形オートシェイプ(Shape)
DrawingObjectsとの比較のためにメンバーの一覧を見てみます。
| プロパティ | Application |
| Count | |
| Creator | |
| Parent | |
| Range | |
| メソッド | AddCallout |
| AddChart2 | |
| AddConnector | |
| AddCurve | |
| AddFormControl | |
| AddLabel | |
| AddLine | |
| AddOLEObject | |
| AddPicture | |
| AddPicture2 | |
| AddPolyline | |
| AddShape | |
| AddSmartArt | |
| AddTextbox | |
| AddTextEffect | |
| Add3DModel | |
| BuildFreeform | |
| Item | |
| SelectAll |
そんなに数は多くありません。
VBAのコレクションの多くは、プロパティ・メソッドは少なめになっています。
DrawingObjects コレクション
と言いたいところですが、この表現はあまり正確とは言えません。
DrawingObjectというデータ型は存在していません。
DrawingObjectという特定のデータ型は存在していないので、Object型のコレクションとなっています。
オブジェクトブラウザで確認する場合は、右クリックから「非表示メンバを表示」で表示させてください。

DrawingObjects コレクションのメンバー
| プロパティ | _Default |
| Accelerator | |
| AddIndent | |
| Application | |
| ArrowHeadLength | |
| ArrowHeadStyle | |
| ArrowHeadWidth | |
| AutoSize | |
| Border | |
| CancelButton | |
| Caption | |
| Characters | |
| Count | |
| Creator | |
| DefaultButton | |
| DismissButton | |
| Display3DShading | |
| DisplayVerticalScrollBar | |
| DropDownLines | |
| Enabled | |
| Font | |
| Height | |
| HelpButton | |
| HorizontalAlignment | |
| InputType | |
| Interior | |
| LargeChange | |
| Left | |
| LinkedCell | |
| ListFillRange | |
| ListIndex | |
| Locked | |
| LockedText | |
| Max | |
| Min | |
| MultiLine | |
| MultiSelect | |
| OnAction | |
| Orientation | |
| Parent | |
| PhoneticAccelerator | |
| Placement | |
| PrintObject | |
| ReadingOrder | |
| RoundedCorners | |
| Shadow | |
| ShapeRange | |
| SmallChange | |
| Text | |
| Top | |
| Value | |
| VerticalAlignment | |
| Visible | |
| Width | |
| ZOrder | |
| メソッド | _Dummy12 |
| _Dummy15 | |
| _Dummy22 | |
| _Dummy28 | |
| _Dummy3 | |
| _Dummy47 | |
| _Dummy54 | |
| _Dummy56 | |
| AddItem | |
| BringToFront | |
| CheckSpelling | |
| Copy | |
| CopyPicture | |
| Cut | |
| Delete | |
| Duplicate | |
| GetEnumerator | |
| Group | |
| Item | |
| LinkCombo | |
| List | |
| RemoveAllItems | |
| RemoveItem | |
| Reshape | |
| Select | |
| Selected | |
| SendToBack | |
| Ungroup | |
| Vertices |
Shapesに比べて非常に多くのメンバーがあることがお分かりいただけると思います。
DrawingObjectsメンバ
このページは、「以前のバージョンのドキュメント」として残されているページになります。
ShapesとDrawingObjectsの相違点
DrawingObjectsは古いVBAで、互換性のために残されている非表示メンバです。
互換性としで残されている非表示オブジェクトやコレクションは、
他の新しいオブジェクトやコレクションに引き継がれるのが通常ではありますが、
必ずしも、全てが引き継がれているとは限りません。
中には引き継がれずに、他のオブジェクトやコレクションメンでは扱えなくなっているものも存在します。
少なくとも、DrawingObjectsの代替えとしてShapesが存在していると単純に考えることはできません。
ActiveSheet.DrawingObjects.Count
ActiveSheet.Shapes.Count
これら二つは同じなのでしょうか。(同じとして紹介しているページもあると思います。)
シートに「入力規則」の「リスト」を設定して、
イミディエイトウインドウで、
?ActiveSheet.DrawingObjects.Count
?ActiveSheet.Shapes.Count
上記二つの値を確認してください、違ったはずです。
Shapes.Countの方が1多くなったはずです。
Shapesには、入力規則のドロップダウンが含まれてしまいます。
これにより、以下のようなトラブルが発生します。
入力規則のドロップダウンが消えてしまうマクロ(Shapes内のDrop Down)
Shapeオブジェクトに入っているプロパティ・メソッド
Shapesコレクションではなく、中のShapeオブジェクトに入っているものがあります。
ほんの一部、良く使いそうなものを例に説明すると、
例えばプロパティでは、
PrintObject
これは、Shapeオブジェクト.ControlFormat.PrintObjectとして存在します。
メソッドでは、
Copy
Cut
Delete
Duplicate
これらは、Shapeオブジェクトに存在します。
コレクションにあるプロパティ・メソッドは、コレクション内のすべてのオブジェクトに対して一括で作用します。
オブジェクトのプロパティ・メソッドは、そのオブジェクトのみにしか作用しません。
つまりDrawingObjectsでは、全ての図(オブジェクト)に対して一括で操作できるプロパティ・メソッドが多数存在したが、
Shapesでは、個別のオブジェクトに対して操作しなければならないという事です。
コレクションの要素を指定して取得されるオブジェクトの違い
つまり、Shapes(インデックス)はShapeオブジェクトです。
対して。
DrawingObjectというデータ型は存在していません。
DrawingObjects(インデックス)は、汎用のobject型になります。
?typename(ActiveSheet.DrawingObjects(1))
Rectangle ← この結果はあくまで例として
図(オブジェクト)によって結果はまちまちになります。
TextBox、Picture、・・・
対して、
?typename(ActiveSheet.shapes(1))
Shape
これはShapeオブジェクトなので納得できると思いますが、図の種類がこれでは判別できません。
Shapeの場合は、Typeプロパティで判別します。
?ActiveSheet.Shapes(1).Type
1
この結果は、MsoShapeType列挙の数値になります。
DrawingObjectsの便利な使い道
DrawingObjectsでは、全ての図(オブジェクト)に対して一括で操作できるプロパティ・メソッドが多数存在するので、
そのような場合は、DrawingObjectsが便利に使えるという事になります。
ActiveSheet.DrawingObjects.PrintObject = False
※DrawingObjects(インデックス)にもPrintObjectは存在します。
Dim sp As Shape
For Each sp In ActiveSheet.Shapes
sp.ControlFormat.PrintObject = False
Next
このように一つずつ設定する必要があります。
シートの全ての図を削除する
ActiveSheet.DrawingObjects.Delete
※DrawingObjectsには入力規則のドロップダウンは含まれていません。
Dim sp As Shape
For Each sp In ActiveSheet.Shapes
If Not sp.Name Like "Drop Down*" Then
sp.Delete
End If
Next
このように、入力規則のドロップダウンかを判定して削除しないようにする必要があります。
シートの全ての図を別シートへコピーする
Worksheets(2)のA1セルに貼り付けします。
Worksheets(1).DrawingObjects.Copy
With Worksheets(2)
.Select
.Range("A1").Select
.Paste
End With
Shapesを使った場合
オートシェイプを他ブックの同じ位置に貼り付ける
Selection.Copy
このようなVBA記述をするか、もしくはShape一つずつCopyすることになります。
シートの全ての図を複製して別シートへ移動
Worksheets(2)のA1セルに貼り付けします。
Dim objs As Object
Set objs = Worksheets(1).DrawingObjects.Duplicate
objs.Cut
With Worksheets(2)
.Select
.Range("A1").Select
.Paste
End With
Shapesを使った場合は、
Shapeオブジェクト一つずつに対してDuplicateを実行しなければならず、
この場合なら、Duplicateを使うメリットがないと思います。
図(オブジェクト)のコピーを行うと、その図(オブジェクト)が選択状態になります。
図の選択状態を解除するには、以下のどちらかのVBAで行ってください。
With シート
.Protect
.Unprotect
End With
With シート
.Select
.Range("A1").Select
End With
一般的な方法として、ActiveCell.Activateを使う方法も考えられますが、
DrawingObjectsで複数の図をコピーした時には、ActiveCellが取得できない状態になってしまう為、
ActiveCellでエラーとなってしまいます。
最後に
そもそも図オブジェクトは、多くのオブジェクトをメンバーに持った複雑なオブジェクトとなっていて、全てを把握するのはとても困難なオブジェクトになります。
必要に応じて、都度プロパティ・メソッドを調べられるようにしておけば良いと思います。
このような古いオブジェクト・コレクションは、今後のバージョンアップに際し動作保証されない可能性もありますし、
なにより、信頼すべきドキュメントが見つからない為にVBA記述に苦労することが多々あります。
従って、基本的にはShapesで書くようにしたほうが良いでしょう。
とはいえ、
一括でシートの全ての図に対して操作したい場合は、便利な方法として覚えておくと役に立つこともあると思います。
図形オートシェイプ(Shape)に関連する記事
第97回.図形オートシェイプ(Shape)
同じテーマ「マクロVBA技術解説」の記事
Byte配列と文字コード関数について
Applicationを省略できるApplicationのメソッド・プロパティ一覧
PowerQueryの強力な機能をVBAから利用する方法
ShapesとDrawingObjectsの相違点と使い方
新規挿入可能なシート名の判定
VBAにおける配列やコレクションの起点について
VBAのマルチステートメント(複数のステートメントを同じ行に)
クリップボードに2次元配列を作成してシートに貼り付ける
ユーザー定義型の制限とクラスとの使い分け
シングルクォートの削除とコピー(PrefixCharacter)
空文字列の扱い方と処理速度について(""とvbNullString)
新着記事NEW ・・・新着記事一覧を見る
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- ShapesとDrawingObjectsの相違点と使い方
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
