我不是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)。你们中的一些人请,请帮助我吗?我现在一团糟。
答案 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