2010-01-14 2 views
2

В PowerPoint 2007 и использовании VBA, как я могу получить форму заполнителя на макете слайдера, который является «мастером» для формы заполнителя на слайде?Получить форму макета, соответствующую форме слайда

В настоящее время я использую петлю для сравнения положения и размера ползуна слайдера с положением и формой каждой формы заполнителя в макете слайда, но это не является безупречным. Например, если форма ползуна перемещается на слайде, ее положение больше не может соответствовать положению любых форм-заполнителей в макете слайда. Я мог бы повторно применить макет слайда, чтобы снова привязать местозаполнители, но это не то, что я хочу сделать.

Что-то в объектной модели, как Shape.Master, было бы идеальным, но, конечно, этого не существует.

ответ

0

Здесь вы идете Райан, я считаю, что это то, о чем вы просите.

Sub GetLayoutShapeDetails() 
Dim myPPT As Presentation 
Set myPPT = ActivePresentation 
Dim mySlide As Slide 
Set mySlide = myPPT.Slides(6) 
Dim slideShape As Shape 
Dim slideLayoutShape As Shape 
Set slideShape = mySlide.Shapes(1) 
If slideShape.Type = msoPlaceholder Then 
    Dim placeHolderType As Integer 
    placeHolderType = slideShape.PlaceholderFormat.Type 
    Set slideLayoutShape = mySlide.CustomLayout.Shapes.Placeholders(placeHolderType) 
    Dim modifiedPlaceHolder As String 
    modifiedPlaceHolder = "Shape Name: " & slideShape.Name & _ 
     ", Left: " & slideShape.Left & _ 
     ", Width: " & slideShape.Width 
    Dim originalPlaceHolder As String 
    originalPlaceHolder = "Shape Name: " & slideLayoutShape.Name & _ 
     ", Left: " & slideLayoutShape.Left & _ 
     ", Width: " & slideLayoutShape.Width 
    Debug.Print modifiedPlaceHolder 
    Debug.Print originalPlaceHolder 
End If 
End Sub 

EDIT: 16 января 2010 Основы дальнейших исследований, там не кажется, не способ в VBA, чтобы найти соответствующее точное соответствие формы в в макете слайда.

+0

Спасибо, Отаку, но это не так. PlaceholderFormat.Type не является индексом, так как вы его использовали здесь. Кроме того, кажется, что ваше решение подразумевает, что в макете имеется не более одного заполнителя каждого типа. – OfficeAddinDev

+0

Я не уверен, что вы подразумеваете под «PlaceholderFormat.Type не индекс» - это перечисление.Например, 1 является «ppPlaceholderTitle», а 2 - «ppPlaceholderBody». Вот как вы узнаете, что является родителем формы заполнителя - если вы не ищете это и не нуждаетесь в чем-то другом. Кроме того, на слайде может быть много заполнителей - я не предоставил «решение» как таковое, просто пример кода, чтобы вы могли доработать его по мере необходимости, проверить другие заполнители и т. Д. –

+0

Итак, предположим, на слайде есть 4 заполнителя с типом ppPlaceholderChart и заполнены диаграммами. Как я могу ссылаться на заполнитель в макете слайда, который соответствует второму графику на слайде, используя этот метод? mySlide.CustomLayout.Shapes.Placeholders (ppPlaceholderChart) возвращает ShapeRange из 4 заполнителей, но как я могу определить, какая из них соответствует второму графику? – OfficeAddinDev

1

Увидев, что до сих пор нет ответа на это здесь или в другом месте, я мог бы также опубликовать свой код.

Например, если форма заполнитель перемещается на слайде,

Вот что я придумал, чтобы справиться с этим:

  • магазин расположение всех форм
  • сброс макета слайдов
  • совпадающие слайды и основные слайды
  • восстановите расположение всех фигур.

Это функция, которая выполняет это и возвращает отображение mastershapename - shapename.

private Dictionary<string, string> GetShapeMasters(Powerpoint.Slide s) 
{ 
    Dictionary<string, string> shapeMasters = new Dictionary<string, string>(); 
    List<ShapeLocation> shapeLocations = new List<ShapeLocation>(); 

    //store locations 
    foreach (Powerpoint.Shape sh in s.Shapes) 
    { 
     shapeLocations.Add(new ShapeLocation() 
     { 
      Name = sh.Name, 
      Location = new System.Drawing.RectangleF(sh.Left, sh.Top, sh.Width, sh.Height) 
     }); 
    } 

    //have powerpoint reset the slide 
    //ISSUE: this changes the names of placeholders without content. 
    s.CustomLayout = s.CustomLayout; 

    //compare slide and master 
    foreach (Powerpoint.Shape sh in s.Shapes) 
    { 
     foreach (Powerpoint.Shape msh in s.CustomLayout.Shapes) 
     { 
      if (IsShapeMaster(sh, msh)) 
      { 
       shapeMasters[msh.Name] = sh.Name; 
      } 
     } 
    } 

    //restore locations 
    //TODO: might be replaced by undo 
    foreach (var shm in shapeLocations) 
    { 
     Powerpoint.Shape sh = null; 
     try 
     { 
      sh = s.Shapes[shm.Name]; 
     } 
     catch 
     { 
      //Fails for renamed placeholder shapes. 
      //Have yet to find a decent way to check if a shape name exists. 
     } 

     //placeholders do not need to be restored anyway. 
     if (sh != null) 
     { 
      sh.Left = shm.Location.Left; 
      sh.Top = shm.Location.Top; 
      sh.Width = shm.Location.Width; 
      sh.Height = shm.Location.Height; 
     } 
    } 

    return shapeMasters; 
} 

С этим вы можете сделать

Dictionary<string, string> shapeMasters = GetShapeMasters(theSlide); 
if(shapeMasters.ContainsKey("KnownPlaceholderName")) 
    Powerpoint.Shape KnownShape = theSlide[shapeMasters["KnownPlaceholderName"]]; 

А вот функция сравнения, которая принимает две формы и проверяет, если они «равны». Может быть расширен, чтобы сделать его более точным.

private bool IsShapeMaster(Powerpoint.Shape sh, Powerpoint.Shape msh) 
{ 
    return 
     sh.Left == msh.Left 
     && sh.Top == msh.Top 
     && sh.Width == msh.Width 
     && sh.Height == msh.Height 
     && sh.Type == msh.Type 
     && sh.PlaceholderFormat.Type == msh.PlaceholderFormat.Type; 
} 

Маленький класс, который сохраняет исходное местоположение форма

class ShapeLocation 
{ 
    public string Name; 
    public System.Drawing.RectangleF Location; 
} 

Это код из C# VSTO надстройки, но я полагаю, что это не то, что отличается от VB или других типов автоматизации PPT.