Vba SlideMaster的唯一标识符

Vba SlideMaster的唯一标识符,vba,powerpoint,Vba,Powerpoint,虽然我意识到SlideMaster在给定的演示文稿中有一个唯一的名称,但我理解这是有缺陷的,但有没有一种方法可以唯一地识别用户不能触摸的主控器?或者,是否有一个与幻灯片的标签集合相当的,我可以将自己的ID存放在某个地方 对于PowerPoint 2003和/或2007。。。提前感谢。在PowerPoint 2007/2010中,您可以使用CustomXMLParts作为某种标记。下面是一个演示: Sub SetSlideMasterTag() Dim ap As Presentation

虽然我意识到SlideMaster在给定的演示文稿中有一个唯一的名称,但我理解这是有缺陷的,但有没有一种方法可以唯一地识别用户不能触摸的主控器?或者,是否有一个与幻灯片的标签集合相当的,我可以将自己的ID存放在某个地方


对于PowerPoint 2003和/或2007。。。提前感谢。

在PowerPoint 2007/2010中,您可以使用CustomXMLParts作为某种标记。下面是一个演示:

Sub SetSlideMasterTag()
    Dim ap As Presentation
    Set ap = ActivePresentation
    ''#------------------------
    Dim slideMasterCustomerData As CustomerData
    Set slideMasterCustomerData = ap.SlideMaster.CustomerData
    ''#------------------------
    Dim slideMasterCustomXMLPart As CustomXMLPart
    Set slideMasterCustomXMLPart = slideMasterCustomerData.Add
    slideMasterCustomXMLPart.LoadXML ("<Tag><Item>SlideMaster</Item></Tag>")
    ''#------------------------
    Dim slideMasterTag As String
    slideMasterTag = slideMasterCustomXMLPart.Id
    ''#------------------------
    Debug.Print slideMasterTag
    Debug.Print ap.CustomXMLParts.SelectByID(slideMasterTag).XML
    ''#------------------------
    ap.CustomDocumentProperties.Add Name:="SlideMasterTag", LinkToContent:=False, _
        Type:=msoPropertyTypeString, Value:=slideMasterTag
End Sub
Sub RetrieveSlideMasterTag()
    Dim ap As Presentation
    Set ap = ActivePresentation
    ''#------------------------
    Dim slideMasterTag As String
    slideMasterTag = ap.CustomDocumentProperties.Item("SlideMasterTag").Value
    Debug.Print slideMasterTag
    ''# Is this the right slide master?
    If Not ap.SlideMaster.CustomerData(slideMasterTag) Is Nothing Then
        Debug.Print "Found you, you little bugger!"
    End If
End Sub
有几件事需要记住:

你必须保持健康 会话之间的slideMasterTag。 也许最好的办法是 在CustomDocumentProperties中, 因此,RetrieveSlideMasterTag 常规这是极不可能的 最终用户会进入这里。 如果您不想这样做,请将此添加到 CustomDocumentProperties,你会 只需要查询所有 CustomXMLParts使用XPath为您的 XML。 上面的代码没有任何错误 或验证检查。你需要 要查看创建代码以确保 还没有名为的标记 slideMasterTag。
我最初认为没有好的方法来保护SlideMaster名称不受用户的影响,因为它似乎很容易通过主视图提供。在2007年,这非常容易实现,如上所述:功能区的“视图”选项卡、幻灯片母版按钮、右键单击任何母版并重命名。与2003年几乎相同,在“视图菜单>母版>幻灯片母版”中,右键单击左侧缩略图列表中的相关母版,然后重命名


令人高兴的是,这并不是重命名主控形状,而是重命名设计。当涉及到这两个对象时,Ppt对象模型不是很简单;每个母版显然都是设计的父版,但出于所有目的,它们都是1对1使用的,并且每个母版都将另一个作为属性公开:SlideMaster.design仅用于活动的幻灯片母版或design.SlideMaster至少就幻灯片母版而言,我不与其他三个母版合作,因此在这里无法与它们进行交流。当用户执行上述一系列步骤时,等效的vba是myDesign.Name=SomeNewName,而不是mySlideMaster.Name=SomeNewName。主人的名字不受影响;同样,如果在VBA中执行mySlideMaster.Name=SomeNewVBAName,则用户可能选择的相应设计名称将保持不变。

谢谢。不幸的是,我需要一个在2007年之前也能工作的解决方案,但是您在这里描述的OpenXML方向也是一个信息丰富的帖子,这对未来是一个好兆头。不过,我认为我实际上可以使用SlideMaster.Name属性,我稍后有时间会详细解释。啊,你说的是PowerPoint 2003和/或2007,所以我认为只使用2007就可以了。SlideMaster.Name完全可以由最终用户更改,但是如果你愿意冒99%以上的用户不知道如何更改的风险,那么使用它应该没问题。用户如何更改SlideMaster.Name?@downwitch:如果他们知道自己在做什么,那就很容易了。下面是2007年的一个例子。转到“视图”选项卡,然后单击幻灯片母版。确保将最上面的幻灯片选为大幻灯片。然后单击重命名。这三个步骤很简单。事实上,没有。我花了很长时间才发布了这篇文章,但我在下面提到了这一点。