VBA入門
図形オートシェイプ(Shape)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
公開日:2013年5月以前 最終更新日:2023-01-08

第97回.図形オートシェイプ(Shape)


マクロ VBA 図形 シェイプ

マクロVBAで、オートシェイプ(図形)を扱う場合の解説です。
オートシェイプ(図形)はShapeオブジェクトであり、
ShapeオブジェクトのコレクションがShapesコレクションになります。


Shapeオブジェクトは、多くのオブジェクトをメンバーに持った複雑なオブジェクトとなっています。
オートシェイプの細部までマクロVBAで扱う為には、多くのオブジェクトを理解する必要があります。


図形オートシェイプ(Shape)関連のオブジェクト群

Shapesコレクション
Shapeオブジェクトのコレクション

Shapeオブジェクト
オートシェイプ、フリーフォーム、OLE オブジェクト、またはピクチャなど、描画レイヤーのオブジェクトを表します。

ShapeRangeオブジェクト
文書の図形セットである図形範囲を表します。

GroupShapes オブジェクト
グループ化した図形を表します。

さらに、Shapeオブジェクトのプロパティで取得できる下位のオブジェクトとして、
FillFormatオブジェクト
図形の塗りつぶしの書式設定を表します。

LineFormatオブジェクト
線と矢印の両端の書式を表します。

TextFrameオブジェクト
レイアウト枠を表します。

TextFrame2オブジェクト
2007から追加されたTextFrameの後継オブジェクト。

これらのコレクション、オブジェクトに、それぞれにメンバーとしてプロパティとメソッドを持っています。
図形(Shape)関連のプロパティ、メソッド一覧
・Shapesコレクション ・・・ Shapeオブジェクトのコレクション ・Shapeオブジェクト ・・・ オートシェイプやピクチャなど、描画レイヤーのオブジェクト ・ShapeRangeオブジェクト ・・・ 文書の図形セットである図形範囲を表します。 ・GroupShapesオブジェクト ・・・ グループ化した図形を表します。 ・FillFormatオブジェクト ・・・ 図形の塗りつぶしの書式設定を表します。 ・LineFormatオブジェクト ・・・ 線と矢印の両端の書式を表します。 ・TextFrameオブジェクト ・・・ レイアウト枠を表します。 ・TextFrame2オブジェクト ・・・ 2007から追加されたTextFrameの後継オブジェクト。

上の一覧をご覧いただければわかりますが、非常に多くのプロパティがありますので、とても全てを把握する事は困難です。
そして、決してこれで全てではありません、下位のオブジェクは他にもたくさんあります。

変更したいプロパティやメソッドのみ、都度調べれば良いでしょう。
オブジェクトの探索方法(オートシェイプのTextを探して)
・オブジェクト探索の説明で使う例題 ・自動記録を使ってオートシェイプの概要を知る ・ローカルウィンドウでオートシェイプのテキストを調べる ・オートシェイプの位置移動について ・VBAを完成させる ・オブジェクトブラウザーを使いさらにオブジェクトを調べる ・ウォッチウィンドウについて

プロパティの設定値やメソッドの引数について知りたい場合は、
マクロの記録で自動記録されたVBAコードを参考にするのが最も早く簡単です。
※ただし、Excel2007を使っている場合は、正しく記録されません。

上記のプロパティ、メソッド一覧は、
マクロの記録で作成されるVBAコードを読む時の参考にしてください。


図形オートシェイプ(Shape)の追加

図形をワークシートに追加する場合は、
ShapesコレクションのAddShapeメソッドを使います。

Shapesコレクション.AddSahpeメソッド

ワークシートの新しいオートシェイプを表す Shape オブジェクトを返します。
Shapesオブジェクト.AddShape(Type, Left, Top, Width, Height)

名前 必須/オプション データ型 説明
Type 必須 MsoAutoShapeType 作成するオートシェイプの種類を指定します。
MsoShapeType列挙で指定します。
Left 必須 単精度浮動小数点型 (Single) 文書の左上隅を基準に、オートシェイプの境界ボックスの左上隅となる位置をポイント単位で指定します。
Top 必須 単精度浮動小数点型 (Single) 文書の左上隅を基準に、オートシェイプの境界ボックスの左上隅となる位置をポイント単位で指定します。
Width 必須 単精度浮動小数点型 (Single) オートシェイプの境界ボックスの幅をポイント単位で指定します。
Height 必須 単精度浮動小数点型 (Single) オートシェイプの境界ボックスの高さをポイント単位で指定します。

戻り値は、追加されたShapeオブジェクトです。

Shapesコレクションの使用例

Dim sp As Shape
Set sp = ActiveSheet.Shapes.AddShape(msoShapeRightArrow, 0, 0, 100, 50)

