我在一张纸上有一个图表和五个矩形,我使用的是 Excel 2003。
如果我先选择一个矩形,然后是图表,则 (1) 代码对我有效,没有错误。它返回我所期望的两个形状的名称。
如果我先选择图表,然后选择矩形,它将返回图表两次,就好像图表是两个选定的形状一样。我只能假设这是一个错误。但是一个奇怪的错误,因为如果我再次运行代码而不更改选择,它返回的结果就像我先选择了矩形一样。奇怪的。
如果选择的形状少于一个,则表示选择了一个范围。在 Excel 中始终会选择某些内容,因此如果您没有选择任何形状,则您的 Selection 对象很可能是指 Range 对象。您可以使用
Typename(Selection)
来确定选择什么。如果您确实选择了一个范围,并且该范围没有定义名称,则 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”。在第三部分,我得到了正确的答案。
我不确定这是否完全回答了你的问题,但我希望它能让你更接近。