在Powerpoint VBA中获取形状索引

时间:2018-11-10 19:57:04

标签: vba powerpoint powerpoint-vba

我希望这是一个非常简单的问题,但由于某种原因我无法弄清楚。

我需要使用VBA删除PowerPoint幻灯片上所选形状的子集。我可以使用:

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

其中_Index_是形状索引(整数)或形状名称(sting)的数组。

由于形状名称不是唯一的(并且我正在制作此宏的人习惯于具有多个具有相同名称的形状,因此我需要依赖形状索引号)。我的问题是我不知道如何获取给定形状的索引号。

我只能使用以下方法查看形状名称或形状ID:

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

所以我的问题是:如何获得所选形状的形状索引?

2 个答案:

答案 0 :(得分:0)

尝试几行代码,然后您将在即时窗口中获得所有形状的名称(使用Cttl + 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

答案 1 :(得分:0)

将一组形状组合在一起时,该组将成为一个新形状,附加在上一个z顺序位置的末尾。在组形状本身之后,组中的所有单个形状都将附加到z顺序。

我找不到确定选择组中哪个项目的方法(子选择,我想应该说是选择的,因为原始父组保持选中状态,这就是查询ActiveWindow.Selection时PPT返回的内容。 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

要回答Peter的其他(优秀)问题,这应该可行:

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