以编程方式复制具有源格式的形状(PowerPoint 2007)

时间:2010-11-08 16:24:26

标签: vba powerpoint office-interop powerpoint-vba

我需要能够在PowerPoint 2007中以编程方式将形状(图表,表格等)从一张幻灯片复制到另一张幻灯片,保留原始颜色。源幻灯片和目标幻灯片位于具有不同主题的不同演示文稿中。

这些形状可能很复杂并且包含很多颜色,例如图表,表格等。目标幻灯片必须保持其主题,因此我不能简单地复制整个原始幻灯片colorScheme。

在PowerPoint中手动复制形状时,我会选择“保持源格式”。这将复制形状的所有原始颜色,将主题颜色转换为绝对RGB值。

以编程方式执行此操作的最简单方法是什么?

1 个答案:

答案 0 :(得分:0)

您需要转到幻灯片并使用Application.CommandBars.ExecuteMso

如果之后不需要返回之前选择的幻灯片,则可以跳过DoEvents,第二次调用Application.CommandBars.ExecuteMso

似乎新形状的位置在粘贴后有时会有点倾斜,所以我获得了对第二张幻灯片的Shapes集合中最后一个形状的引用,并复制了原始形状的位置。

至少在我的机器上,没有DoEvents,当我执行它时宏不会做任何事情(但如果我介入它就会起作用)。

Sub CopySelectedShapeToNextSlide()
    Dim oShape As Shape
    Dim oSlide As Slide
    Dim nextSlide As Slide
    Dim newShape As Shape

    Set oShape = Application.ActiveWindow.Selection.ShapeRange(1)
    Set oSlide = Application.ActiveWindow.Selection.SlideRange(1)
    Set nextSlide = oSlide.Parent.Slides(oSlide.SlideIndex + 1)

    oShape.Copy

    Application.ActiveWindow.View.GotoSlide nextSlide.SlideIndex

    Application.CommandBars.ExecuteMso "PasteSourceFormatting"
    Set newShape = nextSlide.Shapes(nextSlide.Shapes.Count)
    newShape.Left = oShape.Left
    newShape.Top = oShape.Top

    DoEvents

    Application.ActiveWindow.View.GotoSlide oSlide.SlideIndex

    Debug.Print newShape.Name

End Sub