Уникальный идентификатор для SlideMaster - PullRequest
0 голосов
/ 28 октября 2010

Хотя я понимаю, что SlideMaster имеет уникальное имя в данной презентации (хотя я понимаю, что это ошибка), есть ли способ уникальной идентификации мастера, к которому пользователь не может прикоснуться?Кроме того, есть ли эквивалент коллекции тегов слайда, где я могу спрятать свой собственный идентификатор?

Для PowerPoint 2003 и / или 2007 ... Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2010

Первоначально я думал, что нет хорошего способа защитить имя SlideMaster от пользователя, потому что оно, кажется, очень легко предоставляется через главное представление. В 2007 году к нему очень легко добраться, как указано выше: просмотреть вкладку ленты, кнопку «Мастер слайдов», щелкнуть правой кнопкой мыши любой мастер и переименовать. Примерно то же самое в 2003 году, меню «Вид»> «Мастер»> «Мастер слайдов», щелкните правой кнопкой мыши нужный мастер в списке миниатюр слева, переименуйте.

Радует тот факт, что это не переименовывает master , а скорее design . Объектная модель Ppt не очень проста, когда дело доходит до этих двух объектов; каждый мастер, по-видимому, является родителем дизайна, но для всех целей и задач они используются 1-к-1, и каждый экспонирует другого как свойство: SlideMaster.Design (только для «активного» слайд-мастера) или Design.SlideMaster (по крайней мере, что касается мастера slide - я не работаю с остальными тремя, поэтому не могу говорить с ними здесь). Когда пользователь выполняет последовательность шагов, описанных выше, эквивалентный vba равен myDesign.Name = "SomeNewName", а не mySlideMaster.Name = "SomeNewName". Имя мастера не затронуто; аналогично, если в VBA я выполняю mySlideMaster.Name = "SomeNewVBAName", соответствующее имя дизайна, которое мог выбрать пользователь, остается без изменений.

0 голосов
/ 30 октября 2010

В 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.
еще нет.
...