gpt4 book ai didi

vba - 在 PowerPoint 中按占位符名称处理形状

转载 作者:行者123 更新时间:2023-12-04 13:00:31 31 4
gpt4 key购买 nike

我正在尝试根据分配给 CustomLayout.Shapes.Placeholder 的已知 Name 属性创建一个返回特定形状的函数。目的。我不能使用形状 .Name因为这是事先不知道的,即使在从模板/布局创建幻灯片时也是如此。

挑战似乎是自定义布局如何与实际幻灯片相关联。例如,当我迭代幻灯片的 .CustomLayout.Shapes.Placeholders ,我可以通过 .Name 轻松识别特定的占位符属性(property)。

然而如果我返回这个形状,它将是自定义布局占位符,它会影响 全部 此布局上的幻灯片(例如,如果我向此占位符添加文本,它会使用此布局更新所有幻灯片!)。显然这是不可取的!

相反,我对集合进行索引,并尝试从幻灯片的 .Shapes.Placeholders 返回该索引位置处的形状。 ,似乎它们没有维护相同的索引,即 .Shapes.Placeholders(i) <> .CustomLayout.Shapes.Placholders(i)
尝试的解决方法:

以为我可以操纵自定义布局来添加 Tag到形状。我试过了,但由于同样的原因失败了(即 CustomLayout.Shape 在某种程度上与 Slide.Shape 的形状不同......)。无论如何,如果存在这样的事情,我希望避免“解决方法”,而是采用更合适的方法来做到这一点。

这是我到目前为止的功能:

Function GetShapeByPlaceholderName(sName As String, sld As Slide) As Object
Dim plchldrs As Placeholders
Dim shp As Shape
Dim ret As Shape
Dim i As Long

For Each shp In sld.CustomLayout.Shapes.Placeholders
i = i + 1
If shp.Name = sName Then
'####
' This can easily identify the CustomLayout.Shapes.PLACEHOLDER
'
' But I need to return the SHAPE in the Slide.Shapes collection
'####

'###
Set ret = shp 'This will return the CustomLayout.Placeholder, which affects ALL slides

'###
'Set ret = sld.Shapes.Placeholders(i) 'the index of the Shapes.Placeholders is NOT the same

'###
'Set ret = sld.Shapes.Placeholders.FindByName(sName) 'This returns an error/specified shape name does not exist

'###
'Set ret = sld.Shapes.Placeholders.FindByName(i) 'This observes same failure that the index of the collections is not the same


Exit For
End If
Next

Set GetShapeByPlaceholderName = ret

End Function

最佳答案

我有一个潜在的解决方案给你。

问题在于幻灯片母版上的页脚、页码和日期占位符。它们包含在幻灯片母版上的占位符集合中,但是当创建单个幻灯片时,它们成为幻灯片的自己的属性(在 .HeaderFooter 属性下)。这会导致母版和幻灯片上的占位符数量不同,并且由于这些占位符可能位于集合的中间,因此索引不会对齐。

因此,一种可能的解决方案是从母版中删除这三个占位符,这是通过打开幻灯片母版并取消选中页脚复选框来完成的。如果你这样做,你会发现 Master 和 Slides 上的占位符的数量是一样的,并且所有的索引号都排成一行。您仍然无法使用 SlideMaster.CustomLayouts(n).Shapes.Placeholders(m).Name属性以访问实际幻灯片上的正确占位符。但是,一旦您知道占位符的索引(我的示例中最后一句中的“m”),您应该能够通过 SlideObj.Shapes.PlaceHolders(m) 访问幻灯片上正确的占位符。 .您可以先遍历 SlideMaster.Shapes.PlaceHolders 并存储索引以供以后使用。

如果您需要页脚字段,只需将新的文本占位符添加到幻灯片母版,将它们放在幻灯片底部,然后将页码、日期或固定文本插入其中。

概括:

  • 取消选中您关心的所有幻灯片母版上的页脚复选框。不确定这是否可以通过编程方式完成。
  • 遍历 ActivePresentation.SlideMaster.CustomLayout(n).Shapes.Placeholders对于每个幻灯片母版(自定义布局),查看 .Name 属性以找到您感兴趣的占位符。将其存储在一个数组中(将使用占位符的名称作为数组名称,所以如果占位符名称是“数据表”,我会在 CustomLayout/Master 上使用占位符的 datatable[n])=index #。执行一次并将其存储在全局变量中。
  • 如果要访问幻灯片上的占位符,请使用 SM_index=SlideObj.CustomFormat.Index 获取幻灯片的 SlideMaster 索引。然后使用 SlideObj.Shapes.Placeholders(datatable[SM_index])
  • 访问占位符“数据表”

    如果您的所有幻灯片只有一个 SlideMaster,那么您不需要数组,而是可以使用一个简单的变量。

    如果您需要实际代码,请告诉我——但我希望您不需要。让我知道这是否适用于您的实际项目。

    关于vba - 在 PowerPoint 中按占位符名称处理形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28949162/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com