Получить форму макета, соответствующую форме слайда - PullRequest
2 голосов
/ 14 января 2010

В PowerPoint 2007 и с использованием VBA, как я могу получить форму заполнителя на макете Slide Master, который является "основным" для формы заполнителя на слайде?

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

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

Ответы [ 2 ]

1 голос
/ 18 января 2014

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

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

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

  • Хранить места всех форм
  • сбросить макет слайда
  • соответствует формам слайдов и мастер-форм слайдов
  • восстановить расположение всех фигур.

Это функция, которая делает это и возвращает masterhapename - отображение 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.

0 голосов
/ 14 января 2010

Вот, пожалуйста, Райан, я думаю, это то, что вы просите.

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

РЕДАКТИРОВАТЬ: 16 января 2010 Судя по дальнейшим исследованиям, в VBA нет способа найти точное точное соответствие фигуры в макете слайда.

...