70
10 章用 PPT 对象编程 编程任务: 运用 PowerPoint 对象模型中的对象编程,解决 PowerPoint 自动化过程中对象处理的问 题,提高工作效率等。 PPT 对象体系架构 Application 开始 使用演示文稿对象 使用幻灯片编程 处理图形 使用主题 使用 SmartArt 图表 美化图形 处理图片 使用新式图表 处理新媒体 基础动画编程

第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

  • Upload
    others

  • View
    29

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

第 10 章用 PPT 对象编程

编程任务:

运用 PowerPoint 对象模型中的对象编程,解决 PowerPoint 自动化过程中对象处理的问

题,提高工作效率等。

PPT 对象体系架构 从 Application 开始

使用演示文稿对象 使用幻灯片编程

处理图形 使用主题

使用 SmartArt 图表 美化图形

处理图片 使用新式图表

处理新媒体 基础动画编程

Page 2: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

10.1PPT 对象体系架构

PPT 对象体系架构如图 10-1 所示。

图 10-1

图 10-1 展示了 PowerPoint 主要对象之间的关系,对于要使用 PowerPoint 应用程序进行

自动化控制的开发人员,通过向应用程序中的各个对象发送指令来与应用程序交互。这些对

象数量众多,被组织在一个叫做“对象模型”的层次结构中。

这个结构中总有几个可直接使用的对象处于核心地位,这些对象叫做顶级对象。

顶级对象

Application 是 PowerPoint 最核心的顶级对象,如:

AutoShape

Chart

Media

Picture

Table

Text

SmartArt

FIll

Glow

Reflection

Shadow

3D

Application

Presentations

Presentation

Slides

Slide

Shapes

Shape

ActivePresentation

ActiveWindow

Presentation

Selection

View

ShapeRange

SlideRange

Slide

TimeLine

InteractiveSequences

MainSequence

Effect

AnimationBehavior

Timing

Color

Filter

Motion

Property

Rotation

Scale

Page 3: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Debug.Print Application.Version

为了方便编程,PowerPoint 中还有几个顶级对象:Presentations,ActivePresentation,Windows,ActiveWindow,AddIns,CommandBars,SlideShowWindows,这些对象既可直接

使用,也可通过 Application 的属性返回其引用。

Debug.Print ActivePresentation.Name

Debug.Print Application.ActivePresentation.Name

对象属性和对象

PowerPoint 中大多数对象总是通过对象属性链接在一起,对象属性是返回对某个对象的

引用。“返回对象的引用”的意思是“允许访问对象”,如图 10-2 所示。

图 10-2

① 通过访问对象的属性可返回某个对象的引用,例如:

Dim Sld1 As Slide

Set Sld1=Application.ActiveWindow.View.Slide '通过 Slide 属性返回 Slide 对象

Debug.Print Sld1.Name

②还可以更改对象的某些特征和行为,例如:

Dim Sld1 As Slide

Set Sld1=Application.ActiveWindow.View.Slide '通过 Slide 属性返回 Slide 对象

Sld1.Name="幻灯片 1" '通过 Name 属性改变对象的名称

集合对象与对象

许多对象有单复数之分,例如 Presentation 和 Presentations;Slide 和 Slides 等。对象

的复数形式称做集合。

① 通过索引号或名称可识别集合中单个对象,例如:

Debug.Print ActivePresentation.Slides("Slide 1").Name

Debug.Print ActivePresentation.Slides(1).Name

② 还可以用 For 语句遍历集合中的对象,例如,可以通过遍历演示文稿中的所有幻灯

Application

ActivePresentation

ActiveWindow

ColorSchemes

Slides

SlideMaster

SlideShowWindow

Page 4: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

片,输出每张幻灯片的名称。

Dim Sld As Slide ,Slds As Slides

'通过 Slides 返回 Slides 集合对象

Set Slds = ActivePresentation.Slides

'用 For 语句遍历集合中的所有幻灯片

For Each Sld In Slds

Debug.Print Sld.Name

Next

利用集合可以向下定位对象,而利用对象的 Parent 属性可以向上定位对象。

父对象和子对象

大部分的对象都有一个 Parent 属性,用来在这个对象模型中指向此对象的父对象,也

会有一些其他的属性以指向其子对象,如图 10-3 所示。

图 10-3

例如:

Dim Pres As Presentation

Dim Shp As Shape, Sld As Slide,

Dim line As LineFormat

Set Shp = ActiveWindow.Selection.ShapeRange(1)

' 返回父对象

Set Sld = Shp.Parent

Debug.Print Sld.Name

' 返回子对象

Set line = Shp.line

line.ForeColor.RGB = vbRed

①访问对象的成员

创建对象后,可通过访问其公开的成员来处理该对象。

对象的成员包括对象的属性、方法和事件。利用 VBE 环境下的对象浏览器可以快速查

看到一个对象的构成,如图 10-4 所示。

Slide Presentation

Parent

Shapes

CustomLayout

子对象

Page 5: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

图 10-4

②属性

对象的属性定义了对象的特征,如大小、颜色或某一方面的行为,例如对象是否被激活

或可见的。可以通过修改对象的属性值来改变对象的特性,例如:

'改变活动窗口的宽度为 800

ActiveWindow.Width=800

ActiveWindow.WindowState = ppWindowNormal

有些属性不能设置,叫只读属性,它只是返回某些信息或与此对象相关的对象,例如:

'返回活动窗口的标题

ActiveWindow.Caption

Dim oSel As Selection

'返回活动窗口中所选择的对象

Set oSel=ActiveWindow.Selection

③方法

对象的方法指的是对象能执行的动作,有些方法无参数,例如:

'保存当前演示文稿

ActivePresentation.Save

'激活 PowerPoint 应用程序

Application. Activate

而有些需要参数,如:

'括号内是方法的参数

ActivePresentation.SaveAs (“c:\Test.pptx”)

'删除演示文稿中的文档信息,如个人信息、批注和文档属性。

ActivePresentation.RemoveDocumentInformation (ppRDIComments + ppRDIInkAnnotations)

工程或类型

属性

方法

事件

Page 6: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

对象的事件介绍详见 10.2 节从 Application 对象开始(P125)。

在了解了对象模型的基本布局和一些关键的对象后,就可开始使用 VBA 来扩展和处理

PowerPoint 应用程序。

10.2 从 Application 对象开始

Application 是 PowerPoint 应用程序顶层对象,代表整个 PowerPoint 应用程序,通过它

可以访问 PowerPoint 对象模型中所有对象,编程任务从此开始,如图 10-5 所示。

图 10-5

Application 用于返回顶层对象的属性,它可以在没有对象限定符的情况下直接使用,例

如,可以编写 Application.ActiveWindow.Height=200 来代替 ActiveWindow.Height = 200。

这些属性极大地简化了对象的访问,有助于提高编程效率。

获取 PPT 程序路径

在编程任务中可能需要获取 PowerPoint 应用程序的路径。使用 Application 的 path 属性

可以完成这项任务。例如:

Dim sPath As String

sPath=Application.Path

获取 PPT 的版本

任务要求:代码兼容不同版本的 PPT,通过获取 PPT 版本,可以写出不同的响应代码。

示例:

If Application.Version>=12 then

... '处理代码

Else

... '处理代码

Application

应用程序范围内的

设置和选项

用于返回顶层对象的

属性

Version

Visible

Run

Quit

ActivePresentation

ActiveWindow

Presentations

SlideShowWindows

主要任务

Page 7: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

End If

运行 VBA 过程

任务要求:运行其他演示文稿或加载项中的宏。

示例:

Application.Run Myppt.pptm!Module1.Test,

上面的代码运行了 Myppt.pptm 演示文稿 Module1 模块中一个叫做 Test 的过程。

Pars

退出 PowerPoint

任务要求:执行完所有操作,退出 PowerPoint 程序。

示例:

Application.Quit

使用此方法,主要是在其他应用程序中创建了一个 PowerPoint Application 对象,并启

动 PowerPoint(如果尚未运行),在执行完所有操作后,使用该方法退出。

例如,在 Excel 应用程序中,可以像下面这样访问 PowerPoint Application 对象:

Dim pptApp As New PowerPoint.Application, i As Integer, CusLayout As CustomLayout

pptApp.Visible=True

Set CusLayout=ActivePresentation.SlideMaster.CustomLayouts(7)

For i=1 to 4

pptApp.ActivePresentation.Slides.AddSlide i, CusLayout

Next

pptApp.Quit

上例中在 Excel 中启动 PowerPoint,然后用指定版式插入四张幻灯片,最后用 Quit 方法

退出。

返回子对象的引用

Application 的多数属性都是为了返回其子系中的对象,前面已经讲了,除了 Application之外,PowerPoint 对象模型中的其他对象都是从属对象,无法用 New 来声明,要返回对其

他对象的引用,必须通过 Appliciation 的属性。下面的示例演示了这个过程。

' 返回子对象引用

演示文稿 模块名

过程名 参数

Page 8: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Sub ReturnSubObject()

Dim Pres As Presentation, aWin As DocumentWindow, langSet As LanguageSettings

With Application

Set Pres = .ActivePresentation' 返回当前演示文稿

Set aWin = .ActiveWindow' 返回当前活动文档窗口

Set langSet = .LanguageSettings ' 返回当前语言设置

End With

End Sub

有了这此属性就可以访问整个 PowerPoint 应用程序的对象模型。

用 Application 事件编程

事件是对象可以识别的动作,在响应事件时,程序执行指定的 VBA 代码。PowerPoint的 Application 对象有一个预定义的事件集。如果其中有一个事件发生,而且在关联的事件

过程中存在代码,则 VBA 调用该代码。

尽管 VBA 中的对象能自动识别预定义的事件集,但要判定它们是否响应具体事件以及

如何响应具体事件则是编程的责任了。代码部分(即事件过程)与每个事件对应,想让对象

响应事件时,就把代码写入这个事件的事件过程之中。

注意:事件只能在类模块中使用。

若要为 Application 对象的事件创建事件处理程序,需要完成以下几个步骤。

1.在类模块中声明一个对象变量以响应事件

①新建立一个名为 ClsApp 的类模块,然后用 WithEvents 语句像下面这样声明对象变

量:

Public WithEvents App As Application

②编写特定的事件过程。

在声明具有事件的新对象之后,该对象会出现在类模块的“对象”列表中,然后就可以

为该新对象编写事件过程。从“过程”列表中选择一个事件,就会在类模块中添加一个空过

程,如图 10-6 所示。

Page 9: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

图 10-6

这时就可在此过程中输入代码了。

Private Sub App_WindowSelectionChange(ByVal Sel As Selection)

Debug.Print Sel.Type

End Sub

WindowSelectionChange 事件表明,当用户在文档窗口中内进行选择的改变时,将触发

该事件。

2.在另一标准模块中初始化声明的对象

在运行过程之前,必须将 ClsApp 类模块中声明的对象变量 App 与 Application 对象连

接起来,如下面的示例所示。

Dim oCls As New ClsApp '为 ClsApp 创建一个新实例 oCls

Sub InitializeApp()

Set oCls.App = Application '把实例中的 App 与 Application 连接

End Sub

在 VBA 编程任务中,常用的一些 Application 事件有以下几个。

' 在新建一个演示文稿后触发

Private Sub pptEventApp_AfterNewPresentation(ByVal Pres As Presentation)

End Sub

' 打开演示文稿时触发

Private Sub pptEventApp_PresentationOpen(ByVal Pres As Presentation)

End Sub

' 在打开一个演示文稿后触发

Private Sub pptEventApp_AfterPresentationOpen(ByVal Pres As Presentation)

End Sub

'关闭演示文稿之前触。只适用 PowerPoint 2010。

Private Sub pptEventApp_PresentationBeforeClose(ByVal Pres As Presentation, Cancel As Boolean)

End Sub

'保存演示文稿前发生此事件。

Private Sub pptEventApp_PresentationBeforeSave(ByVal Pres As Presentation, Cancel As Boolean)

End Sub

事件

Page 10: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

'代表关闭最后一个 Presentation 对象,只适用 PowerPoint 2010。

Private Sub pptEventApp_PresentationCloseFinal(ByVal Pres As Presentation)

End Sub

'保存任意打开的演示文稿前发生此事件。

Private Sub pptEventApp_PresentationSave(ByVal Pres As Presentation)

End Sub

' 新建立幻灯片时触发,同时将该幻灯片添加到 Slides 集合中。

Private Sub pptEventApp_PresentationNewSlide(ByVal Sld As Slide)

End Sub

'当启动幻灯片放映时发生此事件。

Private Sub pptEventApp_SlideShowBegin(ByVal Wn As SlideShowWindow)

End Sub

'在幻灯片放映结束后发生。

Private Sub pptEventApp_SlideShowEnd(ByVal Pres As Presentation)

End Sub

