図を名前やタイプで削除

マクロ講座 動画編 81回
マクロ講座

動画でExcel タイトル

オートシェイプや図を名前やタイプで削除

動画版「マクロ講座」です。
今回は、Shapes(オートシェイプや図)を削除するの後編です。 内容は、 1.図形をタイプで削除する 2.名前では判定して削除する 3.ユーザーに聞いて削除するか決めるマグロ 4.シート上のすべての図形の名前を取得するマクロ となります。削除対象をセル範囲で限定できない場合には、タイプや名前や個別に判断して削除するというマクロを使うと便利です。
(サンプルファイルは、こちらです。 図を名前やタイプで削除、サンプル81回

マクロ動画 オートシェイプや図を名前やタイプで削除

図形を名前やタイプで削除するには

VBAでShapeを扱う時には、そのタイプが何かを知らないといけません。下記図で確認してください。
吹き出しならmsocallout、コメントならmsocomment、直線ならmsoLineというように指定します。

画像を名前で削除する1

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を削除するというマクロを実行してみます。

画像を名前で削除する2
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の画像だけを消すことができました。

画像を名前で削除する3

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

画像を名前で削除する4
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

次のコードは、シート内のフォームコントロールボタンを削除する場合のコードです。

画像を名前で削除する5
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ボタンを削除するなら、次のように指定します。

画像を名前で削除する6
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*"のように指定することができます。

画像を名前で削除する6
 '名前で削除
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

簡単にオートシェイプの名前を知りたい

簡単にオートシェイプの名前を知るには、マクロコードを次のように書くことで、イミディエイトウィンドウに表示できます。

画像を名前で削除する8
' シート上のすべての図形の名前を取得する
 Sub shapename()
    Dim sh As Shape
    For Each sh In ActiveSheet.Shapes
        Debug.Print sh.Name
    Next sh
 End Sub

図形をひとつずつマクロが指定し削除するか聞いてくれるコード

一番おすすめがこちらのコードです。図形をひとつずつマクロが指定し削除するか聞いてくれるコードにしました。

このマクロだと、ひとつずつのShapeに対して、削除するかをMsgBoxが聞いてくるので、確実に削除したいShapeだけを削除し、残したいShapeを除外することができます。

画像を名前で削除する9
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