右向きのブロック矢印を挿入(幅100、高さ50)しています。

テキストボックスの追加

テキストボックスを追加するには、AddTextboxメソッドを使用します。

Shapesオブジェクト.Addtextbox(Orientation、 Left、 Top、 Width、 Height)

名前 必須 / オプション データ型 説明
Orientation 必須 MsoTextOrientation テキスト ボックス内の文字列の向きを指定します。
Left 必須 Single 文書の左上隅を基準にしてテキストボックスの左上隅の位置をポイント単位で指定します。
Top 必須 Single 文書の上端を基準にしてテキスト ボックスの左上隅の位置をポイント単位で指定します。
Width 必須 Single テキスト ボックスの幅をポイント単位で指定します。
Height 必須 Single テキスト ボックスの高さをポイント単位で指定します。

MsoTextOrientation列挙
msoTextOrientationDownward 3 下方向。
msoTextOrientationHorizontal 1 水平方向。
msoTextOrientationHorizontalRotatedFarEast 6 水平方向および東アジア言語のサポートを必要に応じて回転します。
msoTextOrientationMixed -2 サポートされません。
msoTextOrientationUpward 2 上方向。
msoTextOrientationVertical 5 垂直方向。
msoTextOrientationVerticalFarEast 4 東アジア言語のサポートに必要な場合、垂直方向です。

Addtextboxの使用例
Dim sp As Shape
Set sp = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, 100, 50)

横書きテキストボックスを挿入(幅100、高さ50)しています。


図形オートシェイプ(Shape)の削除

図形を削除する場合は、ShapeオブジェクトのDeleteメソッドを使います。

Shapeオブジェクト.Delete

Deleteメソッドの使用例
ActiveSheet.Shapes(1).Delete


図形オートシェイプ(Shape)の編集

図形を編集する場合は、Shapeオブジェクトのプロパティ値の変更、
もしくは、
Shapeオブジェクトのプロパティで取得される下位のオブジェクトを操作することで行います。

Shapeオブジェクトのプロパティ値の変更

Shapeオブジェクト.Top = Range("B2").Top
Shapeオブジェクト.Left = Range("B2").Left


B2セルの位置に図形を移動しています。

Shapeオブジェクト.OnAction = "プロシージャー名"

図形にマクロを登録をします。
プロシージャーが実際に存在するかどうかはチェックされずに登録されます。


Shapeオブジェクトのプロパティで取得される下位のオブジェクトの操作

FillFormatオブジェクト ・・・ 図形の塗りつぶしの書式設定を表します。
LineFormatオブジェクト ・・・ 線と矢印の両端の書式を表します。
TextFrameオブジェクト ・・・ レイアウト枠を表します。
TextFrame2オブジェクト ・・・ 2007から追加されたTextFrameの後継オブジェクト。

Shapeオブジェクト.Fill.ForeColor.RGB = RGB(0, 176, 80)
Shapeオブジェクト.Line.ForeColor.RGB = vbRed


緑で塗りつぶし、枠の色を赤にしています。


図形オートシェイプ(Shape)の全選択

いろいろなVBA記述方法があります。

ActiveSheet.Shapes.SelectAll

ActiveSheet.DrawingObjects.Select

Dim sp As Shape
For Each sp In ActiveSheet.Shapes
  sp.Select Replace:=False
Next

Shape.Selectメソッドの構文
Shape.Select Replace:=True/False

Trueを指定した場合、現在の選択範囲を置き換えます。
Falseを指定した場合、選択範囲を拡張します。

以下でいろいろなVBAを紹介しています。
図形オートシェイプの複数選択(Shape,ShapeRange)
・ワークシートの全てのShapeを選択する場合 ・ShapeオブジェクトのSelectメソッド ・ShapeRangeオブジェクト ・シート内の指定名称の図形を選択


図形オートシェイプ(Shape)の扱い方を工夫する

Shapeオブジェクトの中に、さらにオブジェクトが含まれています。
そして、
それぞれのオブジェクトのプロパティ値の指定方法は違いますし、メソッドの引数もそれぞれ違います。
これらを全て覚える事は無理でしょう。

まずは、マクロの記録を参照するようにしてください。
(Excel2007はオートシェイプの操作が正しくマクロ記録されません。)

しかし、マクロの記録で作成されるVBAコードは少々難点が多く、そのまま使えない場合が多くあります。
そして、自動作成されたVBAコードを直して、目的の図形にするのも結構大変な事が多いものです。

お勧めの方法としては、
作業用のシートに雛形のオートシェイプを作成しておき、
それをマクロでコピーするようにして、サイズ・位置等を変更するのが簡単です。
この方法が最も簡単ですので、複雑な事を考える前にこのような方法を検討するようにしてみてください。


