摘要:Visual Basic For Application(VBA)是微軟公司為其辦公套件Microsoft Office提供的新一代標(biāo)準(zhǔn)宏語(yǔ)言,作為一種通用的宏語(yǔ)言可被所有的Microsoft 可編程應(yīng)用軟件所共享。VBA主要是根據(jù)用戶對(duì)可編程應(yīng)用軟件中不同對(duì)象的操作,觸發(fā)的相應(yīng)事件,去激活相應(yīng)的程序,通過(guò)對(duì)相關(guān)的對(duì)象執(zhí)行不同的方法,或是修改相關(guān)對(duì)象的屬性來(lái)完成特定的工作。該文介紹的內(nèi)容是通過(guò)VBA編程,修改PowerPoint中相關(guān)對(duì)象的屬性來(lái)達(dá)到文稿格式編輯自動(dòng)化的目的。
關(guān)鍵詞:VBA編程;PowerPoint對(duì)象模型;辦公自動(dòng)化
中圖分類號(hào):TP316文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)35-2528-04
1 VBA簡(jiǎn)介
VBA(Visual Basic For Application)是微軟公司為其辦公套件Microsoft Office提供的新一代標(biāo)準(zhǔn)宏語(yǔ)言,作為一種通用的宏語(yǔ)言可被所有的Microsoft 可編程應(yīng)用軟件所共享。VBA是一種自動(dòng)化語(yǔ)言,用以實(shí)現(xiàn)Office中的應(yīng)用程序自動(dòng)化,并創(chuàng)建自定義的解決方案。
VBA主要是根據(jù)用戶對(duì)可編程應(yīng)用軟件中不同對(duì)象的操作,觸發(fā)的相應(yīng)事件,去激活相應(yīng)的程序,通過(guò)對(duì)相關(guān)的對(duì)象執(zhí)行不同的方法,或是修改相關(guān)對(duì)象的屬性來(lái)完成特定的工作??梢哉J(rèn)為VBA是用程序開(kāi)發(fā)語(yǔ)言VASUAL BASIC 的子集,但VBA并不等同于VB,VBA和VB的區(qū)別包括如下幾個(gè)方面:1)VB是設(shè)計(jì)用于創(chuàng)建標(biāo)準(zhǔn)的應(yīng)用程序,而VBA是使已有的可編程應(yīng)用軟件自動(dòng)化;2)VB具有自己的開(kāi)發(fā)環(huán)境,而VBA必須依賴于已有的可編程應(yīng)用軟件;
3)VB開(kāi)發(fā)的應(yīng)用程序可編譯為可執(zhí)行文件(*.EXE),能獨(dú)立于開(kāi)發(fā)環(huán)境而直接在操作系統(tǒng)下運(yùn)行,而VBA開(kāi)發(fā)的程序必須依賴于它的“父”程序,例如:PowerPoint。
盡管存在這些不同,VBA和VB在結(jié)構(gòu)上仍然十分相似。事實(shí)上,如果你已經(jīng)掌握了VB,會(huì)發(fā)現(xiàn)學(xué)習(xí)VBA非???;相應(yīng)的,學(xué)完VBA也會(huì)給學(xué)習(xí)VB打下堅(jiān)實(shí)的基礎(chǔ)。
2 PowerPoint對(duì)象模型
VBA將Microsoft Office中的每一個(gè)應(yīng)用程序都看成一個(gè)對(duì)象。每個(gè)應(yīng)用程序都由各自的Application對(duì)象代表。VBA是一種基于對(duì)象的開(kāi)發(fā)語(yǔ)言,VBA編程更多的是針對(duì)用戶對(duì)應(yīng)用軟件中不同對(duì)象的操作,觸發(fā)的相應(yīng)事件,去編寫對(duì)相關(guān)對(duì)象執(zhí)行不同的方法,或是修改相關(guān)對(duì)象的屬性等操作的代碼。因此在編寫VBA程序之前,有必要對(duì)相關(guān)應(yīng)用軟件中的對(duì)象模型作一大概的了解。
打開(kāi)PowerPoint的VBA幫助文檔VBAPP10.CHM,點(diǎn)擊“Microsoft PowerPoint對(duì)象”幫助頁(yè)面即可看到“PowerPoint 對(duì)象模型”,從這個(gè)模型中很容易找到我們需要的幾個(gè)集合和對(duì)象:Application、Presentations、Presentation、Slides、Slide、Shapes、shape、Placeholders、PlaceholderFormat、TextFrame、Ruler、TextRange、ParagraphFormat等,其中:
Application 代表整個(gè)Microsoft PowerPoint應(yīng)用程序。Application對(duì)象包括:應(yīng)用程序范圍內(nèi)的設(shè)置和選項(xiàng)(例如,當(dāng)前打印機(jī)的名稱)
用于返回頂層對(duì)象的屬性,例如:ActivePresentation、Windows等。
Presentation 代表一個(gè)PowerPoint演示文稿。Presentation對(duì)象屬于Presentations集合中的成員。Presentations集合中包含所有的Presentation對(duì)象,它們分別代表PowerPoint中所有打開(kāi)的演示文稿。
Slide 代表PowerPoint文稿中的單張幻燈片,Slides集合包含演示文稿中的所有Slide對(duì)象。
Shape 代表幻燈片中的單個(gè)形狀,Shapes集合包含指定幻燈片中的所有Shape對(duì)象。
Placeholders 代表指定幻燈片中占位符的所有Shape對(duì)象的集合。Placeholders集合中的每個(gè)Shape對(duì)象代表一個(gè)占位符,占位符可以是文本、圖表、表格、組織結(jié)構(gòu)圖或其他類型的對(duì)象。如果幻燈片有標(biāo)題,則標(biāo)題是集合中的第一個(gè)占位符。
PlaceholderFormat 包含專門應(yīng)用于占位符的屬性,例如占位符類型。
TextFrame 代表Shape對(duì)象中的文本框。包含文本框中的文本,還包含控制文本框?qū)R方式和縮進(jìn)方式的屬性和方法。
Ruler 代表指定形狀或指定樣式中所有文本的標(biāo)尺。包含大綱文本的制表位和縮進(jìn)設(shè)置。
TextRange 包含附加到形狀上的文本,以及用于操作文本的屬性和方法。
ParagraphFormat 代表文本區(qū)域的段落格式。
3 編程說(shuō)明
3.1 問(wèn)題的提出
目前,有很多教學(xué)教材都帶有電子教案等電子文檔,其中大多數(shù)為Powerpoint演示文稿。但原作者所提供的電子教案并不一定就完全適用于使用者,且不說(shuō)內(nèi)容上要作適當(dāng)?shù)男薷?,就是文稿格式也不一定適合使用者的要求。內(nèi)容的修改必須由使用者逐字逐句的斟酌,沒(méi)法做批量處理;但文稿格式一般固定,即使有差異,也可做個(gè)別修改,適合做批量的調(diào)整,可以用編程的方式來(lái)實(shí)現(xiàn)處理的自動(dòng)化。
3.2 設(shè)計(jì)分析
PowerPoint文稿的文本格式,大至可分為這么幾塊:標(biāo)題版式幻燈片中標(biāo)題的格式,標(biāo)題和文本版式幻燈片中的標(biāo)題格式,其他占位符的格式和其他文本框的文本格式,只要能編程控制這些對(duì)象的文本格式,PowerPoint文稿中的文本格式基本確定。因此,必須從PowerPoint對(duì)象模型中找出上述對(duì)象,并對(duì)其相關(guān)屬性進(jìn)行修改,以達(dá)到控制文本格式的目的。
標(biāo)題版式幻燈片中的標(biāo)題(其PlaceholderFormat對(duì)象的Type屬性值為:ppPlaceh- olderCenterTitle)、標(biāo)題和文本版式幻燈片中的標(biāo)題(其PlaceholderFormat對(duì)象的Type屬性值為:ppPlaceholderCenterTitle)、普通文本框(其Shape對(duì)象的Type屬性值為:msoTextBox)中的文本格式所要控制的內(nèi)容主要包括:文本字體類型、大小、前景色、粗體、斜體、下劃線,行間距,段落前行間距,段落后行間距,對(duì)齊方式,縮進(jìn)格式等。這些內(nèi)容可通過(guò)TextFrame(文本框)中的TextRange(文本)的Font(字體)和ParagraphFormat(段落格式)的各種屬性,以及TextFrame(文本框)中的Ruler(標(biāo)尺)的各種屬性來(lái)控制。下面對(duì)所要用到的上述各種屬性作一簡(jiǎn)單介紹:
① 字體(Font)對(duì)象中常用的屬性有:
NameAscii 返回或設(shè)置用于ASCII字符的字體(字符集編號(hào)在0-127之間的字符)。
NameOther 返回或設(shè)置亞洲字體名稱。
NameFarEast 返回或設(shè)置其字符集編號(hào)大于127的字符所用的字體。
Size 返回或設(shè)置字符大小,以磅為單位。
Bold 決定字符格式是否為粗體。
Italic 決定字符格式是否為斜體。
Underline 決定指定文本是否帶有下劃線。
② 段落格式(ParagraphFormat)對(duì)象中常用的屬性有:
Alignment 用以指定的段落格式為每個(gè)段落返回或設(shè)置對(duì)齊方式。
BaseLineAlignment 為指定段落返回或設(shè)置基線對(duì)齊方式。
LineRuleAfter 決定是否將每段最后一行后面的行距設(shè)為指定的磅數(shù)或行數(shù)。
LineRuleBefore 決定是否將每段第一行前面的行距設(shè)為指定的磅數(shù)或行數(shù)。
LineRuleWithin 決定是否將基線間的行距設(shè)為指定磅數(shù)或行數(shù)。
SpaceAfter 以磅或行為單位返回或設(shè)置指定文本中每段末行后的間距大小。
SpaceBefore 以磅或行為單位返回或設(shè)置指定文本中每段首行前的間距大小。
SpaceWithin 以磅或行為單位返回或設(shè)置指定文本中基準(zhǔn)行之間的距離。
TextDirection 返回或設(shè)置指定段落的文本方向。
WordWrap 決定是否自動(dòng)換行以適應(yīng)形狀內(nèi)部。
③ 標(biāo)尺(Ruler)對(duì)象中常用的屬性有:
Levels 返回一個(gè)描述大綱縮進(jìn)格式的RulerLevels對(duì)象。RulerLevels指定標(biāo)尺上所有RulerLevel對(duì)象的集合。每個(gè)RulerLevel對(duì)象代表特定大綱級(jí)別上文本的首行縮進(jìn)和左縮進(jìn)。該集合通常包含五個(gè)成員(每個(gè)可用大綱級(jí)別各一個(gè))。
每個(gè)RulerLevel對(duì)象上有:
FirstMargin屬性:以磅為單位返回或設(shè)置指定大綱級(jí)別的首行縮進(jìn)。
LeftMargin屬性:以磅為單位返回或設(shè)置指定大綱級(jí)別的左縮進(jìn)。
3.3 程序編寫思路
根據(jù)上述分析,可按下述思路編寫程序:
1)在要做格式編輯自動(dòng)化的PowerPoint文稿中隨便錄制一個(gè)新宏,然后編輯這個(gè)宏,除宏的首、尾保留外刪除其它內(nèi)容。
2)使用一個(gè)For循環(huán)來(lái)遍歷文稿中的所有幻燈片,循環(huán)次數(shù)可由Slides集合對(duì)象的Count屬性取得。
3)循環(huán)體內(nèi)大致分三塊內(nèi)容,一塊用以處理標(biāo)題版式幻燈片中標(biāo)題的文本格式,一塊用以處理標(biāo)題和文本版式幻燈片中標(biāo)題的文本格式,一塊用以處理普通文本框中的文本格式。
4)幻燈片中除標(biāo)題以外的其他占位符中的文本格式用一個(gè)子過(guò)程單獨(dú)進(jìn)行處理。
3.4 程序清單:
Dim MyDocument As Object
Sub Macro1()
' 宏由 xxdwww 記錄,日期: 2006-4-15
Dim i As Integer, j As Integer, k As Integer, m As Integer, n As Integer
n = ActivePresentation.Slides.Count '取得文稿中的幻燈片張數(shù)
For i = 1 To n
Set MyDocument = ActivePresentation.Slides(i)
m = MyDocument.Shapes.Placeholders.Count '取得每張幻燈片中的占位符數(shù)
If m > 0 Then
Select Case MyDocument.Shapes.Placeholders(1).PlaceholderFormat.Type
Case ppPlaceholderCenterTitle'是標(biāo)題版式幻燈片中的標(biāo)題
'下面是對(duì)標(biāo)題版式幻燈片中標(biāo)題文本的字體格式進(jìn)行處理
With MyDocument.Shapes.Title.TextFrame.TextRange.Font
.NameAscii = \"宋體\"
.NameOther = \"宋體\"
.NameFarEast = \"宋體\"
.Bold = True
.Size = 40
End With
'下面是對(duì)標(biāo)題版式幻燈片中標(biāo)題文本的段落格式進(jìn)行處理
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) '調(diào)周NoTitle子過(guò)程處理其他占位符中的文本格式
Case ppPlaceholderTitle'是標(biāo)題和文本版式幻燈片中的標(biāo)題
'下面是對(duì)標(biāo)題和文本版式幻燈片中標(biāo)題文本的字體格式進(jìn)行處理
With MyDocument.Shapes.Title.TextFrame.TextRange.Font
.NameAscii = \"宋體\"
.NameOther = \"宋體\"
.NameFarEast = \"宋體\"
.Bold = True
.Size = 32
End With
'下面是對(duì)標(biāo)題和文本版式幻燈片中標(biāo)題文本的段落格式進(jìn)行處理
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)'調(diào)周NoTitle子過(guò)程處理其他占位符中的文本格式
Case Else '沒(méi)有標(biāo)題
Call NoTitle(1, m)'調(diào)周NoTitle子過(guò)程處理其他占位符中的文本格式
End Select
End If
k = MyDocument.Shapes.Count '取得幻燈片中形狀的總數(shù)
'處理幻燈片中除占位符外其他形狀中的文本格式(主要是普通文本框)
For j = m + 1 To k
If MyDocument.Shapes(j).Type = msoTextBox Then
'下面是對(duì)形狀中文本的段落格式進(jìn)行處理
With MyDocument.Shapes(j).TextFrame.TextRange.ParagraphFormat
.Alignment = ppAlignLeft
.LineRuleWithin = msoTrue
.SpaceWithin = 1.25
.LineRuleBefore = msoTrue
.SpaceBefore = 0.2
.LineRuleAfter = msoFalse
.SpaceAfter = 0
End With
'設(shè)置形狀的大小為容納其邊界內(nèi)的文本而自動(dòng)更改。
MyDocument.Shapes(j).TextFrame.AutoSize = ppAutoSizeShapeToFitText
'下面是對(duì)形狀中文本的首行縮進(jìn)和左縮進(jìn)進(jìn)行處理
With MyDocument.Shapes(j).TextFrame.Ruler.Levels(1)
.FirstMargin = 0
.LeftMargin = 0
End With
'下面是對(duì)形狀中文本的字體格式進(jìn)行處理
With MyDocument.Shapes(j).TextFrame.TextRange.Font
.NameAscii = \"宋體\"
.NameOther = \"宋體\"
.NameFarEast = \"宋體\"
.Bold = True
.Size = 24
End With
End If
Next j
Next i
End Sub
Sub NoTitle(n1 As Integer, n2 As Integer)'專門處理非標(biāo)題占位符中的文本格式子過(guò)程
Dim j As Integer
For j = n1 To n2
'下面是對(duì)占位符中文本的段落格式進(jìn)行處理
With MyDocument.Shapes.Placeholders(j).TextFrame.TextRange.ParagraphFormat
.Alignment = ppAlignLeft
.LineRuleWithin = msoTrue
.SpaceWithin = 1.25
.LineRuleBefore = msoTrue
.SpaceBefore = 0.2
.LineRuleAfter = msoFalse
.SpaceAfter = 0
End With
'設(shè)置占位符的大小為容納其邊界內(nèi)的文本而自動(dòng)更改。
MyDocument.Shapes.Placeholders(j).TextFrame.AutoSize = ppAutoSizeShapeToFitText
'下面是對(duì)占位符中文本的首行縮進(jìn)和左縮進(jìn)進(jìn)行處理
With MyDocument.Shapes.Placeholders(j).TextFrame.Ruler.Levels(1)
.FirstMargin = 0
.LeftMargin = 0
End With
'下面是對(duì)占位符中文本的字體格式進(jìn)行處理
With MyDocument.Shapes.Placeholders(j).TextFrame.TextRange.Font
.NameAscii = \"宋體\"
.NameOther = \"宋體\"
.NameFarEast = \"宋體\"
.Bold = True
If Mydocument.Shapes.Placeholders(j).PlaceholderFormat.Type _= ppPlaceholderSubtitle Then
.Size = 32 '如果是標(biāo)題版式幻燈片中的子標(biāo)題
Else
.Size = 28
End If
End With
Next j
End Sub
4 總結(jié)
在Microsoft Office套件中使用VBA編程,其關(guān)健在于理解Office應(yīng)用軟件中的對(duì)象和對(duì)象模型,以及一個(gè)對(duì)象在對(duì)象模型中的位置。只有弄清楚了對(duì)象模型,才能找到對(duì)象在對(duì)象模型中的位置,了解對(duì)象所具有的方法和屬性,并通過(guò)編程去調(diào)用對(duì)象的方法或修改對(duì)象的屬性,以達(dá)到應(yīng)用程序自動(dòng)化的目的。
參考文獻(xiàn):
[1] McFedries P.OFFICE 2000 VBA編程技術(shù)[M].北京:電子工業(yè)出版社,2002.
[2] 微軟公司.Office編程技術(shù)——理解對(duì)象模型[EB/OL].http://202.121.7.7/person/chenmy/jiaoyou/o01.html.