我将图像插入到指定区域(rngOblastVlozeni)中。但是在插入图像之前,我想删除到目前为止已经存在的所有图像。
我使用VBA的以下部分来完成此操作:
Dim shpObjekt As Shape
With rngOblastVlozeni.Parent
For Each shpObjekt In .Shapes
If Application.Intersect(shpObjekt.TopLeftCell, rngOblastVlozeni) Is Nothing Then
Else
If (shpObjekt.Type = msoPicture) Or (shpObjekt.Type = msoLinkedPicture) Then
shpObjekt.Delete
End If
End If
Next shpObjekt
End With
但在某些情况下我会收到错误
Run-time error '1004':
Application-defined or object-defined error
错误出现在行If Application.Intersect(shpObjekt.TopLeftCell, rngOblastVlozeni) Is Nothing Then
中,可能在部分shpObjekt.TopLeftCell
中。
当我试图更详细地捕捉它时:
中插入另一张图像
如果该区域为空,则两个shpObjects将无错误地通过,并且直到第三个错误才会出现错误。
如果该区域有一幅图像,那么三个shpObjects就可以了,错误在第四个。
当我同时删除图像和图形,以及该区域的任何图像时,仍然会出现错误(如果没有图像,那么如果有图像,则作为第一个shpObject,然后作为第二个shpObject) --由此推断错误与这些图像中的任何一个都无关。
还有更多的形状收藏吗?例如,从以前的事件?
如果是这样的话,是否有人建议添加代码,以便我“忽略”错误只在此错误的情况下,并且只在VBA的这一部分,并跳转到下一个shpObjekt发生?
还有一个补充--如果我在另一个工作表上使用完全相同的代码,它似乎不会导致这个问题,也就是说,在没有任何问题的情况下,它发生了--也就是说,我似乎在有问题的工作表上有一些额外的对象,但我找不到。我尝试了F5 -去所有的对象,我删除了他们,但问题没有解决-也就是说,它可能不是一个可见的对象?
所以,问题:
,
Shape Object
吗?有可能以某种方式识别它吗?如果Application.Intersect(shpObjekt.TopLeftCell,rngOblastVlozeni)没有什么,那么If (shpObjekt.Type = msoPicture)或(shpObjekt.Type = msoLinkedPicture)则shpObjekt.Delete结束If : End If
如果If Application.Intersect(shpObjekt.TopLeftCell, rngOblastVlozeni) Is Nothing
生成错误1004 (最佳情况下只有此错误)?
谢谢:-)
发布于 2022-08-30 13:59:11
关于你的两个具体问题:
如果您的工作表中没有工作表,我不能说它是否有另一个形状,但是您可以使用
Dim shpObjekt As Shape
With rngOblastVlozeni.Parent
For Each shpObjekt In .Shapes
If Not shpObjekt Is Nothing Then
If Not shpObjekt.TopLeftCell Is Nothing Then
If Application.Intersect(shpObjekt.TopLeftCell, rngOblastVlozeni) Is Nothing Then
Debug.Print "Not intersecting:", shpObjekt.Name, shpObjekt.TopLeftCell.Address, shpObjekt.Type
Else
Debug.Print "Intersecting:", shpObjekt.Name, shpObjekt.TopLeftCell.Address, shpObjekt.Type
If (shpObjekt.Type = msoPicture) Or (shpObjekt.Type = msoLinkedPicture) Then
shpObjekt.Delete
End If
End If
End If
End If
Next shpObjekt
End With
此外,我认为您所遇到的问题的根本原因很可能是您在删除该集合的成员时使用一个For迭代一个集合(即形状).当删除.时,最好使用Next并向后循环。为此,您的代码将成为
Dim shpObjekt As Shape
Dim index As Long
With rngOblastVlozeni.Parent
For index = .Shapes.Count To 1 Step -1
Set shpObjekt = .Shapes.Item(index)
If Not shpObjekt Is Nothing Then
If Not shpObjekt.TopLeftCell Is Nothing Then
If Application.Intersect(shpObjekt.TopLeftCell, rngOblastVlozeni) Is Nothing Then
Debug.Print "Not intersecting:", shpObjekt.Name, shpObjekt.TopLeftCell.Address, shpObjekt.Type
Else
Debug.Print "Intersecting:", shpObjekt.Name, shpObjekt.TopLeftCell.Address, shpObjekt.Type
If (shpObjekt.Type = msoPicture) Or (shpObjekt.Type = msoLinkedPicture) Then
shpObjekt.Delete
End If
End If
End If
End If
Next index
End With
https://stackoverflow.com/questions/73538974
复制相似问题