2010-12-13 27 views
2

使用考虑包含多种形状的工作表时,和一个片段(1):其中的形状被选择VBA Excel中:Selection集合环状的索引引用不正确范围与形状

'(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)实际上返回所选择的形状的名称,如同(3):

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

虽然(1)产生一个错误如果选择少于1个Shape,则(3)看起来工作正常 - 除非Chart是唯一的选择,并且返回自动化错误:“调用的对象与客户端断开连接。”

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

将不胜感激阐明这

回答

2

选择可以含有除形状之外的对象的任何光。并非选择中的所有对象都具有名称属性。这可能是为什么你选择多个形状时出现错误 - 因为你选择的不仅仅是形状。扫描所有选定形状的正确方法是#3,作为discussed here

“对象调用”错误听起来像一个Excel错误。我会简单地捕捉错误,处理错误,并寻找MS知识库,以获取有关如何解决错误和/或最小化错误发生的指导。

2

我有一个图表和在片材上5个矩形和我使用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”。在第三部分中,我得到了正确的答案。

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