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

VBA Excel:与形状一起使用时,选择集合循环索引引用的范围不正确,vba,excel,selection,shapes,Vba,Excel,Selection,Shapes,考虑一个包含多个形状的工作表和一个代码段(1): 无论选择了哪些形状(当然必须大于1),前两个形状似乎总是返回的。 考虑SabeRangeGe(2)的使用: 这(2)实际返回所选形状的名称,与(3)一样: 虽然(1)在选择的形状少于1个时会产生错误,(3)似乎工作正常-除非图表是唯一的选择,然后返回自动错误:“调用的对象与其客户端断开连接。” 我不明白为什么第一个不能返回正确的形状-我假设选择集合比看起来更复杂,我也不明白为什么选择一个图表时Selection.ShapeRange.Count失

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

无论选择了哪些形状(当然必须大于1),前两个形状似乎总是返回的。
考虑SabeRangeGe(2)的使用:

这(2)实际返回所选形状的名称,与(3)一样:

虽然(1)在选择的形状少于1个时会产生错误,(3)似乎工作正常-除非图表是唯一的选择,然后返回自动错误:“调用的对象与其客户端断开连接。”

我不明白为什么第一个不能返回正确的形状-我假设选择集合比看起来更复杂,我也不明白为什么选择一个图表时Selection.ShapeRange.Count失败,而选择一个形状时成功


非常感谢您能为这张照片提供任何光线

选择可以包含形状以外的对象。并非选择中的所有对象都具有name属性。这可能就是为什么选择多个形状时会出现错误的原因,因为您选择的不仅仅是形状。扫描所有选定形状的正确方法是#3 as


“调用对象”错误听起来像是Excel错误。我会简单地捕捉错误,处理它,并查看MS知识库,了解如何解决它和/或尽量减少它的发生。

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

如果我先选择一个矩形,然后选择图表,(1)代码对我来说没有错误。它返回我所选择的两个形状的名称,正如我所期望的那样

如果我先选择图表,然后选择矩形,它将返回两次图表,就像图表是两个选定形状一样。我只能假设这是一个bug。但这是一个奇怪的错误,因为如果我再次运行代码而不更改选择,它将返回与我首先选择矩形相同的结果。奇怪

如果选择的形状少于一个,则表示选择了一个范围。Excel中始终会选择某些对象,因此如果未选择任何形状,则选择对象很可能指向范围对象。你可以用

Typename(Selection)
以确定所选内容。如果您确实选择了一个范围,但该范围没有定义名称,则name属性将返回一个错误

在Excel中选择“图表形状”非常困难(不可能)。单独选择图表时,请查看选择点-它们是黑色正方形。现在按住控制键并选择另一个形状。图表上的选择点变为白色圆圈。当它被自己选中时,选择对象实际上是一个ChartArea对象。Excel“猜测”当您选择图表时,您确实希望选择图表的一个组件(默认情况下为图表区域)。由于ChartArea没有ShapeRange属性,因此会出现错误

至于第一个假定的bug,这里有一些代码证明了这一点。注意,在第三部分中,我检查了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”。在第三部分,我得到了正确的答案

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

'(3)
For i = 1 To Selection.ShapeRange.Count
    MsgBox Selection.ShapeRange(i).Name
Next
Typename(Selection)
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