如何使用VBA删除工作表中的特定形状?

问题描述 投票:0回答:2

我有一个有很多形状的工作表。 我需要删除位于第15行之后的形状,以及写有 "调整大小 "和 "全部清除 "的形状。

e.g

你如何可以看到在图像中,我将有图片(截图),它不能被删除,我试图删除的东西是蓝色的 "按钮"。

excel vba excel-vba
2个回答
2
投票

请尝试下一段代码(现在它根据你的条件只删除圆角矩形)。

Sub testDeleteInsertedShapes()
Dim ws As Worksheet, sh As Shape, shR As ShapeRange, rng As Range
  Set ws = ActiveSheet
  Set rng = ws.Range(ws.Range("A1"), ws.Cells(15, Columns.count))

  Application.EnableEvents = False
  For Each sh In ws.Shapes
    If sh.Type = 1 Then 'rounded rectangles
        If Not Intersect(sh.TopLeftCell, rng) Is Nothing Then
            If sh.TextFrame2.TextRange.text = "Resize" Or _
                 sh.TextFrame2.TextRange.text = "Clear All" Then
                sh.Delete
            End If
        Else
            sh.Delete
        End If
    End If
  Next
  Application.EnableEvents = True
End Sub

还有一个删除所有形状的代码版本(除了图片), 我在你回答我的问题之前就开始工作了:

Sub deleteShapesAllTypes()
  Dim ws As Worksheet, sh As Shape, shR As ShapeRange, rng As Range
  Set ws = ActiveSheet
  Set rng = ws.Range(ws.Range("A1"), ws.Cells(15, Columns.count))
  Debug.Print rng.Address
  For Each sh In ws.Shapes
    If sh.Type = 8 Then
        If Not Intersect(sh.TopLeftCell, rng) Is Nothing Then
            If sh.OLEFormat.Object.text = "Resize" Or _
                   sh.OLEFormat.Object.text = "Clear All" Then
                sh.Delete
            End If
        Else
            sh.Delete
        End If
    ElseIf sh.Type = 12 Then
        If Not Intersect(sh.TopLeftCell, rng) Is Nothing Then
            If sh.OLEFormat.Object.Object.Caption = "Resize" Or _
                   sh.OLEFormat.Object.Object.Caption = "Clear All" Then
                sh.Delete
            End If
        Else
            sh.Delete
        End If
    Else
        If sh.Type <> 13 Then
            If Not Intersect(sh.TopLeftCell, rng) Is Nothing Then
                If sh.TextFrame2.TextRange.text = "Resize" Or _
                     sh.TextFrame2.TextRange.text = "Clear All" Then
                    sh.Delete
                End If
            Else
                sh.Delete
            End If
        End If
    End If
  Next
End Sub

2
投票

首先,你的If -statement是错误的,参见BigBen的评论。

If oShape.Name = "Resize" Or oShape.Name = "Clear All" Then

然而,这将检查形状的名称,而不是它们的文本。要获得形状的文本,你可以使用 oShape.TextFrame2.TextRange.Text. 但是,你可能会面临两个小问题。

(1)有一些形状没有文字,比如图片。这可以用 oShape.TextFrame2.HasText

(2) 可能是文本末尾有一个换行符,或者文本中包含了前导符或尾部的空格,所以我建议你把内容写进一个变量中,然后使用 Instr-功能。

if oShape.TextFrame2.HasText Then
    dim shapeText as string
    shapeText = oShape.TextFrame2.TextRange.Text
    if InStr(shapeText, "Resize") > 0 or InStr(shapeText, "Clear All") > 0 then
       oShape.Delete
    End If
End If

0
投票

功能:

Sub shapeKiller()
    Dim i As Long, N As Long, nm As String, rw As Long
    Dim sh As Shape
    N = ActiveSheet.Shapes.Count

    For i = N To 1 Step -1
        Set sh = ActiveSheet.Shapes(i)
        nm = sh.Name
        rw = sh.TopLeftCell.Row
        If nm = "Resize" Or nm = "Clear All" Or rw > 15 Then
            sh.Delete
        End If
    Next i
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.