Получить индекс формы в PowerPoint VBA - PullRequest
0 голосов
/ 10 ноября 2018

Я надеюсь, что это очень простой вопрос, но по какой-то причине я не могу понять его.

Мне нужно удалить подмножество выбранных фигур на слайде PowerPoint, используя VBA. Я могу сделать это используя:

ActivePresentation.Slides(1).Shapes.Range(_Index_).Delete

Где _Index_ это либо массив индексов формы (целые числа), либо имена фигур (строки).

Поскольку имена форм не уникальны (и люди, для которых я делаю этот макрос, имеют неприятную привычку иметь несколько фигур с одним и тем же именем), мне нужно полагаться на номер индекса формы. Моя проблема в том, что я не знаю, как получить порядковый номер данной фигуры.

Я могу видеть только, как получить имя или идентификатор формы, используя:

ActiveWindow.Selection.ShapeRange(IdNum).Name
ActiveWindow.Selection.ShapeRange(IdNum).ID

Итак, мой вопрос: как мне получить индекс выбранных фигур?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Когда вы группируете выделение фигур, группа становится новой формой, добавленной в конец предыдущей позиции z-порядка.Все отдельные фигуры в группе добавляются в z-порядок после самой фигуры группы.

Я не могу найти способ определить, какой отдельный элемент в группе выбран (суб-выбран, я думаю, мы должны сказать, так как исходная родительская группа остается выбранной, и это то, что PPT возвращает, когда вы запрашиваете ActiveWindow.Selection.ShapeRange (1).

Чтобы идентифицировать текущий выбранный элемент в группе, вы можете использовать его в качестве отправной точки:

Sub WorkWithSubSelectedShapes()
' Do stuff with sub-selected shapes within a group
' Courtesy of Andy Pope

    Dim oSh As Shape
    Dim oGSh As Shape
    Dim x As Long

    Set oSh = ActiveWindow.Selection.ShapeRange(1)

    ' Do something with each shape in the group:
    For Each oGSh In oSh.GroupItems
        Debug.Print oGSh.TextFrame.TextRange.Text
    Next

    ' Now do something with each SUB-SELECTED
    ' shape within the group
    With ActiveWindow.Selection.ChildShapeRange
        For x = 1 To .Count
            Debug.Print .Item(x).Name
            Debug.Print .Item(x).TextFrame.TextRange.Text
        Next
    End With

End Sub

Вот некоторый код, который обычно может помочь вобработка форм / групп. Принимает во внимание тот факт, что могут быть группы внутри групп (внутри групп (внутри групп)) ...

Sub ProcessShapes()

    Dim oSh As Shape

    For Each oSh In ActivePresentation.Slides(1).Shapes
        If oSh.Type = msoGroup Then
            Debug.Print "GROUP" & vbTab & oSh.Name & vbTab & oSh.ZOrderPosition

            Call DealWithGroup(oSh)
        Else
            Debug.Print oSh.Name & vbTab & oSh.ZOrderPosition
        End If
    Next

End Sub

Sub DealWithGroup(oSh As Shape)
    Dim x As Long
    For x = 1 To oSh.GroupItems.Count
        If oSh.GroupItems(x).Type = msoGroup Then
            Call DealWithGroup(oSh.GroupItems(x))
        Else
            Debug.Print "GROUP ITEM" & vbTab & oSh.GroupItems(x).Name & vbTab & oSh.GroupItems(x).ZOrderPosition
        End If
    Next
End Sub

И чтобы ответить на дальнейший (превосходный) вопрос Петра, это должноработа:

Sub TestIndexOf()
    MsgBox IndexOf(ActiveWindow.Selection.ShapeRange(1))
End Sub

Function IndexOf(oSh As Shape) As Long

    Dim x As Long

    With ActiveWindow.Selection.SlideRange.Shapes
        For x = 1 To .Count
            If .Item(x).Name = oSh.Name Then
                ' Found it, report it
                IndexOf = x
            End If
        Next
    End With
End Function
0 голосов
/ 11 ноября 2018

Попробуйте несколько строк кода, и вы получите имена всех фигур в непосредственном окне (Ctrl + G для просмотра немедленного окна)

Dim shp As Shape, I As Integer
For Each shp In ActivePresentation.Slides(1).Shapes
I = I + 1
Debug.Print "Index=" & I & " Name= " & shp.Name & " ID= " & shp.Id & " Type= " & shp.Type
Next
...