図(オブジェクト)のコレクションが二つあることに気づきます。コレクションWEBのサンプルや書籍では多くはShapesが使われているはずですが、時々DrawingObjectsを見かけることもあります。VBAではShapesとDrawingObjectsのどちらを使っても、目的の図(オートシェイプ等)を扱う事が出来ます。本サイト内でも、基本的にはShapesですが、DrawingObjectsを紹介しているページもあります。オートシェイプを他ブックの同じ位置に貼り付ける(Shapes,DrawingObjects)コメントでリクエストを頂きました。「1つのシートにバラバラにあるオートシェープを一度に選択して、コピーし、ほかのブックのあるシートの同じ位置にペーストしたい」というもの。これには色々な問題が含まれています。DrawingObjectsは古いVBAにあったもので、互換性のために残されているものになります。従って現在では、非表示メンバになっています。本来はShapesだけを使えば良いのですが、DrawingObjectsを使ったほうが便利な場合も存在します。この二つのコレクションの相違点を確認し、どのような場合にDrawingObjectsを使うと便利かを考えてみます。コレクションShapesは、Shapeオブジェクトのコレクションです。第97回.図形オートシェイプ(Shape)マクロVBAで、オートシェイプ(図形)を扱う場合の解説です。オートシェイプ(図形)はShapeオブジェクトであり、ShapeオブジェクトのコレクションがShapesコレクションになります。Shapeオブジェクトは、多くのオブジェクトをメンバーに持った複雑なオブジェクトとなっています。こちらを参照してください。詳細は上記ページを見てもらうとして、DrawingObjectsとの比較のためにメンバーの一覧を見てみます。AddCalloutAddChart2AddConnectorAddCurveAddFormControlAddLabelAddLineAddOLEObjectAddPictureAddPicture2AddPolylineAddShapeAddSmartArtAddTextboxAddTextEffectAdd3DModelBuildFreeformItemSelectAllそんなに数は多くありません。VBAのコレクションの多くは、プロパティ・メソッドは少なめになっています。コレクションDrawingObjectsは、DrawingObjectオブジェクトのコレクションです・・・と言いたいところですが、この表現はあまり正確とは言えません。DrawingObjectというデータ型は存在していません。DrawingObjects(インデックスor名前)で取得されるオブジェクトは、Object型になります。DrawingObjectという特定のデータ型は存在していないので、Object型のコレクションとなっています。DrawingObjectsは非表示メンバになっていますので、オブジェクトブラウザで確認する場合は、右クリックから「非表示メンバを表示」で表示させてください。_Dummy12_Dummy15_Dummy22_Dummy28_Dummy3_Dummy47_Dummy54_Dummy56AddItemBringToFrontCheckSpellingCopyCopyPictureCutDeleteDuplicateGetEnumeratorGroupItemLinkComboListRemoveAllItemsRemoveItemReshapeSelectSelectedSendToBackUngroupVerticesShapesに比べて非常に多くのメンバーがあることがお分かりいただけると思います。DrawingObjectsは、Microsoft/Docsの通常のページには載っていません。DrawingObjectsメンバこのページは、「以前のバージョンのドキュメント」として残されているページになります。上で見たように、ShapesとDrawingObjectsのプロパティ・メソッドは大きく違っています。DrawingObjectsは古いVBAで、互換性のために残されている非表示メンバです。全てが引き継がれているとは限りません。中には引き継がれずに、他のオブジェクトやコレクションメンでは扱えなくなっているものも存在します。少なくとも、DrawingObjectsの代替えとしてShapesが存在していると単純に考えることはできません。Countプロパティの違い私が最も大きな違いと考えるのは、コレクションに含まれるオブジェクトに違いがあるという事です。ActiveSheet.DrawingObjects.CountActiveSheet.Shapes.Countこれら二つは同じなのでしょうか。(同じとして紹介しているページもあると思います。)シートに「入力規則」の「リスト」を設定して、イミディエイトウインドウで、?ActiveSheet.DrawingObjects.Count?ActiveSheet.Shapes.Count上記二つの値を確認してください、違ったはずです。Shapes.Countの方が1多くなったはずです。Shapesには、入力規則のドロップダウンが含まれてしまいます。これにより、以下のようなトラブルが発生します。Down)シートのShapeを全削除すると、入力規則のリストのドロップダウンが消えてしまいます。こちらを参照して下さい。入力規則のリストのドロップダウンが消えてしまう具体的なマクロは、以下のようなVBAコードになります。Shapeオブジェクトに入っているプロパティ・メソッドDrawingObjectsにあった多くのプロパティ・メソッドの中には、Shapesコレクションではなく、中のShapeオブジェクトに入っているものがあります。プロパティでは、PrintObjectこれは、Shapeオブジェクト.ControlFormat.PrintObjectとして存在します。メソッドでは、CopyCutDeleteDuplicateこれらは、Shapeオブジェクトに存在します。ここで考えたいのは、コレクションにあるプロパティ・メソッドは、コレクション内のすべてのオブジェクトに対して一括で作用します。オブジェクトのプロパティ・メソッドは、そのオブジェクトのみにしか作用しません。DrawingObjectsでは、全ての図(オブジェクト)に対して一括で操作できるプロパティ・メソッドが多数存在したが、Shapesでは、個別のオブジェクトに対して操作しなければならないという事です。コレクションの要素を指定して取得されるオブジェクトの違いShapesは、Shapeオブジェクトのコレクションです。Shapes(インデックス)はShapeオブジェクトです。DrawingObjectというデータ型は存在していません。DrawingObjects(インデックス)は、汎用のobject型になります。イミディエイトで以下を確認してみましょう。この結果はあくまで例として図(オブジェクト)によって結果はまちまちになります。対して、?typename(ActiveSheet.shapes(1))ShapeこれはShapeオブジェクトなので納得できると思いますが、図の種類がこれでは判別できません。Shapeの場合は、Typeプロパティで判別します。?ActiveSheet.Shapes(1).Type1この結果は、MsoShapeType列挙の数値になります。前述したように、DrawingObjectsでは、全ての図(オブジェクト)に対して一括で操作できるプロパティ・メソッドが多数存在するので、そのような場合は、DrawingObjectsが便利に使えるという事になります。シートの全ての図の「オブジェクトを印刷する」を設定するアクティブシートの全ての図の「オブジェクトを印刷する」のチェックを外します。False※DrawingObjects(インデックス)にもPrintObjectは存在します。FalseNextこのように一つずつ設定する必要があります。シートの全ての図を削除するアクティブシートの全ての図を削除します。ActiveSheet.DrawingObjects.Delete※DrawingObjectsには入力規則のドロップダウンは含まれていません。IfNextこのように、入力規則のドロップダウンかを判定して削除しないようにする必要があります。シートの全ての図を別シートへコピーするWorksheets(1)の全ての図をコピーし、Worksheets(2)のA1セルに貼り付けします。WithShapesを使った場合オートシェイプを他ブックの同じ位置に貼り付けるコメントでリクエストを頂きました。「1つのシートにバラバラにあるオートシェープを一度に選択して、コピーし、ほかのブックのあるシートの同じ位置にペーストしたい」というもの。これには色々な問題が含まれています。.SelectAllSelection.CopyこのようなVBA記述をするか、もしくはShape一つずつCopyすることになります。シートの全ての図を複製して別シートへ移動Worksheets(1)の全ての図を複製&切り取りし、Worksheets(2)のA1セルに貼り付けします。WithShapesを使った場合は、Shapeオブジェクト一つずつに対してDuplicateを実行しなければならず、この場合なら、Duplicateを使うメリットがないと思います。図(オブジェクト)のコピーを行うと、その図(オブジェクト)が選択状態になります。図の選択状態を解除するには、以下のどちらかのVBAで行ってください。With一般的な方法として、ActiveCell.Activateを使う方法も考えられますが、DrawingObjectsで複数の図をコピーした時には、ActiveCellが取得できない状態になってしまう為、ActiveCellでエラーとなってしまいます。最後にShapesとDrawingObjectsの違いを見てきましたが、そもそも図オブジェクトは、多くのオブジェクトをメンバーに持った複雑なオブジェクトとなっていて、全てを把握するのはとても困難なオブジェクトになります。必要に応じて、都度プロパティ・メソッドを調べられるようにしておけば良いと思います。最初に書いた通り、DrawingObjectsは古いVBAですので通常は使うべきではないでしょう。このような古いオブジェクト・コレクションは、今後のバージョンアップに際し動作保証されない可能性もありますし、なにより、信頼すべきドキュメントが見つからない為にVBA記述に苦労することが多々あります。従って、基本的にはShapesで書くようにしたほうが良いでしょう。一括でシートの全ての図に対して操作したい場合は、便利な方法として覚えておくと役に立つこともあると思います。以下も参考にして下さい。第97回.図形オートシェイプ(Shape)マクロVBAで、オートシェイプ(図形)を扱う場合の解説です。オートシェイプ(図形)はShapeオブジェクトであり、ShapeオブジェクトのコレクションがShapesコレクションになります。Shapeオブジェクトは、多くのオブジェクトをメンバーに持った複雑なオブジェクトとなっています。オートシェイプを他ブックの同じ位置に貼り付けるコメントでリクエストを頂きました。「1つのシートにバラバラにあるオートシェープを一度に選択して、コピーし、ほかのブックのあるシートの同じ位置にペーストしたい」というもの。これには色々な問題が含まれています。図をセル内に強制的に収める(Shape)図(画像等)をエクセルに貼り付けた後、セルの移動と一緒に動かない場合があります。図の書式のプロパティでは、「セルに合わせて移動」にしてある場合の話です。図がセルを大きくはみ出しているいる場合(隣のセルよりさらにはみだしている場合)は、セルのコピー、移動にくっていてきません。図を確認しながら消していく(Shape)行削除や、列削除等により、図が見えなくなってしまう事があります。セルのコピーで沢山出来てしまい、困った事ありませんか。「ジャンプ」→「セル選択」で、オブジェクトで一括選択して削除する事は出来ます。写真の取込方法について(Pictures.Insert,Shapes.AddPicture)写真を取り込んで、アルバムのようにしたり、各種の資料を作ったりと、写真をエクセルに取り込む機会は多いようです。最近は写真のサイズも大きくなり、手動で取り込んだままではスクロールもままならない状態となってしまいます。そこで、写真ファイルを指定し、A列に上から順番に貼り付け、さらにセル内に収まるように縮小するマクロになります。Down)シートのShapeを全削除すると、入力規則のリストのドロップダウンが消えてしまいます。こちらを参照して下さい。入力規則のリストのドロップダウンが消えてしまう具体的なマクロは、以下のようなVBAコードになります。オブジェクトの探索方法VBAを書き進めて行くと、どうしてもオブジェクトの扱い時に分からないことがでてきます、何が分からないかというと、オブジェクトの中の目的の要素をどのように指定したら良いのかということです、オブジェクトの中を探索して、目的の要素にたどり着く方法を説明します。ローカルウィンドウを主体に説明します。Next)|VBA入門8.セルに文字を入れるとは(Range,Value)|VBA入門9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説10.ひらがな⇔カタカナの変換|エクセル基本操作ホームマクロVBAマクロVBA技術解説ShapesとDrawingObjectsの相違点と使い方このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。GASスプレッドシート入門スプレッドシート応用GAS入門GAS応用ホームマクロVBAマクロVBA技術解説ShapesとDrawingObjectsの相違点と使い方このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。