オートシェイプ(Shape)を扱う実践例

Sub sample()
  With ActiveSheet.Shapes.AddShape(msoShapeRightArrow, 0, 0, 100, 50)
    .Fill.ForeColor.RGB = RGB(0, 176, 80)
    .Line.ForeColor.RGB = vbRed
    With .TextFrame.Characters
      .Text = "右へ移動"
      .Font.Size = 14
      .Font.Bold = True
    End With
    .Top = Range("B2").Top
    .Left = Range("B2").Left
    .ControlFormat.PrintObject = False
  End With
End Sub

このマクロでは、以下の事を行っています。

1.右向きのブロック矢印を挿入(幅100、高さ50)
2.塗りつぶし色を緑
3.枠の色を赤
4.「右へ移動」の文字追加
5.文字のフォントサイズを14で太字
6.B2セルの位置へ移動
7.オブジェクトを印刷しない

AddShapeの第一引数は、MsoAutoShapeType列挙体になります。
非常にたくさん(140個程度)ありますし、その中から目的の図形を探すのは大変です。
作成する図形のMsoAutoShapeTypeを知りたい場合は、
マクロの記録を使うと良いでしょう。
(一覧の名称から探すのはかなり大変です。)

オブジェクトを印刷する
プロパティの所在が分かりずらいです。
マクロの記録で記録される、
Selection.PrintObject = msoFalse
このPrintObjectは、Shapeの下のControlFormatにありますので、
.ControlFormat.PrintObject = False
このように指定します。

上記のように、全てマクロで作成するより、
前述したとおり、
雛形のオートシェイプを用意し、それをコピーして必要な部分だけを変更して使用する事をお勧めします。

VBA マクロ 画像


図形オートシェイプ(Shape)に関連する記事

以下も参考にして下さい。
オートシェイプを他ブックの同じ位置に貼り付ける
コメントでリクエストを頂きました。「1つのシートにバラバラにあるオートシェープを一度に選択して、コピーし、ほかのブックのあるシートの同じ位置にペーストしたい」というもの。これには色々な問題が含まれています。
図をセル内に強制的に収める(Shape)
図(画像等)をエクセルに貼り付けた後、セルの移動と一緒に動かない場合があります。もちろん、図の書式のプロパティでは、「セルに合わせて移動」にしてある場合の話です。図がセルを大きくはみ出しているいる場合(隣のセルよりさらにはみだしている場合)は、セルのコピー、移動にくっていてきません。
図を確認しながら消していく(Shape)
行削除や、列削除等により、図が見えなくなってしまう事があります。しかも、セルのコピーで沢山出来てしまい、困った事ありませんか。「ジャンプ」→「セル選択」で、オブジェクトで一括選択して削除する事は出来ます。
写真の取込方法について(Pictures.Insert,Shapes.AddPicture)
・Pictures.Insertメソッド ・Shapes.AddPictureメソッド ・Shapesに関連する記事
写真をサムネイルに変換して取り込む(Shapes.AddPicture)
・写真をサムネイルに変換して取り込むVBA ・写真をサムネイルに変換して取り込むVBAの解説 ・Shapesに関連する記事
入力規則のドロップダウンが消えてしまうマクロ(Shapes内のDrop Down)
シートのShapeを全削除すると、入力規則のリストのドロップダウンが消えてしまいます。入力規則のリストのドロップダウンの設定については、エクセル入門.入力規則.リスト こちらを参照して下さい。入力規則のリストのドロップダウンが消えてしまう具体的なマクロは、以下のようなVBAコードになります。
オブジェクトの探索方法(オートシェイプのTextを探して)
・オブジェクト探索の説明で使う例題 ・自動記録を使ってオートシェイプの概要を知る ・ローカルウィンドウでオートシェイプのテキストを調べる ・オートシェイプの位置移動について ・VBAを完成させる ・オブジェクトブラウザーを使いさらにオブジェクトを調べる ・ウォッチウィンドウについて




同じテーマ「マクロVBA入門」の記事

第94回.コメント(Comment)
第95回.ハイパーリンク(Hyperlink)
第96回.グラフ(Chart)
第97回.図形オートシェイプ(Shape)
第136回.フォームコントロール
第137回.ActiveXコントロール
第98回.Findメソッド(Find,FindNext,FindPrevious)
第99回.Replaceメソッド(置換)
第132回.その他のExcel機能(グループ化、重複の削除、オートフィル等)
第135回.ジャンプの選択オプション(SpecialCells)
第141回.行・列の表示・非表示・列幅・行高


新着記事NEW ・・・新着記事一覧を見る

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