Свойство 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
Другие вопросы по тегам