VBA|画像を範囲指定して削除する方法

エクセルVBA VBAで画像・図・グラフの操作



VBAでエクセル上の画像をセルの範囲を指定して削除するにはどのようにすればよいのでしょうか?

今回は、画像を範囲指定して削除する方法について徹底的に解説していきます。

サンプルコードも紹介します。



VBAで画像を範囲指定して削除する方法

セル範囲を指定して画像を削除するためには??

今回は、上図のようにマウスで指定する範囲の「始点セル」と「終点セル」を指定することで、指定範囲内の画像を削除する方法・マクロを紹介します。

セルの指定範囲内の画像を削除するマクロ

最初に、下図のように画像が貼られているエクセルの画像を範囲指定して削除するサンプルコードを示します。

セル範囲を指定して画像を削除する

サンプルコード:

Sub 指定した範囲で削除()
    Dim inp_a As Range         '指定範囲の始点セル
    Dim inp_b As Range         '指定範囲の終点セル
    Dim select_range As Range  '指定した範囲
    Dim shp_rng As Range       '図形が存在するセル
    Dim i As Long

   ''''開始セルの選択''''
    On Error Resume Next
    Set inp_a = Application.InputBox(prompt:="マウスで始点セルを選択", _
                                   Title:="始点セルを選択", _
                                   Default:="マウスで始点セルを選択", _
                                   Type:=8)
    If Err.Number = 0 Then
        MsgBox myRange.Address
    Else
        MsgBox "キャンセルしました"
        Exit Sub
    End If
    
   ''''終了セルの選択''''
    On Error Resume Next
    Set inp_b = Application.InputBox(prompt:="マウスで終点セルを選択", _
                                   Title:="終点セルを選択", _
                                   Default:="マウスで終点セルを選択", _
                                   Type:=8)
   ''''キャンセルの処理''''
    If Err.Number = 0 Then
       MsgBox myRange.Address
    Else
       MsgBox "キャンセルしました"
       Exit Sub
    End If
   
    On Error GoTo 0
   
   ''''指定範囲内に存在する図形を削除する''''
    Set select_range = Range(inp_a, inp_b)
    For i = ActiveSheet.Shapes.Count To 1 Step -1
        With ActiveSheet.Shapes(i)
            Set shp_rng = Range(.TopLeftCell, .BottomRightCell)
            If Not Intersect(shp_rng, select_range) Is Nothing Then
                ActiveSheet.Shapes(i).Delete
            End If
        End With
    Next i
End Sub

実行すると、セル範囲を指定するために2つのメッセージが表示されます。

それぞれ指定範囲のセルをマウスでクリックすると、選択したセルがメッセージボックスに入ります。

任意のセルを指定すると、以下のように指定した範囲の画像が削除されます。

指定範囲の画像が削除される

以下の項目では、今回のサンプルコードに盛り込まれているメソッドを分解して解説していきます。

画像があるセルを取得するには【TopLeftCell、BottomRightCell】を使う

画像があるセルを取得するには、TopLeftCell、BottomRightCell を使います。

TopLeftCell:画像の左上セルを取得する

BottomRightCell:画像の右下のセルを取得する

具体的には、Shapes(1).TopLeftCell.rowと記述することで、画像の左上のセルの行を取得することができます。

以下の画像に対して、セルを取得してみます。

サンプルコード:

Sub 画像のセルを取得()
    With ActiveSheet.Shapes(1)
        MsgBox "左上:" & .TopLeftCell.Row & " , " & .TopLeftCell.Column & vbCrLf & _
             "右下:" & .BottomRightCell.Row & " , " & .BottomRightCell.Column
    End With
End Sub

下図のように画像の「左上」「右下」のセルを取得することができます。

画像の左上・右下のセルを取得できる

任意のセルの画像の有無を確認する【Intersectメソッド】

あるセルに画像が有るか無いかを判断するには、ApplicationオブジェクトのIntersectメソッドを使います。

Intersect(範囲1, 範囲2)

のようにしたとき「範囲1」と「範囲2」で重なっているセルを返します。

これを、あるセルの画像の有無を判断するために使うには、

「範囲1」に「画像の左上から右下のセル範囲」、「範囲2」に「セルの指定範囲」としてます。

今回のサンプルコードでは、Intersect(shp_rng, select_range) のように「shp_rng に画像の左上から右下のセル範囲」、「select_range にセルの指定範囲」としています。

コメント

タイトルとURLをコピーしました