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

マクロVBAで、オートシェイプ(図形)を扱う場合の解説です。
オートシェイプ(図形)はShapeオブジェクトであり、
ShapeオブジェクトのコレクションがShapesコレクションになります。
オートシェイプの細部までマクロVBAで扱う為には、多くのオブジェクトを理解する必要があります。
図形オートシェイプ(Shape)関連のオブジェクト群
FillFormatオブジェクト
そして、決してこれで全てではありません、下位のオブジェクは他にもたくさんあります。
マクロの記録で自動記録されたVBAコードを参考にするのが最も早く簡単です。
※ただし、Excel2007を使っている場合は、正しく記録されません。
マクロの記録で作成されるVBAコードを読む時の参考にしてください。
図形オートシェイプ(Shape)の追加
ShapesコレクションのAddShapeメソッドを使います。
Shapesコレクション.AddSahpeメソッド
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)しています。
テキストボックスの追加
| 名前 | 必須 / オプション | データ型 | 説明 |
| 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)の削除
Deleteメソッドの使用例
ActiveSheet.Shapes("名前").Delete
図形オートシェイプ(Shape)の編集
もしくは、
Shapeオブジェクトのプロパティで取得される下位のオブジェクトを操作することで行います。
Shapeオブジェクトのプロパティ値の変更
Shapeオブジェクト.Left = Range("B2").Left
プロシージャーが実際に存在するかどうかはチェックされずに登録されます。
Shapeオブジェクトのプロパティで取得される下位のオブジェクトの操作
LineFormatオブジェクト ・・・ 線と矢印の両端の書式を表します。
TextFrameオブジェクト ・・・ レイアウト枠を表します。
TextFrame2オブジェクト ・・・ 2007から追加されたTextFrameの後継オブジェクト。
Shapeオブジェクト.Line.ForeColor.RGB = vbRed
図形オートシェイプ(Shape)の全選択
ActiveSheet.Shapes.SelectAll
ActiveSheet.DrawingObjects.Select
Dim sp As Shape
For Each sp In ActiveSheet.Shapes
sp.Select Replace:=False
Next
Shape.Selectメソッドの構文
Falseを指定した場合、選択範囲を拡張します。
図形オートシェイプ(Shape)の扱い方を工夫する
そして、
それぞれのオブジェクトのプロパティ値の指定方法は違いますし、メソッドの引数もそれぞれ違います。
これらを全て覚える事は無理でしょう。
(Excel2007はオートシェイプの操作が正しくマクロ記録されません。)
そして、自動作成された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
このマクロでは、以下の事を行っています。
2.塗りつぶし色を緑
3.枠の色を赤
4.「右へ移動」の文字追加
5.文字のフォントサイズを14で太字
6.B2セルの位置へ移動
7.オブジェクトを印刷しない
非常にたくさん(140個程度)ありますし、その中から目的の図形を探すのは大変です。
作成する図形のMsoAutoShapeTypeを知りたい場合は、
マクロの記録を使うと良いでしょう。
(一覧の名称から探すのはかなり大変です。)
マクロの記録で記録される、
Selection.PrintObject = msoFalse
このPrintObjectは、Shapeの下のControlFormatにありますので、
.ControlFormat.PrintObject = False
このように指定します。
前述したとおり、
雛形のオートシェイプを用意し、それをコピーして必要な部分だけを変更して使用する事をお勧めします。

図形オートシェイプ(Shape)に関連する記事
オートシェイプを他ブックの同じ位置に貼り付ける
同じテーマ「マクロ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 ・・・新着記事一覧を見る
シンギュラリティ前夜: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入門
このサイトがお役に立ちましたら「シェア」「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.
