Excel VBA TopLeftCell属性

我想获取Selection.ShapeRange中每个形状对象的.TopLeftCell属性,但是当我运行下面的代码时,运行时错误438说'这个对象不支持这个属性或方法'。

Sub testTopLeftCell() For Each target In Selection.ShapeRange MsgBox target.TopLeftCell.Address Next End Sub 

但是,下面的代码工作。

 Sub testTopLeftCell2() For Each target In Selection.ShapeRange MsgBox ActiveSheet.Shapes(target.Name).TopLeftCell.Address Next End Sub 

任何人都可以教我,第一个代码有什么问题,第二个代码是为什么工作的。 我真的很困惑这个问题。

这是因为在这些subs 目标是一个ShapeRange。 ShapeRange没有TopLeftCell属性。 它有一个名称属性………..这就是为什么第二个子作品。

这是一种从ShapeRange中获取单个形状的方法:

 Sub durall() Dim s As Shape, i As Long For i = 1 To Selection.ShapeRange.Count Set s = Selection.ShapeRange(i) MsgBox s.Name MsgBox s.TopLeftCell.Address Next i End Sub 

For Each ShapeRange集合中的For Each集合都不提供对ShapeRange(i)的访问,所以第一个代码中的target是ShapeRange对象的实例(重写ShapeRange(i)所返回的同一对象,但不是Shape对象。

根据MSDN上的参考文章, ShapeRange对象没有.TopLeftCell属性。

另一方面, ShapeRange(i)意味着ShapeRange.Item(i)返回单个Shape对象的.TopLeftCell属性。 当然,我们也可以通过Shapes(j)作为Shapes Collection的成员来访问Shape对象。

所以,我们可以把ShapeRange Object看作Shapes对象的一种接口,它提供的属性和那些Shape对象有些不同(在这种情况下,ShapeRange没有.TopLeftCell属性,但是Shape有)。

在其他情况下,ShapeRange提供与Shape Object相同的属性。

这就是为什么混淆想出下面的代码,当select单个形状对象时返回相同的结果3次。 但是,这些结果出现,只是因为.Name属性和TypeName函数返回ShapeRange对象和形状对象相同的结果。

 Sub testShapeRange() For Each target In Selection.ShapeRange MsgBox "target: " + target.Name + "," + TypeName(target) MsgBox "Selection.ShapeRange(1): " + _ Selection.ShapeRange(1).Name + ", " + _ TypeName(Selection.ShapeRange(1)) MsgBox "ActiveSheet.Shapes(target.Name): " + _ ActiveSheet.Shapes(target.Name).Name + "," + _ TypeName(ActiveSheet.Shapes(target.Name)) Next End Sub