删除图像但无法避免删除命令按钮

时间:2019-10-02 21:21:09

标签: excel vba

我不是vba的普通用户,因此当我开始执行此代码时,我完全空白。我已经删除了工作表上的所有图像,包括命令按钮和一个我不想删除的徽标。

这是我的代码

Private Sub CommandButton2_Click()

Dim Pic As Object

Range("D20:D3000").ClearContents

For Each Pic In ActiveSheet.Pictures
Pic.Delete
Next Pic


End Sub

如您所见,我需要它来删除D列上的图像,但它会删除整个工作表的图像。 我找不到排除删除删除指令的命令按钮的方法(我在那张纸上使用2)。你们中的一些人请,请帮助我吗?我现在一团糟。

2 个答案:

答案 0 :(得分:1)

  

我需要它来删除D列上的图像,但它会删除整张纸上的图像。

您要遍历工作表上的所有图片,并且在调用其Delete方法之前,切勿验证工作表上的位置

有趣的是,如果Sheet1上有一张图片和一个ActiveX命令按钮,那么Sheet1.Pictures.Count意外地返回2-这就是循环也删除命令按钮的原因。

我建议改为迭代Shapes集合:Shape对象具有一个接口,该接口使分辨图片(与ActiveX按钮分开)更加容易,并且...它所在的工作表。

使用Shape.Type可以知道是否正在查看msoPicture,并使用Shape.TopLeftCell可以得到一个Range对象,该对象代表图片的左上角位于如果该Column的{​​{1}}是Range,那么我们正在寻找一个其左上角位于D列的形状。

4

请注意,如何为我们的循环变量声明一个非Dim currentShape As Shape For Each currentShape In ActiveSheet.Shapes If currentShape.Type = msoPicture And currentShape.TopLeftCell.Column = 4 Then currentShape.Delete End If Next 的显式类型,我们将获得编译时验证以及这些成员调用中的每个成员调用的自动完成/智能性,而针对{{1 }}都是后期绑定的(即即使您在模块的顶部有Object,也可以使用拼写错误进行编译),并且只会在运行时出现任何错误(例如,错误438)时爆炸尝试调用一个不存在的成员。

答案 1 :(得分:0)

以下内容将图片的范围与您的范围进行比较,并在相交时将其删除:

Private Sub CommandButton2_Click()
    Dim objPicture As Object
    Dim objPictureRange As Object
    Dim objRange As Object

    Set objRange = Range("D20:D3000")
    objRange.ClearContents

    For Each objPicture In ActiveSheet.Pictures

        ' Get Picture's range
        Set objPictureRange = Range(objPicture.TopLeftCell.Address & ":" & objPicture.BottomRightCell.Address)

        ' Check if Picture is in Range
        If Not Intersect(objRange, objPictureRange) Is Nothing Then
            ' Delete picture
            objPicture.Delete
        End If

    Next Pic

End Sub