Excel VBAで図形の挿入方法をお探しですね。

広告

Excel VBAで図形を自由に操る!挿入・削除・名前付けの基本テクニック

Excel VBAで図形(オートシェイプ)が扱えるようになると、ボタン風のメニューや注意書き、帳票の目印、処理結果を示すラベルなどをマクロで自動生成できるようになります。

ただし、図形はセルと違って「A1」のような分かりやすい住所を持っていません。

そのため、挿入した後にどうやって参照すればいいのか、どうやって削除すればいいのか、どんな名前を付ければいいのか…と、つまずきやすいポイントが多いんです。

この記事では、Excel VBAで図形を挿入・削除する基本から、マクロで安定して操作するための名前の付け方、クリック時にマクロを実行する方法、固定や保護の考え方まで、まとめて解説していきます。

Excel VBAで図形(オートシェイプ)を挿入する基本

Excel VBAで図形を挿入するときは、ワークシートの`Shapes`コレクションに対して`AddShape`メソッドを使います。

`Shapes`は、そのシート上にある図形、画像、テキストボックス、フォームコントロールなどをまとめて管理している入れ物のようなものです。

その中の1つひとつの図形が`Shape`オブジェクトで、VBAではこの`Shape`オブジェクトを変数に入れて、位置やサイズ、色、文字、名前などを操作していきます。

手作業で挿入した図形も、VBAで作成した図形も、基本的には同じ`Shape`として扱えます。

まずはこの関係を押さえておくことが大切です。

代表的なコードはこんな感じです。

`AddShape`の引数は、図形の種類、左位置、上位置、幅、高さの順で指定します。

位置やサイズの単位はポイントで、1ポイントは約0.35mmです。

セルの行番号や列番号ではなく、シート左上からの座標で指定する点に注意してください。

“`vb
Sub 図形を挿入する()
Dim ws As Worksheet
Dim shp As Shape

Set ws = Worksheets(“Sheet1”)

Set shp = ws.Shapes.AddShape( _
Type:=msoShapeRectangle, _
Left:=100, _
Top:=80, _
Width:=120, _
Height:=40)

With shp
.Name = “btn_更新”
.TextFrame2.TextRange.Text = “更新”
.Fill.ForeColor.RGB = RGB(91, 155, 213)
.Line.ForeColor.RGB = RGB(47, 84, 150)
.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(255, 255, 255)
End With
End Sub
“`

この例では、四角形のオートシェイプを挿入して、名前を`btn_更新`に変更しています。

図形の種類は`msoShapeRectangle`のほか、円なら`msoShapeOval`、角丸四角形なら`msoShapeRoundedRectangle`、右矢印なら`msoShapeRightArrow`のように指定できます。

実務では、挿入直後の戻り値を`Shape`変数に受け取って、その場で名前や書式を設定するのが安全です。

後から「たしか最後に挿入した図形を操作する」みたいな書き方をすると、別の図形が追加されたときに対象がずれてしまう可能性があるからです。

図形をセルに合わせて配置したいときは、セルの`Left`、`Top`、`Width`、`Height`を利用すると分かりやすくなります。

たとえばB2セルの位置に図形を置きたい場合は、`Range(“B2”).Left`や`Range(“B2”).Top`を使います。

これで、シートのレイアウト変更に合わせた図形作成がしやすくなり、帳票や入力フォームの自動生成にも応用できます。

“`vb
Sub セル位置に図形を挿入する()
Dim ws As Worksheet
Dim c As Range
Dim shp As Shape

Set ws = Worksheets(“Sheet1”)
Set c = ws.Range(“B2”)

Set shp = ws.Shapes.AddShape(msoShapeRoundedRectangle, _
c.Left, c.Top, c.Width * 2, c.Height * 1.5)

With shp
.Name = “msg_B2案内”
.TextFrame2.TextRange.Text = “入力してください”
.Placement = xlMoveAndSize
End With
End Sub
“`

`Placement`は、セルの移動やサイズ変更に図形をどう追従させるかを決めるプロパティです。

`xlMoveAndSize`ならセルに合わせて移動・サイズ変更し、`xlMove`なら移動のみ追従し、`xlFreeFloating`ならセルの変更に影響されにくくなります。

手作業で設定する「セルに合わせて移動やサイズ変更をする/しない」に近い考え方なので、図形のずれを防ぎたいときにも確認しておきたい項目です。

図形をマクロから操作するための名前の付け方

Excelの図形は、挿入した時点で自動的に名前が付けられます。

