図を名前やタイプで削除
動画でExcel タイトル
オートシェイプや図を名前やタイプで削除
動画版「マクロ講座」です。
今回は、Shapes(オートシェイプや図)を削除するの後編です。
内容は、
1.図形をタイプで削除する
2.名前では判定して削除する
3.ユーザーに聞いて削除するか決めるマグロ
4.シート上のすべての図形の名前を取得するマクロ
となります。削除対象をセル範囲で限定できない場合には、タイプや名前や個別に判断して削除するというマクロを使うと便利です。
(サンプルファイルは、こちらです。 図を名前やタイプで削除、サンプル81回)
マクロ動画 オートシェイプや図を名前やタイプで削除
図形を名前やタイプで削除するには
VBAでShapeを扱う時には、そのタイプが何かを知らないといけません。下記図で確認してください。
吹き出しならmsocallout、コメントならmsocomment、直線ならmsoLineというように指定します。

MsoShapeTypeについて
名前 | 値 | 説明 |
---|---|---|
msoShapeTypeMixed | -2 | 図形の種類の組み合わせ |
msoautoshape | 1 | オートシェイプ |
msocallout | 2 | 吹き出し |
msochart | 3 | グラフ |
msocomment | 4 | コメント |
msoFreeform | 5 | フリーフォーム |
msogroup | 6 | グループ化された図形 |
msoEmbeddedOLEObject | 7 | 埋め込み OLE オブジェクト |
msoformcontrol 返さ | 8 | フォームコントロール |
msoLine | 9 | 直線 |
msoLinkedOLEObject | 10 | リンク OLE オブジェクト |
msoLinkedPicture | 11 | リンク画像 |
msoOLEControlObject | 12 | ActiveXコントロール |
msoPicture | 13 | 画像 |
msoplaceholder | 14 | プレースホルダー |
msoTextEffect | 15 | テキスト効果 |
msoMedia | 16 | メディア |
msotextbox | 17 | テキスト ボックス |
msoscriptanchor | 18 | スクリプト アンカー |
msotable | 19 | 表 |
msocanvas | 20 | トリミング |
msodiagram | 21 | 図表 |
msoink | 22 | インク |
msoinkcomment | 23 | インク コメント |
msoSmartArt | 24 | SmartArt グラフィック |
msowebvideo | 26 | Web ビデオ |
msocontentapp | 27 | コンテンツ Office アドイン |
msographic | 28 | グラフィック |
msoLinkedGraphic | 29 | リンクされたグラフィックス |
mso3DModel | 30 | 3d モデル |
msoLinked3DModel | 31 | リンクされた3d モデル |
msoPictureを削除するというマクロを実行してみます。

Sub delType_picture() 'シート内の画像のみ削除する Dim sh As Shape For Each sh In ActiveSheet.Shapes If sh.Type = msoPicture Then sh.Delete End If Next End Sub
msoPictureの画像だけを消すことができました。

つづいて、テキストボックスだけ削除するコードです。

Sub delType_TextBox() 'シート内のmsoTextBoxのみ削除する Dim sh As Shape For Each sh In ActiveSheet.Shapes If sh.Type = msoTextBox Then sh.Delete End If Next End Sub
次のコードは、シート内のフォームコントロールボタンを削除する場合のコードです。

Sub delType_Form() 'シート内のFormのみ削除する Dim sh As Shape For Each sh In ActiveSheet.Shapes If sh.Type = msoFormControl Then sh.Delete End If Next sh End Sub
隣のActiveXcontrolボタンを削除するなら、次のように指定します。

Sub delType_Activex() 'シート内のmsoOLEControlObjectのみ削除する Dim sh As Shape For Each sh In ActiveSheet.Shapes If sh.Type = msoOLEControlObject Then sh.Delete End If Next sh End Sub
オートシェイプを削除するケース
オートシェイプの〇だけ削除するには、選択すると楕円9のように名前がついています。VBAで書く時は、"Oval*"のように指定することができます。

'名前で削除 Sub eachshapedel_name() Dim sh As Shape For Each sh In ActiveSheet.Shapes If sh.Name Like "Oval*" Then sh.Delete End If Next sh End Sub
簡単にオートシェイプの名前を知りたい
簡単にオートシェイプの名前を知るには、マクロコードを次のように書くことで、イミディエイトウィンドウに表示できます。

' シート上のすべての図形の名前を取得する Sub shapename() Dim sh As Shape For Each sh In ActiveSheet.Shapes Debug.Print sh.Name Next sh End Sub
図形をひとつずつマクロが指定し削除するか聞いてくれるコード
一番おすすめがこちらのコードです。図形をひとつずつマクロが指定し削除するか聞いてくれるコードにしました。
このマクロだと、ひとつずつのShapeに対して、削除するかをMsgBoxが聞いてくるので、確実に削除したいShapeだけを削除し、残したいShapeを除外することができます。

Sub askDeleteShapes() Dim sh As Shape, res As Integer For Each sh In ActiveSheet.Shapes Range(sh.TopLeftCell, sh.BottomRightCell).Select res = MsgBox(sh.Name & vbLf & vbLf & _ "この図形を削除してもいいですか?削除ならYES。", vbYesNo, "削除ならYES") If res = vbYes Then sh.Delete End If Next sh End Sub