VBA Excel : Selection collection looped index references incorrect range when used with shapes

标签 vba excel selection shapes

考虑一个包含多个形状的工作表和一个片段 (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) 实际上返回所选形状的名称,与 (3) 一样:

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

如果选择的形状少于 1 个,则 (1) 会产生错误,而 (3) 似乎工作正常 - 除非图表是唯一选择,否则会返回自动化错误:“调用的对象与它的对象已断开连接”。客户。”

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

非常感谢对此的任何启发

最佳答案

我在一张工作表上有一个图表和五个矩形,并且我使用的是 Excel 2003。

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

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

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

Typename(Selection)

确定选择的内容。如果您确实选择了一个范围,并且该范围没有定义名称,则“名称”属性将返回错误。

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

对于第一个假定的错误,这里有一些代码可以证明这一点。请注意,在第三部分中,我检查了类型名称,但没有对其执行任何操作。这似乎让 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”。在第三部分,我得到了正确的答案。

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

关于VBA Excel : Selection collection looped index references incorrect range when used with shapes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4426333/

相关文章:

excel - VBA for Excel : Server Data Not Updating

excel - 基于单元格内容的VBA Excel自动过滤列

javascript - 双击div,p,span时如何获取选中的单词?

ios - 隐藏 UITextField 中的选择句柄

vba 在文件夹及其子文件夹内的所有文件中搜索字符串

vba - 分配给范围会忽略分配的数据类型 - 解决方法?

excel - VBA - 形状 - .name - 运行时错误 '7' : Out of Memory

excel - 查找文本并更改颜色

excel - 将日期格式更改为 yyyy-mm-dd

javascript - ChartJS 中取消选择点