VBA Excel:与形状一起使用时,选择集合循环索引引用了不正确的范围

时间:2010-12-13 06:31:56

标签: vba excel-vba selection shapes excel

考虑一个包含许多形状的工作表和一个片段(1):

'(1)
For i = 1 To Selection.Count
    MsgBox Selection(i).Name
Next

无论选择哪种形状(当然必须超过1),前两个形状似乎总是被返回。
考虑使用ShapeRange(2):

'(2)
For i = 1 To Selection.Count
    MsgBox Selection.ShapeRange(i).Name
Next

这(2)实际上返回所选Shape的名称,如(3)所示:

'(3)
For i = 1 To Selection.ShapeRange.Count
    MsgBox Selection.ShapeRange(i).Name
Next

如果(1)在选择少于1个Shape时产生错误,(3)似乎工作正常 - 除非Chart是唯一的选择,返回自动化错误:“调用的对象已断开连接客户端“。

我不明白为什么第一个一般无法返回正确的形状 - 我假设选择集合比眼睛更复杂,我也不明白为什么Selection.ShapeRange.Count失败当一个图表被选中时,但是当一个图表成功时成功。

非常感谢任何关于此事的光明。

2 个答案:

答案 0 :(得分:2)

选择可以包含除形状之外的对象。并非所有选择中的对象都具有name属性。这可能就是为什么你选择了多个形状会出错 - 因为你选择的不仅仅是形状。扫描所有选定形状的正确方法是#3为discussed here

“对象调用”错误听起来像是一个Excel错误。我只是抓住错误,处理它,并查看MS知识库,以获得有关如何解决它和/或最小化其发生的指导。

答案 1 :(得分:2)

我在工作表上有一个图表和五个矩形,我正在使用Excel 2003。

如果我先选择一个矩形,那么图表,(1)代码对我没有错误。它返回我所选择的两个形状的名称。

如果我先选择图表,然后选择一个矩形,它会返回图表两次,就像图表是所选的两个图形一样。我只能假设这是一个错误。但是一个奇怪的错误,因为如果我再次运行代码而不更改选择,它返回的方式就像我先选择矩形一样。奇

如果选择的形状少于一个,则表示选择了一个范围。在Excel中始终选择某些内容,因此如果您没有选择任何形状,则您的Selection对象可能会引用Range对象。你可以使用

Typename(Selection)

确定选择的内容。如果确实选择了Range,并且该范围没有已定义的名称,则Name属性将返回错误。

在Excel中选择“图表形状”非常困难(不可能?)。选择图表时,请检查选择点 - 它们是黑色方块。现在按住控制键并选择另一个形状。图表上的选择点变为白色圆圈。当它自己选择时,Selection对象实际上是ChartArea对象。 Excel“猜测”当您选择图表时,您确实要选择图表的某个组件(默认情况下为ChartArea)。因为ChartArea没有ShapeRange属性,所以会出错。

至于第一个假定的错误,这里有一些代码可以证明这一点。请注意,在第三部分中,我检查了Typename,但是没有对它进行任何操作。这似乎让Excel了解实际选择的内容

Sub testshapes()

    Dim i As Long
    Dim sType As String

    Sheet1.Shapes.Range(Array("Rectangle 5", "Chart 6")).Select

    For i = 1 To Selection.Count
        Debug.Print Selection(i).Name
    Next i

    Sheet1.Shapes.Range(Array("Chart 6", "Rectangle 5")).Select

    For i = 1 To Selection.Count
        Debug.Print Selection(i).Name
    Next i

    Sheet1.Shapes.Range(Array("Chart 6", "Rectangle 5")).Select

    sType = TypeName(Selection(1)) 'avoids chart selected first bug
    For i = 1 To Selection.Count
        Debug.Print Selection(i).Name
    Next i

End Sub

在第一部分中,我得到了正确的答案。在第二部分中,我得到了两个debug.print语句的“图表6”。在第三部分,我得到了正确的答案。

我不确定这是否完全回答了你的问题,但我希望它能让你更接近。