たとえば四角形なら「Rectangle 1」、日本語環境の名前ボックス上では「四角形 1」のように表示されることがあります。

ただし、VBAの`Name`プロパティで参照すると英語名になっている場合があって、画面上の表示とコード上の名前が一致しないことがあるんです。

この違いを知らないままマクロを書くと、「名前ボックスでは見えるのにVBAで参照できない」という混乱が起こりやすくなります。

図形をマクロで安定して操作したいなら、挿入直後に`Name`プロパティで任意の名前を付けるのが基本です。

名前は日本語でも設定できますが、VBAで長く運用する場合は、半角英数字とアンダースコアを中心にした命名をおすすめします。

理由は、コード内で見分けやすく、コピーや共有時にも文字化けや入力ミスが起こりにくいからです。

特に複数人で使うブックや、将来メンテナンスする可能性があるブックでは、見た目の分かりやすさよりも参照の安定性を優先した方が安全です。

命名ルールは、図形の役割が分かるようにそろえると管理しやすくなります。

たとえば、クリック用の図形は`btn_`、説明用のラベルは`lbl_`、警告表示は`msg_`、一時的に作成する図形は`tmp_`のように接頭辞を付けます。

こうしておくと、後で特定の図形だけを削除したり、ボタン図形だけを一覧処理したりできます。

“`vb
Sub 名前を付けて図形を作る()
Dim ws As Worksheet
Dim shp As Shape

Set ws = Worksheets(“Sheet1”)

Set shp = ws.Shapes.AddShape(msoShapeRightArrow, 50, 50, 160, 40)

With shp
.Name = “btn_次へ”
.TextFrame2.TextRange.Text = “次へ進む”
.OnAction = “次へ進む処理”
End With
End Sub

Sub 次へ進む処理()
MsgBox “次の処理を実行します。


End Sub
“`

`OnAction`プロパティを使うと、図形をクリックしたときに指定したマクロを実行できます。

通常のフォームボタンのように使えるので、見た目を自由に作りたい場合に便利です。

ただし、`OnAction`にはプロシージャ名を文字列で指定するため、マクロ名を変更した場合は図形側の設定も合わせて直す必要があります。

図形の名前とマクロ名を近いルールでそろえておくと、後から確認しやすくなります。

既存の図形名を確認したいときは、`For Each`で`Shapes`を順に調べると一覧化できます。

名前ボックスを目視で確認するよりも確実で、同じような図形が多いシートでは特に有効です。

“`vb
Sub 図形名を一覧表示する()
Dim shp As Shape

For Each shp In Worksheets(“Sheet1”).Shapes
Debug.Print shp.Name
Next shp
End Sub
“`

名前を付けるときに注意したいのは、同じシート内で完全に同じ名前を複数の図形に付けないことです。

Excel側で自動的に調整される場合もありますが、VBAから名前で参照するときの混乱につながります。

明細行ごとに図形を作るなら、`btn_削除_001`、`btn_削除_002`のように番号を含めると、後から対象を特定しやすくなります。

マクロで作成した図形を長く使うほど、名前の設計が保守性に大きく影響します。

図形を削除・検索・一括操作するVBAの書き方

図形を削除する最も基本的な方法は、対象の`Shape`に対して`Delete`メソッドを実行することです。

名前が分かっている図形であれば、`Worksheets(“Sheet1”).Shapes(“btn_更新”).Delete`のように書けます。

ただし、存在しない名前を指定するとエラーになるため、実務では削除前に存在確認を入れるか、エラー処理を組み合わせると安定します。

特に、すでに削除済みの図形を再削除しようとするマクロでは、エラー対策が重要です。

“`vb
Sub 指定した図形を削除する()
On Error Resume Next
Worksheets(“Sheet1”).Shapes(“btn_更新”).Delete
On Error GoTo 0
End Sub
“`

一時的に作成した図形だけをまとめて削除したいときは、名前の接頭辞を利用します。

たとえば、`tmp_`で始まる図形を削除するルールにしておけば、手作業で配置した重要な図形まで消してしまう事故を防ぎやすくなります。

全図形を一括削除するコードは簡単ですが、画像、ボタン、グラフ、フォームコントロールまで消える可能性があるため、業務ファイルでは慎重に扱うべきです。

安全に運用するなら、「削除対象を名前で絞る」という考え方を基本にしてください。

“`vb
Sub tmpで始まる図形だけ削除する()
Dim ws As Worksheet
Dim i As Long

Set ws = Worksheets(“Sheet1”)

For i = ws.Shapes.Count To 1 Step -1
If Left(ws.Shapes(i).Name, 4) = “tmp_” Then
ws.Shapes(i).Delete
End If
Next i
End Sub
“`

