Свойство Excel VBA TopLeftCell
Я хочу получить свойство.TopLeftCell каждого объекта Shape в Selection.ShapeRange, но я получил ошибку времени выполнения 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
Может ли кто-нибудь научить меня, какие проблемы в первом коде и почему работает второй код. Я действительно запутался с этой проблемой.
2 ответа
For Each
для ShapeRange Collection не предлагает доступ к ShapeRange(i)
, так target
в первом коде - экземпляр объекта ShapeRange (ссылка на тот же объект, на который ссылается ShapeRange(i), но не объект Shape.)
Согласно справочным статьям на MSDN, ShapeRange Object не имеет свойства.TopLeftCell.
С другой стороны, ShapeRange(i)
средства ShapeRange.Item(i)
который возвращает один объект Shape со свойством.TopLeftCell. Конечно, мы также можем получить доступ к Shape Object как члену Shapes Collection, Shapes(j)
,
Таким образом, мы можем рассматривать объект ShapeRange как своего рода интерфейсы для объекта Shapes, который предлагает свойства, немного отличающиеся от тех, которые имеет объект Shape (в этом случае ShapeRange не имеет свойства.TopLeftCell, но Shape имеет.)
В других случаях ShapeRange предлагает те же свойства, что и Shape Object.
Вот почему возникает путаница со следующим кодом, который возвращает один и тот же результат 3 раза, когда выбран один объект Shape. Но эти результаты появляются просто потому, что свойство.Name и функция TypeName возвращают один и тот же результат для объекта ShapeRange и объекта Shape.
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
Это потому, что в этих подпрограммах целью является ShapeRange. ShapeRange не имеет свойства TopLeftCell. У него есть свойство Name... вот почему работает вторая подпрограмма.
Вот способ получить отдельные Shapes из 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