为什么在Excel中循环浏览形状时代码会崩溃?鬼影?
在使用VBA编写一个程序来定位和操作Excel中的形状时,我遇到了一个无法理解的错误!(还有什么新的吗?)经过半天的手表筛选,我得出结论,有时Excel会意外地保留剩余的形状。或者,至少出于一个我无法理解的原因为什么在Excel中循环浏览形状时代码会崩溃?鬼影?,excel,vba,Excel,Vba,在使用VBA编写一个程序来定位和操作Excel中的形状时,我遇到了一个无法理解的错误!(还有什么新的吗?)经过半天的手表筛选,我得出结论,有时Excel会意外地保留剩余的形状。或者,至少出于一个我无法理解的原因 . . . i=1 For Each shp In .Shapes arrShapes(i, 1) = shp.TopLeftCell.Address arrShapes(i, 2) = shp.TopLeftCell.row
. . .
i=1
For Each shp In .Shapes
arrShapes(i, 1) = shp.TopLeftCell.Address
arrShapes(i, 2) = shp.TopLeftCell.row
arrShapes(i, 3) = shp.TopLeftCell.Column
arrShapes(i, 4) = shp.ID
Next shp
这段代码大部分时间运行良好,但偶尔会出现错误“运行时错误1004:应用程序定义或对象定义错误”
虽然.Shapes.Count给了我7个形状,但最后一个导致了错误。我只能在我的床单上找到6个形状。(4条插入内容+2条注释)
(是的,我考虑了一个从0开始的索引,但事实并非如此,它创建了一个新的超出范围错误。此外,计数为7,并且观察程序中没有.Shapes.Item 0。)
(参考)
我的解决方案如下。很高兴听到其他人的看法。进一步研究,Excel似乎认为这张表上有一个神秘的第七形状。(形状下的第7项)。但是这个物体的属性只有其他形状的一半 为了纪念万圣节,我称之为“鬼魂形状” 不知道它是从哪里来的。我找不到它。我在屏幕上看不到它。我不记得创建了它——这并不是说我没有。但如果我真的创建了它,我99.9%肯定我也删除了它 Excel给我的鬼魂形状命名为“第28行”。它有一个左上角的位置。(那里什么都没有)一行。前景色和可见光是真的 但是高度和宽度属性都是0 这至少给了我一种识别它们的方法,以过滤掉它们。 因此,我只是将代码修改为:
. . .
On Error Resume Next
. . .
i=1
For Each shp In .Shapes
If shp.Height = 0 And shp.Width = 0 _
Or Err.Number = 424 Then
shp.Delete
Else
arrShapes(i, 1) = shp.TopLeftCell.Address
arrShapes(i, 2) = shp.TopLeftCell.row
arrShapes(i, 3) = shp.TopLeftCell.Column
arrShapes(i, 4) = shp.ID
End If
Next shp
这消除了重影形状中的错误,并在找到它们时将其删除
这会让我成为一个捉鬼者吗?“最后一个导致了错误”因为你没有提到错误是什么,所以不清楚这里真正的“问题”是什么。如果只是在工作表上发现了一个出乎意料的“额外”形状,那么似乎不需要在这里记录它。如果不止这些,那么似乎添加一些实际的具体细节会很有用。错误是424-我在下面的“具体”回答中对此进行了澄清。Tim,我只是想分享知识。我尝试了IsEmpty、IsNothing、IsObject、IsNull、IsMissing、shp上的IsError和各种属性,但总是出现424错误。我应该补充一点,这是很难测试的,因为很难特意创建用于测试的“幽灵形状”。所以,我非常感谢任何贡献。谢谢。