Как бы вы получили доступ к объектам Shape В объекте SmartArt без ошибок несоответствия типов?

Вопрос: есть ли способ получить доступ к объектам Shape для каждого узла внутри объекта SmartArt? Кажется, что объекты SmartArtNode имеют свойство Shapes, которое можно использовать для этой цели, но я получаю ошибки несоответствия типов при попытке отправить фигуры из SmartArtNode.Shapes в другие подпрограммы.

Предпосылки: я пишу подпрограмму итератора, которая принимает 2 параметра: объект SmartArt и объект пользовательского класса, у которого есть метод для выполнения действий над объектами Shape. Предполагается, что подпрограмма перебирает объекты Shape для каждого узла в SmartArt и вызывает метод из объекта пользовательского класса в каждой Shape.

Вот код для подпрограммы итератора:

Public Sub IterateOverShapesInSmartArt(mySmartArt As SmartArt, manipulator As ShapeManipulator)
    Dim node As SmartArtNode
    Dim shpRange As ShapeRange
    For Each node In mySmartArt.AllNodes
        Set shpRange = node.Shapes
        If shpRange.count > 0 Then
            manipulator.ManipulateShape shpRange.Item(1)
        End If
    Next node
End Sub

Для справки: подпись ShapeManipulator метода пользовательского класса ( ShapeManipulator ) выглядит следующим образом:

Public Sub ManipulateShape(myShape As Shape)

Конкретная проблема: Когда я пытаюсь запустить этот код, я получаю ошибку времени выполнения «13»: несоответствие типов, вызванное строкой Set shpRange = node.Shapes . На самом деле, я изначально пытался отказаться от присваивания node.Shapes временной переменной и использовать manipulator.ManipulateShape node.Shapes(1) вызов метода manipulator.ManipulateShape node.Shapes(1) , но затем этот вызов метода вызвал ту же ошибку несоответствия типов. Я также попытался использовать цикл For с переменными счетчика вместо цикла For Each только для получения того же сообщения об ошибке. Что происходит? Когда я отлаживаю, в окне Locals отображаются правильные типы, которые соответствуют моим объявлениям, поэтому я в растерянности.

Всего 1 ответ


Я проверил ваш код и могу подтвердить, что Set shpRange = node.Shapes вызывает ошибку несоответствия типов.

Однако я заметил, что если вместо этого shpRange объявлен как универсальный объект (т.е. Dim shpRange as Object ), он будет преобразован в ShapeRange, и ошибки не будет.

В любом случае, вы можете избежать назначения следующим образом ...

Public Sub IterateOverShapesInSmartArt(mySmartArt As SmartArt, manipulator As ShapeManipulator)
    Dim node As SmartArtNode
    For Each node In mySmartArt.AllNodes
        With node
            If .Shapes.Count > 0 Then
                manipulator.ManipulateShape .Shapes.Item(1)
            End If
        End With
    Next node
End Sub

Есть идеи?

10000