' 在鼠标双击前触发。

Private Sub pptEventApp_WindowBeforeDoubleClick(ByVal Sel As Selection, Cancel As Boolean)

End Sub

' 在鼠标右击前触发。

Private Sub pptEventApp_WindowBeforeRightClick(ByVal Sel As Selection, Cancel As Boolean)

End Sub

事件在 PowerPoint 插件开发方法中是非常关键的技术,在插件开发部分将会有更详细

的事件应用。

用未公开事件自动执行代码

Application 公开了大多数的事件,但还有些没有公开的事件,这些事件往往在编程任务

中有着特殊的作用。

下面这些事件与上面不同的是不用显式绑定事件源,它们是可自动执行的宏。因此可以

在模块中直接使用。

① 在鼠标单击动画或确定动画时长时(但在动画对象出现之后)发生此事件。

Sub OnSlideShowNextBuild(ByVal Wn As SlideShowWindow)

② 在换片之后激活事件。

Sub OnSlideShowPageChange(ByVal Wn As SlideShowWindow)

③ 在结束放映后激活事件。

Sub OnSlideShowTerminate(ByVal Wn As SlideShowWindow)

④在播放动画后,单击上一张幻灯片后激活此事件。

Page 11: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Sub OnSlideShowPreviousBuild(ByVal Wn As SlideShowWindow)

OnSlideShowPageChange 和 OnSlideShowTerminate 这两个事件宏很有用处。可以把一些

数据的初始代码放入 OnSlideShowPageChange 事件中,把数据清除代码放入到

OnSlideShowTerminate。

例如第 11 章中的代码就很好地利用了这两个事件,如图 10-7 所示。

图 10-7

10.3 使用演示文稿对象

图 10-8 展示了快速获取 Presentation 对象的途径。

图 10-8

增加一个演示文稿

在编程任务中,有时需要一个临时存放对象或数据的地方,增加一个演示文稿是一个不

错的选择。下面的代码演示了如何增加一个新的演示文档。

Dim Pres As Presentation

'这样用在可视窗口中创建演示文稿

Set Pres=Presentations.Add ()

'这样用新演示文稿不可见

Set Pres=Presentations.Add(False)

Application.Presentations

ActivePresentation

Presentations

ActiveWindow.Presentation

Presentation

Page 12: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

保存演示文稿

保存演示文稿是指保存未保存过的演示文稿,或以其他文件名保存已保存过的演示文稿。

要确定演示文稿是否已经保存,可判断 FullName 或 Path 属性的值是否非空。如果未

保存就保存为新文件,例如:

If Pres.FullName = "" Then

iRet = MsgBox("未保存过,是否保存?", vbYesNo)

If iRet = vbYes Then

Pres.SaveAs "c:\testppt.pptx"

End If

End If

在不修改原文件的情况下将指定演示文稿的副本保存至另一个文件中,例如:

Pres. SaveCopyAs "c:\TestCopy.pptx"

确定演示文稿自上次保存以来是否进行过更改,如果是就保存它,例如:

With ActivePresentation

If Not .Saved And .Path <> "" Then .Save

End With

有条件地打开一个演示文稿

Presentations 对象的方法 Open 或者 Open2007 可有条件地打开一个演示文稿。

①只读或读/写方式打开,例如:

Presentations.Open FileName:="C:\My Documents\pres1.ppt", ReadOnly:=msoTrue

②指定文件是否有标题,例如:

Presentations.Open FileName:="C:\My Documents\pres1.ppt", Untitled:=msoTrue

③是否隐藏打开的演示文稿,例如:

Presentations.Open FileName:="C:\My Documents\pres1.ppt", WithWindow:=msoTrue

④是否在打开文件之前修复文件以避免损坏,例如:

Presentations.Open2007 FileName:="C:\My Documents\pres1.ppt", OpenAndRepair:=msoTrue

指定演示文稿中可用的其他颜色

指定演示文稿中可用的其他颜色的步骤如图 10-9 所示。

Page 13: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

图 10-9

①向最近使用的颜色中添加颜色,例如:

ActivePresentation.ExtraColors.Add RGB(69, 32, 155)

②清除演示文稿中使用的颜色中的颜色,例如:

ActivePresentation.ExtraColors.Clear

示例:

' 向最近使用的颜色中添加颜色

Sub AddColorToCustomColor()

Dim i As Integer

With ActivePresentation.ExtraColors

' 先清除

.Clear

For i = 1 To 10

.Add RGB(i * 20, i * 5, i)

Next

End With

End Sub

应用指定模板

PowerPoint 模板是另存为 .potx 格式的一张幻灯片或一组幻灯片的图案或蓝图。模板可

以包含版式、主题颜色、主题字体、主题效果和背景样式,甚至还可以包含内容。

Presentation 对象的 ApplayTemplate 方法把指定的模板应用于整个演示文稿,以使其有

一个统一的外观,例如:

ActivePresentation.ApplyTemplate"c:\sample.potx"

实例演练:转换成图片式演示文稿

编程思路:

最近使用颜色图示

ExtraColors

ActivePresentation

代表演示文稿中的其他颜色。该

对象最多可以包含八种颜色,每

Page 14: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

把指定演示文稿中的所有幻灯片转换成图片式幻灯片,然后保存。

'转换成全图式演示文稿

Sub ConvertoPicturePresenation(ByVal sPresFile As String, ByVal tPresFile As String)

Dim openPres As Presentation

Dim savePres As Presentation

Dim myTemp As String

myTemp = VBA.Environ$("temp")

myTemp = myTemp & "\myslidetemp"

VBA.MkDir myTemp

' 打开要转换的演示文稿

Set openPres = Presentations.Open2007(sPresFile, False, True, False)

' 用 png 格式导出所有幻灯片到指定目录中

openPres.Export myTemp, "png"

' 增加一个演示文稿

Set savePres = Presentations.Add(False)

With savePres

.SlideHeight = openPres.PageSetup.SlideHeight

.SlideWidth = openPres.PageSetup.SlideWidth

.SlideOrientation = openPres.PageSetup.SlideOrientation

End With

' 关闭

openPres.Close

Dim myPic As String

' 检索刚才导出的图片

myPic = Dir(myTemp & "\*.png")

Dim i As Integer

Do While myPic <> ""

myPic = myTemp & "\" & myPic

i = i + 1

' 增加幻灯并插入图片

With savePres.Slides.AddSlide(i, savePres.SlideMaster.CustomLayouts(7))

.Shapes.AddPicture myPic, False, True, 0, 0

End With

Kill myPic ' 删除已插入了图片,避免留下垃圾

' 下一个图片

myPic = Dir

Loop

VBA.RmDir myTemp

savePres.SaveAs tPresFile

savePres.Close

End Sub

Page 15: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

10.4 使用幻灯片编程

一个演示文稿总是由许多的幻灯片组成的,如图 10-10 所示。

图 10-10

如何快速获取演示文稿中的幻灯片对象呢?图 10-11 展示了几种途径。

图 10-11

增加幻灯片

Slides 对象的 AddSlide 方法指定向演示文稿中增加的索引和版式并返回新的幻灯片。

幻灯片所用的版式由幻灯片母版中的 CustomLayouts 集合对象控制,如何知道要使用哪

个版式呢?下面的代码列举出了所有当前可用的版式索引和名称。

Sub ListCustomLayouts()

Dim cusLayout As CustomLayout '定义一个版式对象

dim cusLayouts As CustomLayouts

Set cusLayouts=ActivePresentation.SlideMaster.CustomLayouts

For Each cusLayout IncusLayouts

Debug.Print cusLayout.Index & "-"; cusLayout.Name

Next

End Sub

有了上面版式,就可以向演示文稿中增加某种版式的幻灯片了。

Presentation

Slides

Slides

Slides

Slide

ActivePresentation.Slides

ActiveWindow.View.Slide

Presentations(i).Slides

ActiveWindow.Selection.SlideRange

Slide

Page 16: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

①增加新幻灯片

下面的代码增加了 3 张空白版式的幻灯片。

Sub AddSlide()

Dim cusLayout As CustomLayout

' 获取空白版式

Set cusLayout = ActivePresentation.SlideMaster.CustomLayouts(7)

Dim i As Integer

'增加 3 个幻灯片

For i = 1 To 3

With ActivePresentation.Slides.AddSlide(i, cusLayout)

.Name = "新增" & i

End With

Next

End Sub

② 从文件中插入幻灯片

从文件中插入幻灯片,可以合并多个演示文稿,达到幻灯片重用的目标。这在平常的工

作中十分有效。

' sfile:从这个文件获取幻灯片

' indexpos:插在当前演示文稿中幻灯片列表的位置

' frominde:从文件的哪个幻灯片开始选取幻灯片,-1 表示第一个

' endinde:选到哪里结束,-1 表示最后一个

Sub AddSlideFromFile(sfile, indexpos, Optional fromindex = -1, Optional endindex = -1)

Dim slds As Slides

Set slds = ActivePresentation.Slides

slds.InsertFromFile sfile, Index, frominndex, endindex

End Sub

例如:

AddSlideFromFile "c:\ppt\sales.ppt", 2, 3, 6

在活动演示文稿的第二张灯片后插入文件 C:\Ppt\Sales.ppt 的第 3 张到第 6 张幻灯片。

幻灯片操作

①删除指定幻灯片

如果要删除某张幻灯片,使用 Slides 集合对象的 Delete 方法,例如:

ActivePresentation.Slides(1).Delete‘删除幻灯片 1

②复制和粘贴幻灯片

Page 17: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

在幻灯片编程任务中,有时需要不停地复制和粘贴幻灯片,以满足某些编程目的,如把

当前某张幻灯片存储为另一个演示文稿,再将其用 openxml 的方式打开,修改其中某些在编

辑状态下无法实现的东西,再用 open2007 打开,把修改后的幻灯片收回当前演示文稿中,

删除原来幻灯片。虽然有点复杂,但这是目前 VBA 中突破 PowerPoint 限制最有效的方法。

ActiveWindow.View.Slide.Copy '复制当前幻灯片

ActivePresentation.Slides. Paste '将幻灯片粘贴到演示文稿的 Slides 集合中

ActiveWindow.View.Slide. Duplicate ‘创建 Slide 对象的副本,并添加到 Slides 集合中

③同时操作一组幻灯片

一张张操作幻灯片太麻烦了,如何同时操作一批幻灯片呢?使用 Slides 集合对象的

Range 方法可以返回一组指定的幻灯片。

如下面的代码所示返回所有奇数索引幻灯片,然后改变它们的版式为“文字和对象”。

Sub ProcessSlideRange()

Dim i As Integer, slds As Slides, sIndex As Integer

Set slds = ActivePresentation.Slides

' 用于保存幻灯片索引的数组

Dim arrSlide()

For i = 1 To ActivePresentation.Slides.Count Step 2

sIndex = sIndex + 1

ReDim Preserve arrSlide(1 To sIndex)

arrSlide(sIndex) = i

Next

' 把这组幻灯片的版式更改为“文字和对象”,其常数值为 13

slds.Range(arrSlide).Layout = ppLayoutObjectAndText

End Sub

实例演练:建立幻灯片预览图

在工作中,有时需要建立一份演示文稿中所有幻灯片的预览图,手工操作需要非常复杂

的程序,并且费时费力,借助 VBA 可在较短的时间内(视幻灯片数量而定),按指定的方

式为所有幻灯片创建一个预览图。

①以图片形式导出所有幻灯片

Dim pres As Presentation

Set pres = Presentations.Open2007(pptFile, False, True, False)

' 获取幻灯灯的实际大小

Dim W As Single, H As Single

W = pres.PageSetup.SlideWidth

H = pres.PageSetup.SlideHeight

' 在系统 temp 文件夹中建立 MySlides 子文件夹

Dim myTemp As String

Page 18: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

myTemp = VBA.Environ$("temp")

myTemp = myTemp & "\MySlides"

VBA.MkDir myTemp

' 以 png 格式导出所有幻灯片

pres.Export myTemp, "png", W, H

' 获取幻灯片总数

Dim sldCount As Integer

sldCount = pres.Slides.count

pres.Close ' 关闭前面打开的文件

②计算图片排列的行列

' 计算行数

Dim n As Integer

If sldCount Mod m = 0 Then

n = sldCount / m ' 无余数

Else

n = sldCount / m + 1 '有余数,要加一行

End If

③为绘制预览图准备 GDI+绘图布

' 开始 GDI+

Dim lToken As Long

lToken = gdiPlusStart

Dim lBmp As Long

' 以计算的行列大小建立内存图片

lBmp = CreateImageFromWH(m * W + 20 * m, n * H + 10 * n)

' 以上面的图片建立绘图布,背景为全白

Dim lGr As Long

lGr = CreateGraphicsFromImage(lBmp)

GdipGraphicsClear lGr,&HFFFFFFFF

