gpt4 book ai didi

vba - 获取与幻灯片形状对应的布局形状

转载 作者:行者123 更新时间:2023-12-04 06:59:47 25 4
gpt4 key购买 nike

在 PowerPoint 2007 和使用 VBA 中,如何获取幻灯片母版布局上的占位符形状,它是幻灯片上占位符形状的“母版”?

我目前正在使用循环将幻灯片占位符的位置和大小与幻灯片布局中每个占位符形状的位置和形状进行比较,但这并不是万无一失的。例如,如果占位符形状在幻灯片上移动,其位置可能不再匹配幻灯片布局中任何占位符形状的位置。我可以重新应用幻灯片的布局以将占位符重新定位到位,但这不是我想要做的。

对象模型中的某些内容,例如 Shape.Master将是理想的,但当然,这不存在。

最佳答案

看到这里或其他地方仍然没有答案,我不妨发布我的代码。

For example, if the placeholder shape is moved on the slide,



这是我想出的处理方法:
  • 存储所有形状的位置
  • 重置幻灯片布局
  • 匹配幻灯片形状和母版幻灯片形状
  • 恢复所有形状的位置。

  • 这是执行此操作并返回 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 自动化类型没有什么不同。

    关于vba - 获取与幻灯片形状对应的布局形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2061303/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com