後ろからループしているのは、削除によって`Shapes`コレクションの番号が詰まるためです。

前から削除すると、次に処理するはずの図形を飛ばしてしまうことがあります。

これは行削除のマクロと同じ考え方で、コレクション内の要素を削除するときの基本的な注意点です。

図形に限らず、VBAで複数要素を削除する場面では覚えておくと役立ちます。

図形を移動、回転、表示切り替えする場合も、名前で参照できればコードはシンプルです。

`Left`と`Top`で位置、`Width`と`Height`でサイズ、`Visible`で表示・非表示、`Rotation`で回転角度を指定できます。

複数の図形を同じように操作したいときは、`ShapeRange`を使う方法もありますが、初心者のうちは`For Each`で1つずつ処理する方が理解しやすいです。

“`vb
Sub 図形を操作する()
With Worksheets(“Sheet1”).Shapes(“btn_次へ”)
.Left = 200
.Top = 100
.Width = 180
.Height = 50
.Rotation = 0
.Visible = msoTrue
End With
End Sub
“`

選択中の図形を操作したいときは、`Selection.ShapeRange`を使うこともできます。

しかし、選択状態に依存するマクロは、実行時の状況によって結果が変わりやすくなります。

安定性を重視するなら、できるだけ`Worksheets(“Sheet1”).Shapes(“図形名”)`のように、シート名と図形名を明示して参照するのがおすすめです。

「いま選択されているもの」ではなく「この名前の図形」を操作する設計にすると、マクロの再現性が高まります。

図形を固定・保護しながら安全に運用するポイント

Excelで図形を使ったマクロを作るときは、挿入や削除だけでなく、ユーザーが誤って動かしたり消したりしない設計も重要です。

図形のプロパティには`Locked`があり、これを`True`にしたうえでシートを保護すると、図形の移動や編集を制限できます。

ただし、`Locked=True`を設定しただけでは不十分で、シート保護と組み合わせて初めて効果を発揮します。

手作業で「ロック」にチェックを入れても固定できない場合は、シート保護が有効になっていないことがよくあります。

VBAで保護まで行う例はこんな感じです。

`DrawingObjects:=True`は、図形などの描画オブジェクトを保護する指定です。

保護後にマクロで図形を変更したいときは、一時的に保護を解除してから操作し、処理後に再度保護する流れにすると分かりやすくなります。

“`vb
Sub 図形を固定してシートを保護する()
Dim ws As Worksheet
Set ws = Worksheets(“Sheet1”)

With ws.Shapes(“btn_次へ”)
.Locked = True
.Placement = xlFreeFloating
End With

ws.Protect Password:=”pass”, DrawingObjects:=True, Contents:=True
End Sub
“`

`Placement`も固定感に関係します。

列幅や行高さの変更に図形を追従させたくない場合は、`xlFreeFloating`を指定すると、セルのサイズ変更による影響を受けにくくなります。

一方で、セルと一緒に動いてほしい図形なら`xlMove`や`xlMoveAndSize`の方が向いています。

「図形を固定したい」といっても、手で動かされたくないのか、セル変更でずれたくないのか、印刷位置を保ちたいのかで必要な設定が変わる点に注意が必要です。

運用面では、図形名、削除ルール、保護設定をセットで考えるとトラブルを減らせます。

たとえば、マクロで自動生成する図形には必ず`tmp_`や`auto_`を付け、手作業で残す図形には`base_`を付けるようにします。

削除マクロでは`tmp_`だけを対象にし、ボタンや背景図形は削除対象から外します。

さらに、ユーザーに触らせたくない図形は`Locked=True`にしてシートを保護すれば、誤操作を防ぎながらマクロで必要な部分だけを更新できます。

まとめ:図形を使いこなすための基本方針

最後に、Excel VBAで図形を扱うときの基本方針を整理しておきましょう。

図形はセルのように番地で管理するのではなく、`Shapes`コレクション内の`Shape`オブジェクトとして管理します。

そのため、挿入直後に分かりやすい名前を付けて、以後はその名前で参照することが最も重要です。

削除するときは全削除ではなく名前のルールで対象を絞り、必要に応じて`OnAction`でマクロを割り当て、`Locked`や`Placement`で固定方法を調整します。

この流れを押さえておけば、Excel VBAで図形(オートシェイプ)を挿入・削除し、マクロから安定して操作する仕組みを作れるようになります。

ぜひ実際に試しながら、図形を使った便利なマクロを作ってみてください!

広告