④在绘图布上绘制所有幻灯片图片

Dim lImg As Long

Dim myPic As String

' 检索刚才导出的图片

myPic = Dir(myTemp & "\*.png")

Dim i As Integer, j As Integer

Do While myPic <> "" '还有,继续

myPic = myTemp & "\" & myPic

' 加载此图片并在绘图布上绘制

GdipLoadImageFromFile StrPtr(myPic), lImg

GdipDrawImage lGr, lImg, i * (W + 10), j * (H + 5)

i = i + 1

Page 19: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

If i = m Then ' 完成一行,另起一行画

i = 0

j = j + 1

End If

' 不再需要此图片,删除

GdipDisposeImage lImg

Kill myPic

myPic = Dir ' 下一个图片

Loop

' 删除目录

VBA.RmDir myTemp

⑤保存预览图并释放资源

' 保存图片

SaveImageToFile lBmp, SaveFile, "jpg"

' 释放 GDI+资源

GdipDisposeImage lImg

GdipDisposeImage lBmp

GdipDeleteGraphics lGr

gdiPlusEnd lToken

⑥测试解决方案

Dim ptFile As String, sFile As String

' 把下面两个文件名换成自己的

ptFile = ActivePresentation.path & "\Grdx 指南.pptx"

sFile = ActivePresentation.path & "\Grdx 指南.jpg"

MakeAllSlidePicture 3, ptFile, sFile

效果图如图 10-12 所示。

图 10-12

Page 20: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

10.5 使用主题

主题是颜色、字体和效果三者的组合。

主题可以作为一套独立的选择方案应用于文件中。使用主题可以简化具有专业设计师水

准的演示文稿的创建过程。不仅可以在 PowerPoint 中使用主题颜色、字体和效果,还可以

在 Excel,Word 和 Outlook 中使用它们,这样的演示文稿、文档、工作表和电子邮件就可

以具有统一的风格。

PowerPoint 提供了多种设计主题,使用预先设计的主题,可以轻松快捷地更改演示文

稿的整体外观。在默认情况下,PowerPoint 会将普通 Office 主题应用于新的空演示文稿。

但是,也可以通过应用不同的主题来轻松地更改演示文稿的外观。

应用主题

①把主题应用到整个演示文稿

使用 Presentation 对象的 ApplyTheme 方法可以把主题应用到整个演示文稿。下面的代

码把波形主题应用到当前活动演示文稿。

Sub ApplyThemeToPresentation()

'获致应用程序路径

Dim path As String

path = Application.path

' 获取主题文件位置

