如何确定占位符是否正在使用?

4

如何在PowerPoint中判断幻灯片版式占位符是否全部被使用?

如果未使用某个版式占位符,可以防止添加图片时自动使用该占位符吗?

2个回答

1
一种更优雅的解决方案,用于查找占位符是否包含项目,适用于所有类型:
if (selectedSlide.Shapes.Placeholders[i].PlaceholderFormat.ContainedType != Microsoft.Office.Core.MsoShapeType.msoAutoShape)

如果占位符中没有放置任何内容,则该占位符的 ContainedType 为 msoAutoShape。例如,在向占位符插入图像时,类型会更改为该项目的类型,即 msoPicture。

Office 会自动将项目添加到第一个可用的占位符(在主文件中首先添加),或者对于图像,会优先考虑 ppPlaceholderPicture。


1
这只回答了问题的一部分,当时我更关心如何强制办公室不将图片添加到占位符中。 - Dudi
有时它们即使有内容也仍然是自动形状。 :-/ - BrainSlugs83

1

您需要循环遍历幻灯片上的所有占位符,确定每个占位符的类型,然后检查它是否填充了预期的格式。有18个PpPlaceholderType,因此您需要设置它们所有,但以下是一个示例,可以用来检查占位符是否正在使用。

Sub CheckPlaceholders()
Dim ap As Presentation: Set ap = ActivePresentation
Dim sl As Slide: Set sl = ap.Slides(2)
Dim shs As Shapes: Set shs = sl.Shapes
Dim ph As Placeholders: Set ph = shs.Placeholders
Dim p As Shape
    For Each p In ph
        Select Case p.Type
        Case PpPlaceholderType.ppPlaceholderHeader
            If p.TextFrame.HasText Then
                Debug.Print "This Placeholder is in use"
            End If
        Case PpPlaceholderType.ppPlaceholderChart
            If p.HasChart Then
                Debug.Print "This Placeholder is in use"
            End If
        End Select
    Next
End Sub

要插入一张图片而不是以占位符的形式出现,我找到的唯一方法是创建一个循环来添加图片,直到其中一张图片不再是占位符,然后删除已经插入的图片。
Sub AddPicture()
    Dim pic As String
    pic = "C:\Users\Me\Desktop\beigeplum.jpg"
    Dim ap As Presentation: Set ap = ActivePresentation
    Dim sl As Slide: Set sl = ap.Slides(1)
    Dim sh As Shape

    Do
        Set sh = sl.Shapes.AddPicture(pic, msoFalse, msoTrue, 1, 1)
        sh.Tags.Add "MYPICTURE", 0
    Loop Until sh.Type <> 14

    Dim p As Shape
    For Each p In sl.Shapes
        If p.Type = 14 Then
            If p.Tags.count > 0 Then
                If p.Tags.Name(1) = "MYPICTURE" Then
                    p.Delete
                End If
            End If
        End If
    Next
End Sub

我知道这个解决方案,但我正在寻找更加优雅的解决方案。至于自动使用占位符,只需尝试通过activeSlide.Shapes.AddPicture(...)向幻灯片添加一个带有布局-ppLayoutObject的对象即可。 - Dudi
是的,自从PPT2007以来,占位符的一切都变得有点奇怪。你在另一篇帖子中提到的解决方案是一种方法,但你是对的,当旧的幻灯片布局重新应用时,它有缺点。我发现的唯一方法有点hacky。请参见上面的更新。 - Todd Main
在占位符的使用方面,这是最优雅的方式了 :( - Todd Main
我想要补充的是,在C#中你不能简单地在循环中使用Delete()删除shape。因此,首先将它们添加到一个List中,然后再进行Delete()操作。 - Sam007
如果占位符包含的内容不是文本或图表,我们该怎么办?我们需要检查每个.HasBlah属性吗?(有几个)。 - 我们还需要检查其他没有自己的.HasBlah属性的东西吗? - BrainSlugs83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接