摘 要 本文介绍的内容是通过VBA编程,修改PowerPoint中相关对象的属性来达到文稿格式编辑自动化的目的。
关键词 VBA,PowerPoint对象模型, 文稿格式,编程
一、VBA简介
VBA(Visual Basic For Application)是微软公司为其办公套件Microsoft Office提供的新一代标准宏语言,作为一种通用的宏语言可被所有的Microsoft 可编程应用软件所共享。VBA是一种自动化语言,用以实现Office中的应用程序自动化,并创建自定义的解决方案。
VBA主要是根据用户对可编程应用软件中不同对象的操作,触发的相应事件,去激活相应的程序,通过对相关的对象执行不同的方法,或者修改相关对象的属性来完成特定的工作。可以认为VBA是用程序开发语言VASUAL BASIC 的子集,但VBA并不等同于VB,VBA和VB的区别包括如下几个方面: VB是设计用于创建标准的应用程序,而VBA是使已有的可编程应用软件自动化; VB具有自己的开发环境,而VBA必须依赖于已有的可编程应用软件; VB开发的应用程序可编译为可执行文件(*.EXE),能独立于开发环境而直接在操作系统下运行,而VBA开发的程序必须依赖于它的“父”程序,例如:PowerPoint。
尽管存在这些不同,VBA和VB在结构上仍然十分相似。事实上,如果读者已经掌握了VB,会发现学习VBA非常快;相应的,学完VBA也会给学习VB打下坚实的基础。
二、PowerPoint对象模型
VBA将Microsoft Office中的每个应用程序都看成一个对象。每个应用程序都有各自的Application对象代表。VBA是一种基于对象的开发语言,VBA编程更多的是针对用户对应用软件中不同对象的操作,触发的相应事件,去编写对相关对象执行不同的方法,或者修改相关对象的属性等操作的代码。为此在编写VBA程序之前,首先对相关应用软件中的对象模型作大概的了解。
打开PowerPoint的VBA帮助文档VBAPP10.CHM,点击“Microsoft PowerPoint对象”帮助页面即可看到“PowerPoint 对象模型”,从这个模型中很容易找到需要的几个集合和对象:Application、Presentations、Presentation、Slides、Slide、Shapes、shape、Placeholders、PlaceholderFormat、TextFrame、Ruler、TextRange、ParagraphFormat等,其中:
Application 代表整个Microsoft PowerPoint应用程序。Application对象包括:应用程序范围内的设置和选项(例如,当前打印机的名称);用于返回顶层对象的属性,例如:ActivePresentation、Windows等。
Presentation 代表一个PowerPoint演示文稿。Presentation对象属于Presentations集合中的成员。Presentations集合中包含所有的Presentation对象,它们分别代表PowerPoint中所有打开的演示文稿。Slide 代表PowerPoint文稿中的单张幻灯片,Slides集合包含演示文稿中的所有Slide对象。Shape 代表幻灯片中的单个形状,Shapes集合包含指定幻灯片中的所有Shape对象。Placeholders 代表指定幻灯片中占位符的所有Shape对象的集合。Placeholders集合中的每个Shape对象代表一个占位符,占位符可以是文本、图表、表格、组织结构图或其他类型的对象。如果幻灯片有标题,则标题是集合中的第一个占位符。PlaceholderFormat 包含专门应用于占位符的属性,例如占位符类型。TextFrame 代表Shape对象中的文本框。包含文本框中的文本,还包含控制文本框对齐方式和缩进方式的属性和方法。Ruler 代表指定形状或指定样式中所有文本的标尺。包含大纲文本的制表位和缩进设置。TextRange 包含附加到形状上的文本,以及用于操作文本的属性和方法。ParagraphFormat 代表文本区域的段落格式。
三、编程说明
1.问题的提出
目前,有很多教学教材都带有电子教案等电子文档,其中大多数为Powerpoint演示文稿。但原作者所提供的电子教案在内容上、文稿格式上,并不一定就完全适用于使用者。因为电子教案是现代教学过程中推崇的新兴教学手段。然而教学是一门艺术,对于不同的教师,不同的教育对象,在电子教案的内容及文稿格式上不是千篇一律的,自然对于教学教材所带的电子教案要进行相应地修改。电子教案内容的修改必须由使用者逐字逐句的斟酌,没法做批量处理;但文稿格式一般固定,适合做批量的调整,可以用编程的方式来实现文稿格式编辑自动化。
2.设计分析
PowerPoint文稿的文本格式,大至可分为这么几块:标题版式幻灯片中标题的格式,标题和文本版式幻灯片中的标题格式,其他占位符的格式和其他文本框的文本格式,只要能编程控制这些对象的文本格式,对于PowerPoint文稿中的文本格式基本确定。因此,必须从PowerPoint对象模型中找出上述对象,并对其相关属性进行修改,以达到控制文本格式的目的。
标题版式幻灯片中的标题(其PlaceholderFormat对象的Type属性值为:ppPlaceh- olderCenterTitle)、标题和文本版式幻灯片中的标题(其PlaceholderFormat对象的Type属性值为:ppPlaceholderCenterTitle)、普通文本框(其Shape对象的Type属性值为:msoTextBox)中的文本格式所要控制的内容主要包括:文本字体类型、大小、前景色、粗体、斜体、下划线,行间距,段落前行间距,段落后行间距,对齐方式,缩进格式等。这些内容可通过TextFrame(文本框)中的TextRange(文本)的Font(字体)和ParagraphFormat(段落格式)的各种属性,以及TextFrame(文本框)中的Ruler(标尺)的各种属性来控制。下面对所要用到的上述各种属性作简单介绍。
字体(Font)对象中常用的属性有:NameAscii 返回或设置用于ASCII字符的字体(字符集编号在0-127之间的字符);NameOther 返回或设置亚洲字体名称;NameFarEast 返回或设置其字符集编号大于127的字符所用的字体;Size 返回或设置字符大小,以磅为单位;Bold 决定字符格式是否为粗体;Italic 决定字符格式是否为斜体;Underline 决定指定文本是否带有下划线。
段落格式(ParagraphFormat)对象中常用的属性有:Alignment 用以指定的段落格式为每个段落返回或设置对齐方式;BaseLineAlignment 为指定段落返回或设置基线对齐方式;LineRuleAfter 决定是否将每段最后一行后面的行距设为指定的磅数或行数;LineRuleBefore 决定是否将每段第一行前面的行距设为指定的磅数或行数;LineRuleWithin 决定是否将基线间的行距设为指定磅数或行数;SpaceAfter 以磅或行为单位返回或设置指定文本中每段末行后的间距大小;SpaceBefore 以磅或行为单位返回或设置指定文本中每段首行前的间距大小;SpaceWithin 以磅或行为单位返回或设置指定文本中基准行之间的距离;TextDirection 返回或设置指定段落的文本方向;WordWrap 决定是否自动换行以适应形状内部。
标尺(Ruler)对象中常用的属性有:Levels 返回一个描述大纲缩进格式的RulerLevels对象。RulerLevels指定标尺上所有RulerLevel对象的集合。每个RulerLevel对象代表特定大纲级别上文本的首行缩进和左缩进。该集合通常包含五个成员(每个可用大纲级别各一个)。每个RulerLevel对象上有:FirstMargin属性和LeftMargin属性。
3.编程实现
根据上述分析,可按下述思路编写程序:在要做格式编辑自动化的PowerPoint文稿中随便录制一个新宏,然后编辑这个宏,除宏的首、尾保留外删除其他内容;使用一个For循环来遍历文稿中的所有幻灯片,循环次数可由Slides集合对象的Count属性取得;循环体内大致分三块内容,一块用以处理标题版式幻灯片中标题的文本格式,一块用以处理标题和文本版式幻灯片中标题的文本格式,一块用以处理普通文本框中的文本格式;幻灯片中除标题以外的其他占位符中的文本格式用一个子过程单独进行处理。实现的代码如下:
Dim MyDocument As Object
Sub Macro1()
' 宏由 xxdwww 记录 Dim i As Integer, j As Integer, k As Integer, m As Integer, n As Integer
n = ActivePresentation.Slides.Count '取得文稿中的幻灯片张数
For i = 1 To n
Set MyDocument = ActivePresentation.Slides(i)
m = MyDocument.Shapes.Placeholders.Count '取得每张幻灯片中的占位符数
If m > 0 Then
Select Case MyDocument.Shapes.Placeholders(1).PlaceholderFormat.Type
Case ppPlaceholderCenterTitle '是标题版式幻灯片中的标题
'下面是对标题版式幻灯片中标题文本的字体格式进行处理
With MyDocument.Shapes.Title.TextFrame.TextRange.Font
.NameAscii = "宋体"
.NameOther = "宋体"
.NameFarEast = "宋体"
.Bold = True
.Size = 40
End With
'下面是对标题版式幻灯片中标题文本的段落格式进行处理
With MyDocument.Shapes.Title.TextFrame.TextRange.ParagraphFormat
.Alignment = ppAlignCenter
.LineRuleWithin = msoTrue
.SpaceWithin = 1
.LineRuleBefore = msoTrue
.SpaceBefore = 0.2
.LineRuleAfter = msoFalse
.SpaceAfter = 0
End With
Call NoTitle(2, m) '调周NoTitle子过程处理其他占位符中的文本格式
Case ppPlaceholderTitle '是标题和文本版式幻灯片中的标题
'下面是对标题和文本版式幻灯片中标题文本的字体格式进行处理
With MyDocument.Shapes.Title.TextFrame.TextRange.Font
.NameAscii = "宋体"
.NameOther = "宋体"
.NameFarEast = "宋体"
.Bold = True
.Size = 32
End With
'下面是对标题和文本版式幻灯片中标题文本的段落格式进行处理
With MyDocument.Shapes.Title.TextFrame.TextRange.ParagraphFormat
.Alignment = ppAlignLeft
.LineRuleWithin = msoTrue
.SpaceWithin = 1
.LineRuleBefore = msoTrue
.SpaceBefore = 0.2
.LineRuleAfter = msoFalse
.SpaceAfter = 0
End With
Call NoTitle(2, m) '调周NoTitle子过程处理其他占位符中的文本格式
Case Else '没有标题
Call NoTitle(1, m) '调周NoTitle子过程处理其他占位符中的文本格式
End Select
End If