path = VBA.Left$(path, InStrRev(path, "\"))

Dim pres As Presentation

Set pres = ActivePresentation

' 把波形主题应用到当前活动文稿

pres.ApplyTheme path & "Waveform.thmx"

End Sub

②应用主题到单张幻灯片

下面的代码使用 Slide 对象的 ApplyTheme 方法把都市主题应用到幻灯片 1 中。

'获取幻灯片

Dim sld As Slide

Set sld = ActivePresentation.Slides(1)

'应用都市主题到幻灯片 1

sld.ApplyTheme path & "Urban.thmx"

③应用主题到多张幻灯片。

下面的代码使用SlideRange对象的ApplyTheme方法把活力主题应用到指定数量的幻灯

Page 21: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

上。

'获取幻灯片

Dim slds As SlideRange

Set slds = ActivePresentation.Slides.Range(Array(2, 4, 6))

' 应用活力主题到 2,4,6 幻灯片

slds.ApplyTheme path & "Verve.thmx"

主题颜色

主题颜色是指主题中使用的颜色集合。主题颜色包含 12 种颜色槽。前 4 种颜色用于文

本和背景中。用浅色创建的文本在深色的背景中清晰可见,而用深色创建的文本在浅色的背

景中清晰可见。接下来的 6 种主题颜色强调文字颜色,它们总是在 4 种潜在背景色中可见,

如图 10-13 所示。

图 10-13

除了内置的主题颜色之外,还可以自定义主题颜色并把其保存为主题颜色文件。

①应用主题颜色到演示文稿

图 10-14 展示了引用主题颜色对象的过程。

图 10-14

使用主题颜色对象的 Load 方法可以加载指定的主题颜色文件并应用到当前活动演示文

稿中。

Dim thColor As ThemeColorScheme

Set thColor = ActivePresentation.SlideMaster.Theme.ThemeColorScheme

' 应用华丽主题颜色

thColor.Load path & "Opulent.xml"

Page 22: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

②应用主题颜色到幻灯片

使用 Slide 或者 SlideRange 对象的 ApplyThemeColorScheme 方法,可以应用指定的主题

颜色到一张或多张幻灯片。

Dim sld As Slide

Set sld = ActivePresentation.Slides(1)

' 应用聚合主题颜色到第 1 张幻灯片

sld.ApplyThemeColorScheme path & "Concourse.xml"

Dim slds As SlideRange

Set slds = ActivePresentation.Slides(Array(4, 5, 6))

' 应用沉稳主题颜色到第 4 张,第 5 张,第 6 张幻灯片

slds.ApplyThemeColorScheme path & "Foundry.xml"

背景样式

背景样式是 PowerPoint 中独有的样式,它们使用新的主题颜色模式。

在每个主题中包含 3 个背景填充定义:细微、中等和强烈。通过将这 4 种背景色和 3 种主题背景进行组合,可以获得 12 种背景样式。背景样式不仅可用于填充幻灯片的背景,而

且也可以用来填充图形。如图 10-15 所示为 12 种主题背景样式。

图 10-15

下面的代码为指定幻灯片和图形设置背景样式。

Sub SetBackgroudStyle()

Dim sld As Slide

Set sld = ActivePresentation.Slides(2)

' 为第 5 个样式

sld.BackgroundStyle = msoBackgroundStylePreset5

Dim shp As Shape

Set shp = sld.Shapes.AddShape(msoShapeDiamond, 10, 60, 100, 100)

' 为第 12 个样式

shp.BackgroundStyle = msoBackgroundStylePreset12

End Sub

Page 23: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

10.6 处理图形

一张幻灯片主要由形状、文本框、图片、表格、图表和媒体对象等组成,如图 10-16 所

示:

图 10-16

如何快速获取幻灯片中的图形呢?图 10-17 展示了快捷获取幻灯片中的图形的几种途

径。

图 10-17

增加一个图形

幻灯片中的图形由一个叫做 Shapes 的集合管理。如果要向 Shapes 集合中增加一个图形,

需要根据图形的不同类型而调用集合中的不同成员方法。

①用 AddTextBox 增加文本框

表达式:AddTextbox(Orientation. Left.Top.Width. Height)

下面示例中的代码插入 6 个文字方向不同的文本框。Orientation 控制文本的方向。

Sub 插入文本框()

Dim shps As Shapes

Set shps = ActivePresentation.Slides(1).Shapes

Dim i As Integer

For i = 1 To 6

'msoTextOrientationDownward 3 向下。

'msoTextOrientationHorizontal 1 水平。

'msoTextOrientationHorizontalRotatedFarEast 6 亚洲语言支持所需的水平和旋转。

'msoTextOrientationMixed -2 不支持。

Slide

Shapes

ActivePresentation.Slides(i).Shapes(i)

ActiveWindow.View.Slide.Shapes(i)

Presentations(i).Slides(i).Shapes(i)

ActiveWindow.Selection.ShapeRange(i)

Shape

Page 24: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

'msoTextOrientationUpward 2 向上。

'msoTextOrientationVertical 5 垂直。

'msoTextOrientationVerticalFarEast 4 亚洲语言支持所需的垂直。

With shps.AddTextbox(i, 40, i * 40, 100, 20)

.TextFrame2.TextRange.Text = "我是一个文本框" & i

End With

Next

End Sub

②用 AddTextEffect 方法创建艺术字

表达式:AddTextEffect (PresetTextEffect .Text.FontName.FontSize.FontBold.FontItalic.Left. Top)

下面的示例展示了各种不同效果的艺术样式。

Dim sld As Slide

Set sld = ActivePresentation.Slides.AddSlide(1, ActivePresentation.SlideMaster.CustomLayouts(7))

Dim i As Integer, txtLeft As Single, txtTop As Single

With sld.Shapes

For i = 0 To 29

With .AddTextEffect(i, "艺术字" & i, "宋体", 16, msoTrue, msoFalse, txtLeft, txtTop)

If (.Top + .Height) > ActivePresentation.PageSetup.SlideHeight Then

txtTop = -.Height - 5

txtLeft = txtLeft + .Width + 5

End If

txtTop = txtTop + .Height + 5

End With

Next

End With

③用 AddShape 创建自选形状

表达式:AddShape (Type. Left.Top.Width. Height)

下面的示例演示了插入 50 种不同自选图形,其类型由 Type 决定。

Dim sld As Slide, shpLeft As Single, shpTop As Single

' 增加空白幻灯片

Set sld = ActivePresentation.Slides.AddSlide(1, ActivePresentation.SlideMaster.CustomLayouts(7))

Dim i As Integer

With sld.Shapes

For i = 1 To 50

With .AddShape(i, shpLeft, shpTop, 100, 40)

'若到了底部,重新开始排列

If .Top + .Height > ActivePresentation.PageSetup.SlideHeight Then

shpTop = -.Height - 10

Page 25: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

shpLeft = shpLeft + .Width + 10

End If

shpTop = shpTop + 50

End With

Next

End With

建立炫丽图形

通过 Shapes 集合的 AddCurve、AddPolyline、BuildFreeform 方法可以在 PowerPoint 中创建非常复杂且漂亮的图形。

1.使用 BuildFreeform 建立图形

表达式:Function BuildFreeform(EditingType As MsoEditingType, X1 As Single, F1 As Single)As FreeformBuilder

①用 BuildFreeForm 建立一个任意多边形并返回表示此形状的 FreeformBuilder 对象。

Dim sld As Slide

Set sld = ActivePresentation.Slides(2)

Dim ffBuilder As FreeformBuilder

Set ffBuilder = sld.Shapes.BuildFreeform(msoEditingAuto, 161, 162)

②再用 FreeformBuilder 对象的 AddNodes 方法向此多边形中添加线段节点。

.AddNodes msoSegmentCurve, msoEditingAuto, 161, 132, 197, 81, 216, 81

.AddNodes msoSegmentCurve, msoEditingAuto, 234, 82, 252, 163, 270, 163.5

.AddNodes msoSegmentCurve, msoEditingAuto, 287, 163, 304, 809, 322, 80

.AddNodes msoSegmentCurve, msoEditingAuto, 340, 79, 378, 131, 378, 161

.AddNodes msoSegmentCurve, msoEditingAuto, 379, 190, 343, 256, 325, 257

.AddNodes msoSegmentCurve, msoEditingAuto, 307, 257, 288, 165, 270, 165

.AddNodes msoSegmentCurve, msoEditingAuto, 252, 165, 234, 258, 216, 257

.AddNodes msoSegmentCurve, msoEditingAuto, 198, 256, 161, 191, 161, 162

③最后用 ConvertToShape 转换成 Shape

‘转换成形状

.ConvertToShape

2.使用 AddCurve 或 AddPolyline 方法创建自由图形

表达式:Function AddCurve (SafeArrayOfPoints) As Shape

其参数是一个数组,每个元素指定了线段的顶点和控制点的坐标对。

①建立节点数组并初始化此数组

Page 26: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

' 声明节点数组

' 数组大小取决于度,360 为:360*2+1,180 为:180*2+1,依此类推

Dim NodePts(1 To 721, 1 To 2) As Single

②为数组指定图形节点

For i = 1 To 721

' 设置节点值

NodePts(i, 1) = x1 * Sin(pi * i / 360) + x1 * Sin(xn * j * pi * i / 360) + 200

NodePts(i, 2) = y1 * Cos(pi * i / 360) - y1 * Cos(yn * j * pi * i / 360) + 130

Next

③以此数组创建自由图形

With ActiveWindow.View.Slide.Shapes

' 增加曲线

.AddCurve NodePts

'.AddPolyline NodePts

End With

④测试结果

Sub TestFreeShape()

Dim i As Integer, j As Integer

For i = 2 To 6

For j = 2 To 6

MakeFreeShape 100, 100, i, j, 1

Next

Next

End Sub

图形组

可以把多个图形组合成一个整体,这样的图形叫组。

使用 ShapeRange 对象的 Group 方法可把指定数量的图形组合成一个图形组。下面的代

码展示了组合图形的操作。

' 组合图形

Sub GroupShapes()

Dim sld As Slide, sldLay As CustomLayout

Set sldLay = ActivePresentation.SlideMaster.CustomLayouts(7)

'增加一张空白幻灯片

Set sld = ActivePresentation.Slides.AddSlide(3, sldLay)

'增加两个图形,分别命名为 grpOne,grpTwo

sld.Shapes.AddShape(msoShapeRectangle, 260, 54, 75, 48).Name = "grpOne"

Page 27: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

sld.Shapes.AddShape(msoShapeOval, 282, 77, 48, 58).Name = "grpTwo"

Dim shpRange As ShapeRange

' 获取上面两个图形集

Set shpRange = sld.Shapes.Range(Array("grpOne", "grpTwo"))

With shpRange

' 组合并把组命名为 Group1

.Group.Name = "Group1"

.ShapeStyle = msoShapeStylePreset35

End With

End Sub

组合后的图形成为一个 Shape 对象,可对其进行各种编辑、修改和美化操作,这极大地

提高了图形的设计效率。

'操作组图形

Sub EditGroupShapes()

Dim shp As Shape

'返回组图形

Set shp = ActivePresentation.Slides(3).Shapes("Group1")

With shp

' 设置填充

With .Fill

.Visible = True

.PresetGradient msoGradientHorizontal, 1, msoGradientFire

End With

'设置 3D

With .ThreeD

.BevelTopType = msoBevelCircle

.BevelTopInset = 6

.BevelTopDepth = 6

.Depth = 9

.SetPresetCamera (msoCameraIsometricOffAxis2Top)

.RotationX = -53

.RotationY = -58

.RotationZ = 57

End With

' 设置映像

.Reflection.Type = msoReflectionType1

End With

End Sub

图形组合后,也可以解组。通过 Shape 对象的 UnGroup 方法可解组指定的图形组。

' 解组图形组

Page 28: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Sub UnGroupShapes()

Dim shp As Shape

'返回组图形

Set shp = ActivePresentation.Slides(3).Shapes("Group1")

shp.Ungroup

End Sub

图形组可能会组中还有组,在一个不特定的图形组中,如果包含太深的组结构,会非常

复杂,这就给检索图形组中的单个对象带来麻烦,用嵌套循环的方式可以使代码变量冗长而

复杂,下面的代码构成了一个递归过程,让这个问题变得简单。

' 递归过程

Sub SeekGroupShapes(shp As Shape)

If shp.Type <> msoGroup Then Exit Sub

Dim sh As Shape

On Error GoTo hErr

For Each sh In shp

If sh.Type = msoGroup Then

'是组中组,递归

SeekAllShapes sh.GroupItems

Else

'显示对象名,此处进行单个对象的操作

Debug.Print sh.Name

End If

Next

Exit Sub

hErr:

If Err <> 0 Then

' 显示错误描述

MsgBox Err.Description

End If

Exit Sub

'从产生错误的语句恢复运行

Resume

End Sub

实例演练:建立多彩的分段圆环

在 PowerPoint 中用手工建立圆形分布图形,相比用 VBA 代码建立既费时又不准确。

下面的例子可以见证以上这个结论。

' 建立多彩的多段圆环

Sub makeSegments()

Dim osld As Slide

Page 29: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Dim oshp() As Shape

Dim i As Integer

Dim icount As Integer

Dim sngAngle As Single

On Error Resume Next

' 获取当前活动幻灯片

Set osld = ActiveWindow.View.Slide

If osld Is Nothing Then Exit Sub

If ActiveWindow.Selection.ShapeRange.Count > 0 Then ActiveWindow.Selection.Unselect

icount = InputBox("多少段")

sngAngle = 360 / icount

ReDim oshp(1 To 1)

For i = 1 To icount

' 增加空心弧

Set oshp(i) = osld.Shapes.AddShape(msoShapeBlockArc, 200, 200, 200, 200)

oshp(i).Line.Visible = msoFalse

If i / 2 = i \ 2 Then

oshp(i).Fill.ForeColor.RGB = vbRed

Else

oshp(i).Fill.ForeColor.RGB = vbGreen

End If

' 设置调整控点的值

oshp(i).Adjustments(3) = 0.05

oshp(i).Adjustments(1) = 180 + ((i - 1) * sngAngle)

oshp(i).Adjustments(2) = oshp(i).Adjustments(1) + sngAngle

If oshp(i).Adjustments(1) > 360 Then

oshp(i).Adjustments(1) = oshp(i).Adjustments(1) - 360

End If

If oshp(i).Adjustments(2) > 360 Then

oshp(i).Adjustments(2) = oshp(i).Adjustments(2) - 360

End If

oshp(i).Select (msoFalse)

ReDim Preserve oshp(1 To UBound(oshp) + 1)

If i = icount And icount / 2 <> icount \ 2 Then

oshp(i).Fill.ForeColor.RGB = vbYellow

End If

Next

End Sub

Page 30: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

10.7 美化图形

微软使用 DirectX 技术在 PowerPoint 2010 中重建了图形渲染引擎,新的图形引擎可以

快速地为图形增加诸如渐变、阴影、3D 等效果,极大地增强了图形的可视化表现能力。

图 10-18 展示了新的图片渲染效果。

图 10-18

快速更改图形样式

为了更快速地制作出有专业外观的图形,PowerPoint 内置了 42 种图形样式,这 42 种样

式会根据主题的不同而生成不同的效果,如图 10-19 所示。

图 10-19

使用 Shape 对象的 ShapeStyle 属性可指定一个图形样式。如下面的代码先在幻灯片中增

加一个图形,然后应用一个图形样式。

Sub AddQuickShapeStyle()

With ActivePresentation.Slides(1).Shapes.AddShape(msoShapeRectangle, 50, 50, 200, 200)

.ShapeStyle = msoShapeStylePreset42

End With

End Sub

单色、渐变、纹理、图案、图片或半透明填充

图形周围的发光效果

图形中的反射效果

图形的三维效果

图形中的柔化边缘效果

形状的阴影效果

Fill

Glow

Reflection

Shadow

SoftEdge

ThreeD

Page 31: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

虽然有这么多的快速图形样式,但远远不能满足实际工作的需要,更多时候需要自己来

进行设计。

用颜色亮化图形

颜色是图形的一个重要属性,颜色让图形变得更加鲜明而突出,从而影响到人的心理,

它是传达信息的重要手段之一。

在 PowerPoint 中,可以向图形填充一种颜色或者多种颜色。颜色可以是主题颜色或者

自定义颜色。

下面的代码向幻灯片增加一个图形并用主题颜色填充。

With sld.Shapes.AddShape(msoShape4pointStar, 10, 10, 100, 100).Fill

.Visible = True

.ForeColor.ObjectThemeColor = msoThemeColorAccent4' 用强调颜色 4 填充

End With

下面的代码向幻灯片中增加一个图形并用自定义颜色填充。

With sld.Shapes.AddShape(msoShapeRectangle, 270.75, 80.25, 57, 32.25).Fill

.Visible = msoTrue

.ForeColor.RGB = RGB(255, 0, 0)' 填充红色

.Transparency = 0

.Solid

End With

由上面的例子可知,PowerPoint 是通过 FillFormat 的对象向图形增加颜色的。

图形的多种颜色表现为各种形式的渐变,渐变在图形的表面产生了颜色的明暗变化,增

强了图形呈现的细节,给人一种视觉上的享受。

颜色在渐变区域中表现为一个个的点,这些点叫做光圈,渐变中的两种相邻颜色的混合

在这个点上结束。图 10-20 展示了渐变的四个光圈。

图 10-20

光圈在 PowerPoint 对象模型中为 GradientStop,其在对象层次中的关系图 10-21 所示。

图 10-21

Page 32: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

在使用 GradientStop 对象之前,必须首先用 FillFormat 的 OneColorGradient,PresetGradient 或者 TwoColorGradient 为图形添加一个渐变,然后再向渐变的光圈集合中增

加光圈。

下面的代码演示了为图形填充随机渐变。

①获取随机颜色和位置

Private Sub getColor(c() As Long, p() As Single)

VBA.Randomize (Timer)

Dim i As Integer, clr(1 To 8) As Long, pos(1 To 8) As Single

Dim r As Byte, g As Byte, b As Byte

For i = 1 To 8' 随机获取 rgb 颜色分量

r = VBA.Rnd * 255

g = VBA.Rnd * 255

b = VBA.Rnd * 255

clr(i) = RGB(r, g, b)

pos(i) = VBA.Rnd

Next

c = clr: p = pos

End Sub

②把上面的颜色添加到渐变中

Dim c() As Long, p() As Single

getColor c, p

Dim lcount As Integer, i As Integer

lcount = UBound(c)

With sld.Shapes.AddShape(msoShapeRectangle, 236.25, 64.5, 60, 81.75).Fill

.OneColorGradient msoGradientHorizontal, 1, 1' 先设置一个渐变

' 向渐变中增加渐变光圈

For i = 1 To lcount

.GradientStops.Insert2 c(i), p(i)

Next

' 删除原来默认产生的两个光圈,它们的索引总是 1 和 2

.GradientStops.Delete 2

.GradientStops.Delete 1

End With

用线条强化图形

图形线条的颜色、样式或粗细的正确设置,能有效地突出图形的整体形象。通过 Shape的属性 Line 可引用 LineFormat 对象,以设置线条的外观。

With sld.Shapes.AddShape(msoShapeRectangle, 261.75, 88.5, 67.5, 40.5)

.ShapeStyle = msoShapeStylePreset19

Page 33: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

With .Line

' 线条可见

.Visible = msoTrue

' 线条颜色

.ForeColor.RGB = RGB(192, 0, 0)

' 线条透明度

.Transparency = 0.2

' 线条大小

.Weight = 2.5

' 虚线线型

.DashStyle = msoLineDashDot

End With

End With

注意:在 PowerPoint 2010 中,线条也支持渐变填充。

用阴影增加图形的深度

阴影效果增加了图形的深度,可以让图形从背景中脱颖而出。在 PowerPoint 2010 中对

阴影的渲染进行了重大改进,包括支持外部和内部两种格式的阴影。

图 10-22 展示了阴影对象和内置的阴影类型。

图 10-22

除了内置阴影类型,还可通过 ShadowFormat 对象的属性和方法自定义阴影。

下面的代码演示了为指定图形设置一个内置阴影效果。

Dim sld As Slide

Set sld = ActivePresentation.Slides(1)

With sld.Shapes.AddShape(msoShapeHeart, 10, 100, 100, 100).Shadow

' 添加一个内部居中阴影

.Type = msoShadow34

Page 34: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

End With

下面的代码演示了为指定图形设置一个自定义阴影。

' 设置图形自定义阴影

Sub SetShapeCusShadow()

Dim sld As Slide

Set sld = ActivePresentation.Slides(1)

With sld.Shapes.AddShape(msoShapeHeart, 10, 100, 100, 100).Shadow

' 添加一个内部居中阴影

' 显示阴影

.Visible = msoTrue

' 外阴影样式

.Style = msoShadowStyleOuterShadow

' 阴影虚化

.Blur = 2

' 阴影偏移

.OffsetX = 6

.OffsetY = 8

.RotateWithShape = msoFalse

' 阴影颜色

.ForeColor.RGB = RGB(0, 0, 0)

' 阴影透明度

.Transparency = 0.5686300099

' 阴影大小

.Size = 100

End With

End Sub

柔化图形的边缘

对图形进行边缘的柔化处理,可以使图形的边缘产生一种雾化效果,从而突出的图形的

中心部位。

通过 Shape 的 SoftEdge 属性可以引用 SoftEdgeFormat 对象,下面的代码设置插入一张

图片并为它设置边缘柔化效果。

sfile = ActivePresentation.Path & "\softedge.jpg"

Set sld = ActivePresentation.Slides(1)

With sld.Shapes.AddPicture(sfile, False, True, 20, 20).SoftEdge

' 化边缘效果的大小,数字越大,边缘越柔和

.Radius = 30

End With

Page 35: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

给图形增加映像

映像效果也叫做反射,在图形的下方生成其倒影。在 PowerPoint 中映像效果由

ReflectionFormat 对象控制,如图 10-23 所示。

图 10-23

其中 Type 可指定一个如图 10-24 所示内置的映像。

图 10-24

如下面的代码所示,用代码为图形增加一个映像。

' 为图形设置一内置映像

Sub SetShapeRef()

Dim sld As Slide

Set sld = ActivePresentation.Slides(1)

With sld.Shapes.AddShape(msoShapeHeart, 10, 100, 100, 100)

.Fill.ForeColor.RGB = vbRed

.Line.Visible = False

With .Reflection

' 半映像,接触

.Type = msoReflectionType2

End With

End With

End Sub

除了内置的映像之外,还可以自定义图形的映像。

' 自定义映像

Sub SetCustomRef()

Dim sld As Slide

Set sld = ActivePresentation.Slides(1)

With sld.Shapes.AddShape(msoShapeHeart, 10, 100, 50, 50)

.Fill.ForeColor.RGB = vbRed

Page 36: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

.Line.Visible = False

With .Reflection

' 自定义映像

.Transparency = 0.55 ' 透明度

.Size = 65 '大小

.Offset = 4 '距离

.Blur = 4 '虚化

End With

End With

End Sub

让图形发光

发光效果是指围绕对象周边创建颜色光晕,从而把图形从背景中推出来而形成焦点。

通过 Shape 的 Glow 属性可引用 GlowFormat 对象。下面的代码插入一张图片并在图片

周围设置光晕。

sfile = ActivePresentation.Path & "\softedge.jpg"

Set sld = ActivePresentation.Slides(1)

With sld.Shapes.AddPicture(sfile, False, True, 20, 20, 100, 100).Glow

' 光环发光的颜色

.Color.RGB = vbRed

'发光的透明度

.Transparency = 0.2

' 光环发光的大小

.Radius = 27

End With

图形的 3D 效果

从 PowerPoint 2007 版本开始,PowerPoint 用 DX 重新设置了图形的渲染引擎,新引擎

大大增强了图形的 3D 效果。图 10-25 展示了图形的 3D 效果对象属性和方法。

Page 37: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

图 10-25

图形的 3D 效果主要包括了以下几种。

棱台:棱台使图形的边缘看起来有凸凹之感。BevelBottomType 和 BevelTopType 用于指

定棱台的类型,BevelBottomInset,BevelBottomDepth,BevelTopInset,BevelTopDepth 指定

棱台的宽度和高度。

3D 深度:Depth 指形状的延伸深度,范围为−600~9600(在正值产生的延伸里,正面

为原始形状;在负值产生的延伸里,背面为原始形状)。

表面效果:表面效果包括了表面材料和光照。PresetMaterial 指定材料类型,PresetLighting指定光照类型,LightAngle 指定了光线的角度。

三维旋转:三维旋转指定了图形延伸区在三维场景中绕 X,Y,Z 轴的旋转角度和透视

角度。

①增加棱台效果

' 设置图形棱台效果

Sub SetShapeBevel()

Dim shp As Shape

Dim sld As Slide

Set sld = ActivePresentation.Slides(1)

' 增加一个图形

Set shp = sld.Shapes.AddShape(msoShapeRoundedRectangle, 241.5, 37.5, 67.5, 49.5)

shp.Name = "3DTest"

' 设置填充

With shp.Fill

.Visible = msoTrue

.ForeColor.ObjectThemeColor = msoThemeColorAccent6

.ForeColor.TintAndShade = 0

.ForeColor.Brightness = -0.5

.Transparency = 0

.Solid

Page 38: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

End With

'线条无

shp.Line.Visible = msoFalse

' 设置三维格式

With shp.ThreeD

'顶部棱台为圆

.BevelTopType = msoBevelCircle

.BevelTopInset = 8.5 ' 宽度为 8.5

.BevelTopDepth = 6 ' 高度为 6

.BevelBottomType = msoBevelAngle ' 底部棱台为角度

.BevelBottomInset = 10 ' 宽度为 10

.BevelBottomDepth = 8 ' 高度为 8

End With

End Sub

②设置表面效果

' 设置表面效果

Sub SetMaterialAndLight()

Dim shp As Shape

Set shp = ActivePresentation.Slides(1).Shapes("3DTest")

With shp.ThreeD

'表面材料为硬边缘

.PresetMaterial = msoMaterialDarkEdge

' 照明为平衡

.PresetLighting = msoLightRigBalanced

' 光线角度为 120

.LightAngle = 90

End With

End Sub

③三维旋转

' 设置三维旋转

Sub Set3DRotation()

Dim shp As Shape

Set shp = ActivePresentation.Slides(1).Shapes("3DTest")

With shp.ThreeD

' 适度宽松透视

.SetPresetCamera (msoCameraPerspectiveRelaxedModerately)

.RotationX = 240

.RotationY = 170

.RotationZ = 180

'透视角度

.FieldOfView = 60

Page 39: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

End With

End Sub

10.8 使用 SmartArt 图表

SmartArt 图形是信息和观点的视觉表示形式。可以通过从多种不同布局中进行选择来

创建 SmartArt 图形,从而快速、轻松、有效地传达信息。

图 10-26 演示了在 PowerPoint 对象模型中,有关 SmartArt 对象的层次和关系。

图 10-26

试一试:列举 SmartArt 的颜色、版式、快速样式列表中的内容。

Sub ListSmartArtInfo()

Dim sc As SmartArtColor

Dim sq As SmartArtQuickStyle

Dim sl As SmartArtLayout

Debug.Print "SmartArt 颜色列表"

Debug.Print "名称", "ID", "关键字", "描述"

'颜色列表

For Each sc In Application.SmartArtColors

Debug.Print sc.Name, sc.Id, sc.Category, sc.Description

Next

Debug.Print "SmartArt 快速样式列表"

Debug.Print "名称", "ID", "关键字", "描述"

' 快速样式列表

For Each sq In Application.SmartArtQuickStyles

Debug.Print sq.Name, sq.Id, sq.Category, sq.Description

Next

Application

SmartArtColors(i)

SmartArtLayouts(i)

SmartArtQuickStyles(i)

Shape SmartArt

AllNodes

N d

Color

Layout

QuickStyle

SmartArtNodes

SmartArtColor

SmartArtLayout

SmartArtQuickStyle

Page 40: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Debug.Print "SmartArt 布局列表"

Debug.Print "名称", "ID", "关键字", "描述"

'布局列表

For Each sl In Application.SmartArtLayouts

Debug.Print sl.Name, sl.Id, sl.Category, sl.Description

Next

End Sub

插入一个 SmartArt 图表

要向幻灯片中插入一个 SmartArt 图表,可以使用 Shapes 的 AddSmart 方法,其原型声

明如下:

Function AddSmartArt(LayoutAs SmartArtLayout, [Left As Single = -1], [Top As Single = -1], [Width As Single = -1], [Height As Single = -1]) As Shape

唯一重要的参数 Layout 是指 SmartArt 布局。

代码如下:

' 插入一个 SmartArt

Sub AddSmartArtToSlide()

Dim sld As Slide

Dim sl As SmartArtLayout

' 从布局列表中返回一个布局

Set sl = Application.SmartArtLayouts("urn:microsoft.com/office/officeart/2005/8/layout/hList3")

Set sld = ActiveWindow.View.Slide

' 增加

sld.Shapes.AddSmartArt sl

End Sub

有一个问题,上面的“urn:microsoft.com/office/officeart/2005/8/layout/hList3”是什么?

它是标识布局列表中某个布局的 ID,在上面的“试一试”中,有列举所有布局 ID 的代码:

Debug.Print sl.Name, sl.Id, sl.Category, sl.Description

获取某个布局,也可以使用其在列表中的索引,例如:

Application.SmartArtLayouts(4)

更改 SmartArt 图表布局

如果要更改一个SmartArt图表的布局,可以使用SmartArt对象的属性Layout,如图 10-27所示演示了其访问的过程。

Page 41: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

图 10-27

' 更改一个 SmartArt 的布局

Sub ChangeSmartArtLayout()

Dim sl As SmartArtLayout, shp As Shape

'第 4 个

Set sl = Application.SmartArtLayouts(4)

'插入一个 SmartArt

Set shp = ActiveWindow.View.Slide.Shapes.AddSmartArt(sl)

'改变其布局为列表中第 5 个

shp.SmartArt.Layout = Application.SmartArtLayouts(5)

End Sub

更改 SmartArt 图表颜色

要更改一个 SmartArt 图表的颜色,可以使用 SmartArt 对象的属性 Color,如图 10-28 所

示演示了其访问的过程。

图 10-28

' 更改一个 SmartArt 的颜色

Sub ChangeSmartArtColor()

Dim sl As SmartArtLayout, shp As Shape

Set sl = Application.SmartArtLayouts(10) '第 10 个

Set shp = ActiveWindow.View.Slide.Shapes.AddSmartArt(sl) '插入一个 SmartArt

'改变其颜色为列表中彩色类别中的第 2 个,也可用索引号

shp.SmartArt.Color =

Application.SmartArtColors("urn:microsoft.com/office/officeart/2005/8/colors/colorful2")

End Sub

Page 42: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

更改 SmartArt 图表样式

要更改一个 SmartArt 图表的样式,可使用 SmartArt 对象的属性 QuickStyle,如图 10-29所示演示了其访问的过程。

图 10-29

' 更改一个 SmartArt 的样式

Sub ChangeSmartArtQuickStyle()

Dim sl As SmartArtLayout, shp As Shape

'第 8 个

Set sl = Application.SmartArtLayouts(8)

'插入一个 SmartArt

Set shp = ActiveWindow.View.Slide.Shapes.AddSmartArt(sl)

'改变其样式为列表中 3D 类别中的优雅

shp.SmartArt.QuickStyle =

Application.SmartArtQuickStyles("urn:microsoft.com/office/officeart/2005/8/quickstyle/3d1")

End Sub

增加或删除 SmartArt 节点

通过 AllNodes 和 Nodes 可访问 SmartArt 对象的节点。

AllNodes 表示所有的节点,而 Nodes 表示根节点下的所有子节点,这两个属性都返回

SmartArtNodes 集合对象,每个 SmartArtNodes 集合中的元素代表了图表中的单个语义节点

SmartArtNode。

下面的代码演示了对 SmartArt 节点的访问。

' 增加 SmartArt 图表的节点或删除节点

Sub AddSmartArtNodes()

Dim smtShp As Shape

Set smtShp = ActivePresentation.Slides(2).Shapes(1)

If smtShp.HasSmartArt Then

With smtShp

' 添加到位于此节点集合顶层的数据模型的底部。如果最高级别是 2,则这个新节点

的级别也将是 2

With .SmartArt.AllNodes.Add

.TextFrame2.TextRange.Text = "测试节点 1"

Page 43: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

'在此节点上增加一个子节点

.AddNode.TextFrame2.TextRange.Text = "测试子节点"

End With

'更改第一根节点的文本

.SmartArt.Nodes(1).TextFrame2.TextRange.Text = "改变的文本"

'在此根节点上增加一个子节点

.SmartArt.Nodes(1).AddNode.TextFrame2.TextRange.Text = "增加的子节点"

' 删除第 2 个根节点

.SmartArt.Nodes(1).Delete

End With

End If

End Sub

将文本转换为 SmartArt 图形

使用 Shape 对象的方法 ConvertTextToSmartArt 可将文本快速转换成美观的 SmartArt 图形,以增强文本的表达效果。

' 把文本转换成 SmartArt 图形

Sub ConverTextToSmartArt()

Dim Sld As Slide

Set Sld = ActivePresentation.Slides.Add(2, ppLayoutBlank)

Dim shp As Shape

Dim str As String

str = "水果\苹果\草莓\西瓜\石榴"

str = Replace(str, "\", vbCrLf)

'插入一个图形

Set shp = Sld.Shapes.AddShape(msoShapeRectangle, 50, 50, 200, 200)

'把上面的文本按大纲级别插入到图形中

With shp.TextFrame2.TextRange

.Text = str

'第一行为顶层文本,其他缩进为第二级文本。

.Lines(2).ParagraphFormat.IndentLevel = 2

.Lines(3).ParagraphFormat.IndentLevel = 2

.Lines(4).ParagraphFormat.IndentLevel = 2

.Lines(5).ParagraphFormat.IndentLevel = 2

End With

' 用指定样式转换上面的大纲文本为 SmartArt 图形。

shp.ConvertTextToSmartArt Application.SmartArtLayouts(95)

End Sub

Page 44: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

获取 SmartArt 中的文本

每个 SmartArtNode 对象代表了 Smart Art 图形数据模型内部的单个语义节点。它包含

如图 10-30 所示的属性和方法。

图 10-30

SmartArtNode 的 Leval 可获取节点在层次结构中的级别,TextFrame2 可获取此节点中的

文本。

下面的代码演示了如何获取 SmartArt 中节点的文本。

'获取 SmartArt 图形中节点的文本

Sub GetSmartArtTest()

Dim Sld As Slide

Set Sld = ActivePresentation.Slides(2)

Dim Shp As Shape

Set Shp = Sld.Shapes(1)

Debug.Print "层级", "文本"

If Shp.HasSmartArt Then' 如果是 SmartArt 图形

Dim ne As SmartArtNode

' 遍历 SmartArt 的所有节点,输入每个节点的文本

For Each ne In Shp.SmartArt.AllNodes

Debug.Print ne.Level, ne.TextFrame2.TextRange.Text

Next

End If

End Sub

10.9 使用新式图表

PowerPoint 集成了一个功能强大、用途广泛的图表引擎,可以插入多种数据图表和图形,

如柱形图、折线图、饼图、条形图、面积图、散点图、股价图、曲面图、圆环图、气泡图和

雷达图。

图表是数据的一种可视表示形式。通过使用类似柱形(在柱形图中)或折线(在折线图

中)这样的元素,图表可按照图形格式显示系列数值数据。

图 10-31 展示了 PowerPoint 中可插入的图表类型。

属性 方法

Page 45: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

图 10-31

添加图表

通过 Shapes 集合的 AddChart 方法可以向幻灯片中增加一个图表。图表是数据的可视化

呈现,图 10-32 展示了建立新图表并获取数据的过程。

图 10-32

从图 10-32 可看出,在增加一个新图表后,使用 ChartData 对象的 Workbook 属性从 Excel工作簿中获取图表所需的数据。

下面的代码生成一个统计 2009 年 GDP 位于世界前四名的国爱的条形图表。

Sub CreateChart()

Dim cht As Chart

Dim chtData As ChartData

Dim wb As Object

Dim ws As Object

' 在幻灯片 1 中插入一个条形图表.

Dim shp As Shape

Set shp = ActivePresentation.Slides(1).Shapes.AddChart(xlBarClustered, 20, 50, 600, 400)

' 是否是图表

If shp.Type = msoChart Then

Set cht = shp.Chart

End If

If cht Is Nothing Then Exit Sub

' 获取与图表数据相关的工作簿

Set wb = cht.ChartData.Workbook

' 获取工作簿中的工作表

Page 46: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Set ws = wb.Worksheets(1)

' '将数据限定在 A1:B5

ws.ListObjects(1).Resize ws.Range("A1:B5")

' 设置系列的标题,此标题在 B1 单元格中

ws.Range("B1").Value = "2009 年 GDP 前 4 名"

' 设置数据

ws.Range("A2:B2").Value = Array("美国", 14.8)

ws.Range("A3:B3").Value = Array("中国", 5.2)

ws.Range("A4:B4").Value = Array("日本", 5)

ws.Range("A5:B5").Value = Array("德国", 3.5)

' 应用新数据重画图表。

cht.ApplyDataLabels xlDataLabelsShowValue

' 退出 Excel

wb.Application.Quit

End Sub

通过 Chart 对象的 ChartType 属性可更改图表的类型,如下面的代码把上面的条形图更

改为三维面积图。

cht.ChartType= xl3DArea

修改图例

图例是一个方框,用于标识为图表中的数据系列或分类指定的图案或颜色。每个图表中

只能有一个图例。

图 10-33 展示了获取图例对象的过程。

图 10-33

下面的代码修改了上面所建图表中的图例:

Sub ModifyLegend()

On Error Resume Next

Dim cht As Chart

Set cht = ActivePresentation.Slides(1).Shapes("GDP 图表").Chart

' 没有指定图表则退出

Page 47: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

If cht Is Nothing Then Exit Sub

Dim led As Legend

Set led = cht.Legend

With led

'把图例位置放于底部

.Position = xlLegendPositionBottom

.IncludeInLayout = True

With .Format

' 更改图例填充色

.Fill.ForeColor.ObjectThemeColor = msoThemeColorBackground2

' 更改图例线条色

.Line.ForeColor.ObjectThemeColor = msoThemeColorAccent5

End With

End With

End Sub

修改图表标题

图表标题是说明性的文本,可以自动与坐标轴对齐或在图表顶部居中。

通过 Chart 对象的 ChartTitle 可引用图表的标题对象,下面的代码修改了图表标题区的

文本、字体和格式。

With cht.ChartTitle

.Caption = "2009 年 GDP 四强"

.Characters.Font.Bold = True

.Characters.Font.Size = 20

.Format.Fill.Solid

.Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorLight1

.Format.Fill.Visible = True

.Format.Glow.Color.ObjectThemeColor = msoThemeColorAccent5

.Format.Glow.Radius = 20

.Format.Glow.Transparency = 40

End With

设置图表格式

可添加一些格式以使图表看起来更美观,如下面的代码所示:

Sub SetChartFormat()

On Error Resume Next

Dim cht As Chart

Set cht = ActivePresentation.Slides(1).Shapes("GDP 图表").Chart

If cht Is Nothing Then Exit Sub ' 没有指定图表则退出

Page 48: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

With cht.ChartArea.Format ' 设置整个图表区域填充

.Fill.PresetGradient msoGradientHorizontal, 2, msoGradientWheat

.Fill.Visible = True

With .Line ' 给图表区添加线框

.ForeColor.RGB = vbBlue

.DashStyle = msoLineDashDotDot

.Weight = 2

.Visible = True

End With

End With

End Sub

设置图表快速样式

自定义设置图表的格式复杂而费时,PowerPoint 内置了 48 种图表样式,可快速更改图

表的外观,如图 10-34 所示。

图 10-34

使用 Chart 对象的 ChartStyle 属性可快速更改图表的样式,下面的代码把图表样式更改

为第 10 个样式:

Dim cht As Chart

Set cht = ActivePresentation.Slides(1).Shapes("GDP 图表").Chart

cht.ChartStyle = 10

向图表增加更多数据

可通过添加数据来更新 PowerPoint 图表。要向现有图表添加新的数据或者更改数据,

应首先使用 ListObject 对象的 Resize 方法调整表格大小。如:

' 调整表格大小,以添加更多的数据

ws.ListObjects(1).Resize ws.Range("A1:B11")

上面的代码把数据限定在 A1:B11 单元格区域内。

Page 49: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

此时可向区域内添加新的数据,下面的代码添加了 2009 年 GDP 在世界前 10 名的国家:

ws.ListObjects(1).Resize ws.Range("A1:B11")

ws.Range("B1").Value = "2009 年 GDP 前 10 名"

ws.Range("A2:B2").Value = Array("美国", 14.8)

ws.Range("A3:B3").Value = Array("中国", 5.2)

ws.Range("A4:B4").Value = Array("日本", 5)

ws.Range("A5:B5").Value = Array("德国", 3.5)

ws.Range("A6:B6").Value = Array("法国", 2.5)

ws.Range("A7:B7").Value = Array("意大利", 2.2)

ws.Range("A8:B8").Value = Array("英国", 2)

ws.Range("A9:B9").Value = Array("加拿大", 1.5)

ws.Range("A10:B10").Value = Array("西班牙", 1.4)

ws.Range("A11:B11").Value = Array("印度", 1.3)

添加多个数据系列

可以在图表中绘制一个或多个列,每列数据都称为系列。

下面的代码在图表中添加了两个系列:财政收入和财政支出。其中财政收入显示为柱形

图,财政支出显示为拆线图,数据对比非常直观。

ws.ListObjects(1).Resize ws.Range("A1:C6")' 调整表格大小,以添加更多的数据

' 第一个系列

ws.Range("B1").Value = "财政收入(亿元)"

ws.Range("A2:B2").Value = Array("2005", 31649.29)

ws.Range("A3:B3").Value = Array("2006", 38760.2)

ws.Range("A4:B4").Value = Array("2007", 51321.78)

ws.Range("A5:B5").Value = Array("2008", 61330.35)

ws.Range("A6:B6").Value = Array("2009", 68518.3)

' 再添加一个系列

ws.Range("C1").Value = "财政支出(亿元)"

ws.Range("c2").Value = 33930.28

ws.Range("c3").Value = 40422.73

ws.Range("c4").Value = 49781.35

ws.Range("c5").Value = 62592.66

ws.Range("c6").Value = 76299.93

' 此系列的图表类型为带数据标记的堆积拆线图

cht.SeriesCollection(2).ChartType = xlLineMarkersStacked

With cht.SeriesCollection(2).Format.Fill

.Solid

.ForeColor.RGB = vbRed

.Visible = True

End With

cht.ApplyDataLabels xlDataLabelsShowValue ' 重绘图表

Page 50: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

cht.SetElement msoElementDataLabelNone' 取消数据标签

实例演练:创建交互式 PowerPoint 图表

下面的示例演示了在 PowerPoint 中使用来自外部 Excel 文件的数据生成新图表,这种

与图表的交互式的操作可以更好地呈现数据。

①建立一个名为“进出口总额与贸易顺差图表”的 Excel 文件,内容如图 10-35 所示。

图 10-35

② 新建一个 PowerPoint 文件,把上面的图表复制到幻灯片中。

③在幻灯片中插入一个组合框控件。

④在组合框的 DropButtonClick 事件中添加如下代码。

If ComboBox1.ListCount = 0 Then

With ComboBox1

.AddItem "进出口总额"

.AddItem "出口总额"

.AddItem "进口总额"

.AddItem "差额"

.ListRows = 4

End With

End If

⑤继续在组合框的 Change 事件中添加代码。

' 激活数据

cht.ChartData.Activate

Set ws = cht.ChartData.Workbook.Worksheets(1)

' 选择系列,生成新图表

Select Case ComboBox1.Value

Case "进出口总额"

cht.SeriesCollection(1).Name = ws.Range("B1")

cht.SeriesCollection(1).Values = "='Sheet1'!$B$2:$B$6"

Case "出口总额"

Page 51: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

cht.SeriesCollection(1).Name = ws.Range("C1")

cht.SeriesCollection(1).Values = "='Sheet1'!$C$2:$C$6"

Case "进口总额"

cht.SeriesCollection(1).Name = ws.Range("D1")

cht.SeriesCollection(1).Values = "='Sheet1'!$D$2:$D$6"

Case "差额"

cht.SeriesCollection(1).Name = ws.Range("E1")

cht.SeriesCollection(1).Values = "='Sheet1'!$E$2:$E$6"

End Select

' 重绘图表

cht.Refresh

⑥放映幻灯片,在组合框中选择相应系列,生成反映系列数据的图表。

10.10 处理图片

图片是演示文稿中重要的视觉元素之一,PowerPoint 提供了强大的工具用于对图片进行

有效的处理,以增强图片的感染力。

图 10-36 展示了 PowerPoint 对象模型中图片对象的信息。

图 10-36

增加图片

使用 Shapes 集合对象的 AddPicture 方法,可以向幻灯片中增加图片,具体说明如下:

Function AddPicture (FileName As String, LinkToFile AsMsotriState, SaveWithDocument As MsoTriState, Left As Single, Top As Single, [Width As Single = -1], [Height As Single = -1]) As Shape

参数 Filename 代表了要插入的图片文件路径,LinkToFile 表示是链接还是嵌入图片。

下面的代码以嵌入方式增加一张图片。

Sub AddPictureToSlide()

Page 52: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Dim sld As Slide

Set sld = ActiveWindow.View.Slide

Dim sfile As String

sfile = ActivePresentation.Path & "\002.png"

Dim l As Single, t As Single

' 定位到幻灯片中心

l = ActivePresentation.PageSetup.SlideWidth / 2

t = ActivePresentation.PageSetup.SlideHeight / 2

'以嵌入方式插入图片

sld.Shapes.AddPicture sfile, False, True, l, t

End Sub

更改图片的亮度和对比度

调整图片亮度可以使曝光不足或曝光过度的图片的细节得以充分表现,通过提高或降低

对比度可以更改明暗区域分界的定义。

调整图片的亮度使用 PictureFormat 对象的属性 Brightness,其值最暗为 0.0,最亮为 1.0.

例如下面的代码把图片的亮度调亮 0.1。

Dim shpPic As PictureFormat

Set shpPic = ActivePresentation.Slides(1).Shapes("testpicture").PictureFormat

With shpPic

.Brightness = .Brightness + 0.1'调亮 0.1

End With

调整图片的对比度使用 PictureFormat 对象的 Contrast,其取值范围必须是 0.0(最低对

比度)到 1.0(最高对比度)。

下面的代码把图片的对比度增加 0.1。

Dim shpPic As PictureFormat

Set shpPic = ActivePresentation.Slides(1).Shapes("testpicture").PictureFormat

With shpPic

' 对比度增加 0.1

.Contrast = .Contrast + 0.1

End With

设置图片背景透明

有些图片会有背景颜色,而在实际需求中却不需要背景,可以通过 PictureFormat 对象

的 TransparencyColor 去除图片的背景色。

下面的代码把图片中黑色的背景删除。

Page 53: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Sub SetPictureTransparencyColor()

Dim shpPic As PictureFormat

Set shpPic = ActivePresentation.Slides(1).Shapes("alphapicture").PictureFormat

With shpPic

.TransparentBackground = True '允许透明背景

.TransparencyColor = RGB(0, 0, 0) '本例中透明色为黑色

End With

End Sub

变化多样的裁剪

裁剪通常用来隐藏或修整部分图片,以便进行强调或删除不需要的部分。

PowerPoint 的裁剪功能经过增强后,可以轻松裁剪为特定形状、经过裁剪来适应或填充

形状。

①用 Crop 对象裁剪。

Crop 对象用于去除图片的某一部分。其主要成员如表 10-1 所示。

表 10-1

Crop 对象 作用

PictureHeight 获取或设置要裁剪的图像的高度,可读/写

PictureOffsetX 获取或设置要裁剪的图像的 X 轴的偏移量,可读/写

PictureOffsetY 获取或设置要裁剪的图像的 Y 轴的偏移量,可读/写

PictureWidth 获取或设置裁剪的图像的宽度,可读/写

ShapeHeight 获取或设置用于裁剪图像的形状的高度。可读/写

ShapeLeft 获取或设置用于裁剪图像的形状左侧的位置,可读/写

ShapeTop 获取或设置用于裁剪图像的形状顶部的位置,可读/写

ShapeWidth 获取或设置用于裁剪图像的形状的宽度,可读/写

下面的代码插入了一张图片,在图像框内部将该图像的大小调整为 100×100。接着代

码在紧邻该图像右下方的位置添加一个正方形(默认形状),将该图像的左上角裁剪掉。

Dim shp As Shape, picFile As String

picFile = ActivePresentation.Path & "\Water lilies.jpg"

Set shp = ActivePresentation.Slides(1).Shapes.AddPicture(picFile, False, True, 10, 10)

With shp.PictureFormat.Crop

.PictureHeight = 100' 图片大小

.PictureWidth = 100

.PictureOffsetX = 0

.PictureOffsetY = 0

.ShapeHeight = 100' 裁剪形状大小

Page 54: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

.ShapeWidth = 100

.ShapeLeft = 70' 裁剪形状左上角位置

.ShapeTop = 70

End With

②裁剪为特定形状。

可以把图片裁剪为特定形状。在剪裁为特定形状时,将自动修整图片以填充形状的几何

图形,但同时会保持图片的比例不变。

通过使用 Shape 的 AutoShapeType 属性可以快速地把图片裁剪为指定的形状。

下面的代码演示了把所插入的图片裁剪为椭圆形状。

' 裁剪图片为指定形状

Sub CropPicAsShape()

Dim shp As Shape, picFile As String

picFile = ActivePresentation.Path & "\Water lilies.jpg"

Set shp = ActivePresentation.Slides(1).Shapes.AddPicture(picFile, flase, True, 10, 10)

shp.AutoShapeType = msoShapeOval' 裁剪图片为椭圆形

End Sub

设置图片效果

PictureFormat 对象提供了对图片最简单的处理,而 PictureEffect 对象可以对图片进行更

复杂的操作,它代表图片效果。图片效果被处理为由各个项构成的链,以便创建一个最终复

合的图像,链中的项是按照顺序应用的。效果链允许向链中添加效果、对效果重新排序或从

链中删除效果。图片效果对象模型如图 10-37 所示。

图 10-37

可以通过 PictureEffects 对象的 Insert 方法向效果链中添加一个图片效果或者用 Item 属

性返回指定的图片效果。

①调整图片色温

当照相机未正确测量色温时,拍出的图片会显示偏色,这使得图片看上去偏蓝或偏橙。

可通过提高或降低色温增强图片的细节来调整这种状况,使图片看上去更好看。

' 设置图片的色温(色调)

Sub SetPictureColorTemperature()

Dim shpEff As PictureEffect, oFill As FillFormat

Page 55: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Set oFill = ActivePresentation.Slides(1).Shapes("testpicture").Fill

' 查询效果链表,删除所有色调效果

For Each shpEff In oFill.PictureEffects

If shpEff.Type = msoEffectColorTemperature Then

shpEff.Delete

End If

Next

' 增加一个色温效果

Set shpEff = oFill.PictureEffects.Insert(msoEffectColorTemperature)

With shpEff

' 将其参数调整为 7500(值范围为 1500~11500)

.EffectParameters.Item(1).Value = 7500

End With

End Sub

色温只有一个参数:温度。

②调整图片饱和度

饱和度是颜色的浓度。饱和度越高,图片色彩越鲜艳;饱和度越低,图片越黯淡。

' 设置图片饱和度

Sub SetPictureSaturation()

Dim shpEff As PictureEffect, oFill As FillFormat

Set oFill = ActivePresentation.Slides(1).Shapes("testpicture").Fill

' 查询效果链表,删除所有饱和度效果

For Each shpEff In oFill.PictureEffects

If shpEff.Type = msoEffectSaturation Then

shpEff.Delete

End If

Next

' 增加一个饱和度效果

Set shpEff = oFill.PictureEffects.Insert(msoEffectSaturation)

With shpEff

' 将其参数调整为 2(值范围为 0~4)

.EffectParameters.Item(1).Value = 2

End With

End Sub

饱和度只有一个参数:饱和度。

③给图片添加艺术效果

可以将艺术效果应用于图片或图片填充,以使图片看上去更像草图或绘画效果。一次只

能将一种艺术效果应用于图片,因此,应用不同的艺术效果会删除以前应用的艺术效果。

Page 56: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

' 设置图片一个发光边缘效果。

Sub SetPictureGlowEdges()

Dim shpEff As PictureEffect, oFill As FillFormat

Set oFill = ActivePresentation.Slides(1).Shapes("testpicture").Fill

' 增加一个饱和度效果

Set shpEff = oFill.PictureEffects.Insert(msoEffectGlowEdges)

With shpEff

' 第一参数为透明度(值范围为 0~1)

.EffectParameters.Item(1).Value = 2

' 第二参数根据效果而定,值范围为 0~10

.EffectParameters.Item(2).Value = 3

End With

End Sub

10.11 处理新媒体

PowerPoint 支持众多的视频和音频等媒体,通过编程方式对这些媒体进行控制,以满足

在 PowerPoint 自动化任务中的需求。

增加媒体到文档中

使用 Shapes.AddMediaObject 方法可以在幻灯片中创建多媒体对象。在 PowerPoint 2010中,多媒体功能进行了很大的改造,用户能够有效利用音频和视频的内容传情达意,打造全

新且乐趣无穷的多媒体体验。为此,在 PowerPoint 对象模型中增加了新的 AddMediaObject2方法,以创建新的多媒体对象。

AddMediaObject2 语法:

Function AddMediaObject2 (FileName As String, [LinkToFile As MsoTriStatel, [SaveWithDocument As MsoTriState = msoTrue], [Left As Single], [Top As Single], [Width As Single =-1], [Height As Single = -1]] As Shape

FileName:多媒体文件名。

LinkToFile:是否链接到文档中。

SaveWithDocument:是否嵌入到文档中。

如果 LinkToFile 和 SaveWithDocument 均为 False,该方法将返回错误。必须至少有

一个参数为 True。

注意:对象模型允许链接和嵌入对象,无法通过用户界面(UI)实现这一功能。

下面的代码在幻灯片 1 中创建一个视频。

Page 57: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Sub AddNewVideoMedia(Byval videoFile As String)

With ActivePresentation.Slides(1).Shapes

Dim shp As Shape

' 只设置视频高度,宽度将保持适当的纵横比,视频链接入文档中。

Set shp = .AddMediaObject2(videoFile, msoTrue, msoFalse, 10, 10, 320)

End With

End Sub

下面的代码在幻灯片 1 中创建一个音频。

Sub AddNewAdiuoMedia(byval AdiuoFile As String)

With ActivePresentation.Slides(1).Shapes

Dim shp As Shape

'加入音频,嵌入文档中。

Set shp = .AddMediaObject2(audioFile, msoFalse, msoTrue, 350, 10)

End With

End Sub

还可使用 Shapes.AddMediaObjectFromEmbedTag 方法将嵌入标记中的媒体对象添加到

幻灯片中。其语法是:

Function AddMediaObjectFbjectFromEmbedTag (EmbedTag As String, [Left As Single], [Top As Single], [Width As Single = -1], [Height As Single = -1]) As Shape

EmbedTag 表示嵌入标记,嵌入标记是一个包含格式的标记字符串,从<object>标记开

始,以</object>标记结束。其中的主要标记介绍如下。

<embed>标记:用于表示嵌入的网络视频或音频等多媒体对象。它包含了如下一些属性。

src:指定视频或音频的 URL。

quality:视频品质。

width、height:视频的大小。

allowScriptAccess:脚本访问权限。

type:媒体类型。

下面是一个嵌入标记的示例:

<object><embed src='http://player.ku6.com/refer/Oy7xCLNCte4kpKxc/v.swf' quality='high' width='414'

height='305' align='middle' allowScriptAccess='always'

type='application/x-shockwave-flash'></embed></object>

用.AddMediaObjectFromEmbedTag 把上面嵌入标记中指定的网络视频插入到幻灯片中。

Sub InsertWebVideo()

' 建立嵌入标记

Page 58: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Const sEmbedTag = "<embed src='http://player.ku6.com/refer/Oy7xCLNCte4kpKxc/v.swf'

quality='high' width='414' height='305' align='middle' allowScriptAccess='always'

type='application/x-shockwave-flash'></embed></object>"

Dim Sld As Slide

Set Sld = ActivePresentation.Slides(1)

' 插入标记中指定的视频

Call Sld.Shapes.AddMediaObjectFromEmbedTag(sEmbedTag)

End Sub

在幻灯片中创建多媒体对象后,可通过 Shape 的 MediaFormat 属性引用 MediaFormat对象。

此对象包含的属性和方法如图 10-38 所示。

图 10-38

控制媒体的音量

MediaFormat 对象的 Muted 和 Volume 属性可控制媒体的音量。

下面的代码先判断音量是否为静音,如果是则打开声音并设置音量大小。

' 调整音量

Sub ModifyVolume()

Dim shp As Shape

For Each shp In ActivePresentation.Slides(1).Shapes

If shp.Type = msoMedia Then

With shp.MediaFormat

'如果为静音,则打开声音,并设置音量为 0.8

If .Muted = False Then

.Muted = True

.Volume = 0.8

End If

End With

End If

Next

End Sub

Page 59: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

获取媒体的信息

可通过获取媒体的信息,以调整相关的媒体属性。

' 获取媒体信息

Sub GetMediaInfo()

Dim videoFile As String

videoFile = ActivePresentation.Path & "\bee.mpg"

With ActivePresentation.Slides(1).Shapes

With .AddMediaObject2(videoFile, False, True, 100, 100)

.ScaleHeight 1, True

.ScaleWidth 1, True

With .ThreeD

.BevelTopType = msoBevelRiblet

.BevelTopDepth = 10

.BevelTopInset = 10

End With

With .MediaFormat

Debug.Print .IsEmbedded '是否嵌入

Debug.Print .IsLinked '是否链接

Debug.Print .AudioCompressionType '音频压缩格式

Debug.Print .Length '媒体的总长度

Debug.Print .AudioSamplingRate '媒体的每秒音频采样率

Debug.Print .SampleHeight '媒体的分辨率高度

Debug.Print .SampleWidth '媒体的分辨率宽度

Debug.Print .VideoCompressionType '视频压缩格式

Debug.Print .VideoFrameRate '每秒视频帧速率

End With

End With

End With

End Sub

剪辑媒体

有时,可能需要删除与视频主旨无关的部分内容,在 PowerPoint 2010 之前必须借助于

专门的媒体编辑工具,PowerPoint 2010 增加了媒体剪辑功能,用 StartPoint 和 EndPoint 属性

可以剪辑指定时间段的视频或音频。

'剪辑媒体

Sub CropMedia()

Dim videoFile As String

videoFile = ActivePresentation.Path & "\bee.mpg"

With ActivePresentation.Slides(1).Shapes

With .AddMediaObject2(videoFile, False, True, 100, 100)

Page 60: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

With .MediaFormat

'从总时间的 1/4 处开始

.StartPoint = .Length / 4

' 到总时间的 3/4 处结束

.EndPoint = .Length / 4 * 3

End With

End With

End With

End Sub

StartPoint 和 EndPoint 以毫秒为单位,1000 毫秒等于 1 秒。

管理媒体标签

可以添加书签来指示视频或音频剪辑中关注的时间点。使用书签可触发动画或跳转至视

频中的特定位置。

使用 MediaBookmarks 集合可返回或添加当前活动媒体的书签。下面的代码演示了添加

和删除书签。

'媒体书签

Sub SetMediaBookmark()

Dim videoFile As String

Dim i As Integer

videoFile = ActivePresentation.Path & "\bee.mpg"

With ActivePresentation.Slides(1).Shapes

With .AddMediaObject2(videoFile, False, True, 100, 100)

'命名

.Name = "testPlayer"

With .MediaFormat

' 有书签删除它

For i = .MediaBookmarks.Count To 1 Step -1

.MediaBookmarks(i).Delete

Next

' 分别在 1、3、5 秒处创建书签

.MediaBookmarks.Add 1000, "p1"

.MediaBookmarks.Add 3000, "p2"

.MediaBookmarks.Add 5000, "p3"

End With

End With

End With

End Sub

Page 61: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

使用媒体播放控件

媒体控件由 Player 对象控制,此对象用于控制媒体的播放状态,包含了如图 10-39 所示

的属性和方法。

图 10-39

'开始播放

Sub StartPlay()

' 返回媒体播放控件

Dim id As Long, mPlayer As Player

id = ActivePresentation.Slides(1).Shapes("testPlayer").id

Set mPlayer = ActiveWindow.View.Player(id)

mPlayer.Play

End Sub

'停止播放

Sub StopPlay()

' 返回媒体播放控件

Dim id As Long, mPlayer As Player

id = ActivePresentation.Slides(1).Shapes("testPlayer").id

Set mPlayer = ActiveWindow.View.Player(id)

mPlayer.Stop

End Sub

'暂停播放

Sub PausePlay()

' 返回媒体播放控件

Dim id As Long, mPlayer As Player

id = ActivePresentation.Slides(1).Shapes("testPlayer").id

Set mPlayer = ActiveWindow.View.Player(id)

mPlayer.Pause

End Sub

Sub GotoNextBk()

' 返回媒体播放控件

Dim id As Long, mPlayer As Player

id = ActivePresentation.Slides(1).Shapes("testPlayer").id

Set mPlayer = ActiveWindow.View.Player(id)

mPlayer.GoToNextBookmark

End Sub

Sub GotopreBk()

Page 62: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

' 返回媒体播放控件

Dim id As Long, mPlayer As Player

id = ActivePresentation.Slides(1).Shapes("testPlayer").id

Set mPlayer = ActiveWindow.View.Player(id)

mPlayer.GoToPreviousBookmark

End Sub

Sub GotoPos()

' 返回媒体播放控件

Dim id As Long, mPlayer As Player

id = ActivePresentation.Slides(1).Shapes("testPlayer").id

Set mPlayer = ActiveWindow.View.Player(id)

mPlayer.CurrentPosition = 7000

End Sub

将演示文稿转换为视频

有时需要把演示文稿转换成视频文件,并将其刻录至光盘中或者上传到网站上与别人分

享,这样不仅更易于分发,还易于其他人观看。

Sub CreateVideoInPresentation()

ActivePresentation.CreateVideo "C:\test.wmv"

Do

DoEvents

'判定建立视频状态

Select Case ActivePresentation.CreateVideoStatus

Case ppMediaTaskStatusDone

MsgBox "完成!"

Exit Do

Case ppMediaTaskStatusFailed

MsgBox "失败"

Exit Do

Case ppMediaTaskStatusInProgress

Debug.Print "进行中"

Case ppMediaTaskStatusNone '无状态

Case ppMediaTaskStatusQueued

Debug.Print "排队"

End Select

Loop

End Sub

Page 63: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

10.12 基础动画编程

若要将注意力集中在要点上,控制信息流以及提高观众对演示文稿的兴趣,使用动画是

一种好方法。

认识 PPT 的动画对象模型

从 PowerPoint 对象模型中定位动画对象模型是本节的基础,图 10-40 演示了动画对象之

间的关系。

图 10-40

PowerPoint 动画由一个叫做 TimeLine 的对象控制,它是所有动画的根对象,这个对象

把被称为 Effect(效果)的项组织成序列,成为 PowerPoint 动画窗格中可见的部分,如图

10-41 所示。

图 10-41

序列有两种,一种是自动按顺序播放的序列(mainSequence),一种是由用户触发的序

列(InteractiveSequence),每个序列中的项是 Effect,这个对象其实不是真实的动画实体,

而是一个各种动画实体的组合体,PowerPoint 中预定义了很多这样的组合体,例如“浮入”、

“劈裂”,也提供了自己包装各种动画实例的功能。实体动画是指像 MotionEffect 这样的对象。

众所周知,动画总是跟时间紧密相关,时间决定了对象显示的快慢等属性。动画的时间

控制由一个叫做 Timing 的对象控制。其对象构成如图 10-42 所示。

Page 64: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

图 10-42

那么,如何获取对幻灯片中动画对象的访问呢?

图 10-43 演示了获取根动画对象的过程。

图 10-43

由此开始,发生对其他对象的引用。

为对象增加动画

为对象添加动画,其实就是向 TimeLine 的序列中添加一个被组合好的效果。使用

Sequence 对象的 AddEffect 方法可以向幻灯片中的对象添加动画效果。AddEffect 原型说明

如下:

Function AddEffect (Shape As Shape, effectTd As MsoAnimEffect, [Level As MsoAnimateBvLevel=msoAnimateLevelNone], [trigger As MsoAnimTriggerType=msoAnimTriggerOnPageClick], [Index As Long = -1]) As Effect

Shape 表示向哪个对象添加动画,EffectTd 是指预先定义好的实体动画组合体 Effect,每个效果用一个标识 ID 来识别。

下面的代码演示了向幻灯片中增加一个矩形,然后为其增加一个“盒状”动画效果的过

程。

Dim sld As Slide, shp As Shape

' 获取幻灯片对象

Set sld = ActiveWindow.View.Slide

With sld

'向该幻灯片中增加一个矩形

Set shp = .Shapes.AddShape(msoShapeRectangle, 100, 100, 100, 100)

' 访问动画主序列

With .TimeLine.MainSequence

'在此序列中为矩形增加一个“盒状”效果

.AddEffect shp, msoAnimEffectBox

Page 65: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

End With

End With

此时,动画的时间采用的是默认值,可以通过效果的 Timing 对象来更调整动画的时间

属性。

调整动画时间

每个 Effect 都有一个 Timing 属性用于返回 Timing 对象的引用,下面的代码把上面给矩

形增加的“盒状”效果的动画时间长度调整为 4,并重复播放 3 次。

' 访问动画主序列

With .TimeLine.MainSequence

'在此序列中为矩形增加一个“盒状”效果

With .AddEffect(shp, msoAnimEffectBox)

' 设置动画长度为 4

.Timing.Duration = 4

' 设置动画重复播放 3 次

.Timing.RepeatCount = 3

End With

End With

动画效果的时间可以调整,那么动画效果里面的动画实体是否可以修改呢?答案是肯定

的。

修改动画信息

为对象增加动画效果之后,可以对此动画效果的各种信息进行修改。

图 10-44 列出了动画效果中可供访问的属性和方法。

图 10-44

Page 66: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

1.调整动画效果在序列中的位置

确保幻灯片中有超过 4 个的动画,然后执行下面的代码可演示动画效果位置的变化。

' 移动动画效果

Sub MoveEffect()

Dim sld As Slide, shp As Shape

' 获取幻灯片对象

Set sld = ActiveWindow.View.Slide

If sld Is Nothing Then Exit Sub

Dim seq As Sequence

' 获取动画列表主序列

Set seq = sld.TimeLine.MainSequence

'第 4 上移到第 1

seq(4).MoveTo 1

'第 3 移到第 4 后

seq(3).MoveAfter seq(1)

'第 2 移到第 4 后

seq(2).MoveBefore seq(4)

End Sub

2.更改动画效果的类型

可以对动画效果的类型进行更改,例如把一个缩放动画更改为淡出动画,也可以更改动

画所属的类别,例如把进入类别的动画改变为退出类别。下面的代码演示了这些操作。

Sub ChangeEffType()

Dim sld As Slide, shp As Shape

' 获取幻灯片对象

Set sld = ActiveWindow.View.Slide

If sld Is Nothing Then Exit Sub

Dim seq As Sequence

' 获取动画列表主序列

Set seq = sld.TimeLine.MainSequence

' 更改为光速

seq(1).EffectType = EffTypeFromStr("光速")

' 如果不是退出类型,更改为退出

If seq(1).Exit <> True Then

seq(1).Exit = True

End If

End Sub

代码中的 EffTypeFromStr 是一个自定义函数,用于通过动画的名称返回动画的 ID,其

核心代码如下:

eName = VBA.Split(effname1 & effname2 & effname3, "/")

eID = VBA.Split(effid, "/")

Page 67: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

Dim i As Integer

For i = 0 To UBound(eName)

If eName(i) = eStr Then

‘找到就退出

EffTypeFromStr = eID(i)

Exit Function

End If

Next

3.为动画效果增加声音

有时需要为某个动画效果分配一个声音,以增强其视觉和听觉效应。使用效果信息对象

EffectInformation 的 SoundEffect 属性可以为动画导入声音。代码如下:

' 为动画效果增加声音

Sub AddSoundToEffect()

Dim sld As Slide, shp As Shape

' 获取幻灯片对象

Set sld = ActiveWindow.View.Slide

If sld Is Nothing Then Exit Sub

Dim seq As Sequence

' 获取动画列表主序列

Set seq = sld.TimeLine.MainSequence

With seq(1).EffectInformation

'增加一个声音

.SoundEffect.ImportFromFile "c:\test.wav"

' 试听一下

.SoundEffect.Play

End With

End Sub

4.修改动画效果中的动画行为

动画效果 Effect 是一个容器,里面放着的是一个个像 ColorEffect 这样的动画实体,动

画实体其实就是对象的动作行为,这些动作行为的组合可以构成千变万化的动画效果。

在 PowerPoint 中包含了动画的颜色行为、滤镜行为、路径行为、属性行为、旋转行为

和绽放行为等。

图 10-45 展示了构成效果的各种动画行为。

Page 68: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

图 10-45

一个效果中可能包含一个或多个这样的动作行为,可以通过对这些行为的增减或修改其

参数,达到更改 PowerPoint 预定义动画效果的目的,以满足实际的需求。

①增加一个行为,例如:

' 以下向效果中增加新的行为

' 增加一个旋转行为,旋转 90°

With seq(1).Behaviors.Add(msoAnimTypeRotation).RotationEffect

.From = 0

.To 90

End With

' 再增加一个缩放行为,从小到大

With seq(1).Behaviors.Add(msoAnimTypeScale).ScaleEffect

.FromX = 0

.ToX = 2

End With

②删除一个行为,例如:

' 以下从效果中删除一个行为

' 删除此效果中的最后一个行为

With seq(1).Behaviors

.Item(.Count).Delete

End With

③修改行为信息,例如:

' 以下更改效果中的行为信息

With seq(1).Behaviors(2)

Select Case .Type

' 是颜色行为,从红到黄渐变

Case msoAnimTypeColor

.ColorEffect.From = RGB(255, 0, 0)

.ColorEffect.To = RGB(255, 255, 0)

' 是滤镜行为,把盒状变为圆形

Case msoAnimTypeFilter

If .FilterEffect.Type = msoAnimFilterEffectTypeBox Then

.FilterEffect.Type = msoAnimFilterEffectTypeCircle

.FilterEffect.Subtype = msoAnimFilterEffectSubtypeOut

End If

Case msoAnimTypeRotation ' 是旋转行为

.RotationEffect.From = 90

.RotationEffect.To = 270

...

End With

Page 69: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

删除动画

删除动画使用 Effect 的 Delete 方法。

①从序列中删除一个动画,例如:

Dim sld As Slide

' 获取幻灯片对象

Set sld = ActiveWindow.View.Slide

If sld Is Nothing Then Exit Sub

' 删除此幻灯片中的第一个动画

sld.TimeLine.MainSequence(1).Delete

②删除幻灯片中的所有动画,例如:

Dim sld As Slide

' 获取幻灯片对象

Set sld = ActiveWindow.View.Slide

If sld Is Nothing Then Exit Sub

Dim eff As Effect, seq As Sequence

' 遍历此幻灯片动画序列中所有动画,删除

Set seq = sld.TimeLine.MainSequence

For Each eff In seq

eff.Delete

Next

③删除演示文稿中所有的动画,例如:

' 遍历所有幻灯片

For Each sld In ActivePresentation.Slides

'删除幻灯片中动画

For Each eff In sld.TimeLine.MainSequence

eff.Delete

Next

Next

自定义动画

除了预置动画效果之外,PowerPoint 还可通过 VBA 代码构建自定义动画效果。

给 Sequence 对象的 AddEffect 方法的 EffectId 参数传递 msoAnimEffectCustom 值,为指

定图形增加一个自定义的效果,如下面的代码所示:

Set cusEffect = sld.TimeLine.MainSequence.AddEffect(shp, msoAnimEffectCustom)

此时,cusEffect 是一个空的容器,并没有任何实体动画行为。要想图形真正动起来,需

Page 70: 第10 章用 PPT 对象编程 - images.china-pub.comimages.china-pub.com/ebook3800001-3805000/3800510/ch10.pdf · 10.1PPT 对象体系架构 PPT 对象体系架构如图10-1 所示。

要向这个空的容器中添加动画行为。下面的代码向效果中添加了一个缩放行为。

Dim beh As AnimationBehavior

Set beh = cusEffect.Behaviors.Add(msoAnimTypeScale)

With beh.ScaleEffect

'开始大小

.FromX = 0

.FromY = 0

'缩放后大小

.ToX = 100

.ToY = 100

End With

现在效果中有了一个缩放行为,实现图形从最小到原始大小的变化。