2010-10-28 6 views
0

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

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

ответ

0

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

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

0

В 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.
+0

Благодарим за это. Я, к сожалению, нуждаюсь в решении, которое также работает до 2007 года, но в руководстве OpenXML вы описываете (также информативный пост здесь http://blogs.msdn.com/b/brian_jones/archive/2009/03/05/how-to-assemble -multiple-powerpoint-decks.aspx) служит хорошим предзнаменованием для будущего. Я думаю, однако, что я действительно могу использовать свойство SlideMaster.Name, как я объясню более подробно позже, когда у меня будет время. – downwitch

+0

Ах, вы сказали * PowerPoint 2003 и/или 2007 *, поэтому я предположил, что только 2007 год будет в порядке. 'SlideMaster.Имя «определенно изменено конечным пользователем, но если вы готовы рискнуть, что более 99% пользователей не знают, как это изменить, должно быть хорошо использовать его. –

+0

Как пользователь может сменить SlideMaster.Name? – downwitch

Смежные вопросы