Office Space:撰寫 Microsoft Office 應用程式指令碼的秘訣

Office Space

歡迎蒞臨 Office Space 專欄,這裡提供處理 Microsoft® Office 應用程式指令碼的秘訣。每週二和週四我們將刊出新的秘訣,若要參閱以前討論過的秘訣,請造訪 Office Space Archive (Office Space 過往文件)。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

替 Microsoft Word 的段落加上框線

上週的其中一篇專欄中,我們介紹了如何替 Microsoft Excel 試算表的儲存格加上框線。有些讀者顯得失望,不怪您這麼想,「真希望學學怎麼替 Microsoft Word 的段落加上框線。既然已經有專欄介紹過怎麼加上框線,大概很久都不會再介紹這方面的主題了吧?」

這麼說好了,咱們 Scripting Guys 工作起來也是很認真的,但您應該很少聽到「Scripting Guys」、「下功夫」、「努力」這幾個字同時出現在句子裡 (除非是:「要 Scripting Guys 努力點是不是得花點功夫?」)。其實咱們是那種見好不收,欲罷不能型的。第一篇 Scriptomatic 專欄成功嗎?太好了,再寫一篇。讀者喜歡第一週的 Scripting 專欄?那就來個連載好了。既然已經寫了一篇介紹加框線的文章,何不再寫一篇,所以這次就介紹 Microsoft Word:


Const wdLineStyleSingle = 1
Const wdLineStyleNone = 0

Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection

i = 1

objDoc.Paragraphs(i).Range.Select
objSelection.ParagraphFormat.Borders.OutsideLineStyle = wdLineStyleSingle
objSelection.ParagraphFormat.Borders.Shadow = TRUE
objSelection.TypeText "This is the first paragraph."
objSelection.TypeParagraph()
i = i + 1

objDoc.Paragraphs(i).Range.Select
objSelection.ParagraphFormat.Borders.OutsideLineStyle = wdLineStyleNone
objSelection.TypeText "This is the second paragraph."
objSelection.TypeParagraph()
i = i + 1

objSelection.TypeText "This is the third paragraph."
objSelection.TypeParagraph()
i = i + 1


這個指令碼在講什麼呢?剛開始是定義 wdLineStyleSingle 和 wdLineStyleNone 這一組常數,稍後會用來指定要使用哪種框線包圍住段落。接著建立 Word.Application 物件的執行個體,將 Visible 屬性設為 True。使用 Add 方法建立新文件,然後使用同一行指令建立 Word Selection 物件的執行個體:


Set objSelection = objWord.Selection


您想得沒錯,這比我們一般執行的動作還要複雜。這麼多行指令碼不過只建立一個空白的 Word 文件,我們還得建立幾個段落和加上框線。

咱們來想個辦法。一開始先把 1 這個值指定給計數器變數 i,我們要用這個變數追蹤段落編號。要給段落加框線,首先得選擇該段落,只要參考 Paragraphs 集合中的段落編號即刻達到這個目的。跟您預期的一樣,文件中第一段的段落編號是 1,第二段是 2,依此類推。每次建立新的段落就為 i 加 1,以便追蹤要加框的段落編號。

要選取特定段落,可以使用如下程式碼:


objDoc.Paragraphs(i).Range.Select


目前 i 等於 1,所以選取的當然是文件的第一段。

段落選取後,就可以開始設定框線屬性。除非另外指定 (稍後會討論),框線會在整個段落外形成一個外框。我們使用下面這行程式碼來指定單行外框,告訴指令碼怎麼設定 OutsideLineStyle 屬性:


objSelection.ParagraphFormat.Borders.OutsideLineStyle = wdLineStyleSingle


沒錯,這是我們在指令碼一開頭就定義的常數。wdLineStyleSingle 常數 (值為 1) 可以添加最簡單的直線。萬一我們想用不同的線條樣式,可以使用下表所示的常數 (和值):

常數

wdLineStyleDashDot

5

wdLineStyleDashDotDot

6

wdLineStyleDashDotStroked

20

wdLineStyleDashLargeGap

4

wdLineStyleDashSmallGap

3

wdLineStyleDot

2

wdLineStyleDouble

7

wdLineStyleDoubleWavy

19

wdLineStyleEmboss3D

21

wdLineStyleEngrave3D

22

wdLineStyleInset

24

wdLineStyleNone

0

wdLineStyleOutset

23

wdLineStyleSingle

1

wdLineStyleSingleWavy

18

wdLineStyleThickThinLargeGap

16

wdLineStyleThickThinMedGap

13

wdLineStyleThickThinSmallGap

10

wdLineStyleThinThickLargeGap

15

wdLineStyleThinThickMedGap

12

wdLineStyleThinThickSmallGap

9

wdLineStyleThinThickThinLargeGap

17

wdLineStyleThinThickThinMedGap

14

wdLineStyleThinThickThinSmallGap

11

wdLineStyleTriple

8


既然玩了,就玩得徹底些,我們把 Shadow 屬性設為 True。結果就跟各位預期的一樣,段落外出現漂亮的陰影方塊。

注意:順便一提,每個外框線屬性都有個對應的內框線:除了有 OutsideLineStyle 外,還有個對應的 InsideLineStyle 屬性。


接下來只要使用 TypeText 方法輸入一些文字,再使用 TypeParagraph 方法模擬按下 ENTER 鍵的結果 (代表第一個段落結束) 即可。結果文件看起來像這樣:

Microsoft Word


接著為 i 變數加 1 (納悶嗎?這是因為我們要處理第 2 段了)。根據預設,Word 中的段落會繼承前一段落的格式。但我們不想在第二段加上框線,所以要選取第二段並使用下面這行程式碼將線條樣式設定為 None,這樣段落就沒有框線:


objSelection.ParagraphFormat.Borders.OutsideLineStyle = wdLineStyleNone


接著在文件中多輸入一些文字,然後執行指令碼,產生的文件變成:

Microsoft Word


如果各位還覺得不夠酷,這裡還有更妙的。

沒錯,還有更多屬性可以設定用來建立各種框線。例如 OutsideLineWidth 屬性可以用來指定框線粗細:

常數

wdLineWidth025pt

2

wdLineWidth050pt

4

wdLineWidth075pt

6

wdLineWidth100pt

8

wdLineWidth150pt

12

wdLineWidth225pt

18

wdLineWidth300pt

24

wdLineWidth450pt

36

wdLineWidth600pt

48


OutsideLineColorIndex 屬性則是用來替段落加彩色框線:

屬性

wdAuto

0

wdBlack

1

wdBlue

2

wdBrightGreen

4

wdByAuthor

-1

wdDarkBlue

9

wdDarkRed

13

wdDarkYellow

14

wdGray25

16

wdGray50

15

wdGreen

11

wdNoHighlight

0

wdPink

5

wdRed

6

wdTeal

10

wdTurquoise

3

wdViolet

12

wdWhite

8

wdYellow

7


想必各位已經等不及看看這些屬性造成的特效。下面改寫的屬性會在第一段添加鮮綠色的粗框線:


Const wdLineStyleSingle = 1
Const wdLineStyleNone = 0
Const wdBrightGreen = 4
Const wdLineWidth300pt = 24

Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection

i = 1

objSelection.ParagraphFormat.Borders.OutsideLineStyle = wdLineStyleSingle
objSelection.ParagraphFormat.Borders.OutsideLineWidth = wdLineWidth300pt
objSelection.ParagraphFormat.Borders.OutsideColorIndex = wdBrightGreen
objSelection.TypeText "This is the first paragraph."
objSelection.TypeParagraph()
i = i + 1

objDoc.Paragraphs(i).Range.Select
objSelection.ParagraphFormat.Borders.OutsideLineStyle = wdLineStyleNone
objSelection.TypeText "This is the second paragraph."
objSelection.TypeParagraph()
i = i + 1

objSelection.TypeText "This is the third paragraph."
objSelection.TypeParagraph()
i = i + 1


跑過指令碼後,結果是:

Microsoft Word


問得好,《Office Space》專欄推出前我們就玩得這麼開心了嗎?

最後一提 (因為前面已經答應過啦),給段落加框線的方式不只一種。只要您喜歡,可以在段落的上、下、左、右隨便哪個位置 (或隨便哪種組合) 加框線。方法是在指令碼中使用下列一 (或多) 個常數:

常數

wdBorderBottom

-3

wdBorderLeft

-2

wdBorderRight

-4

wdBorderTop

-1


這些常數會用在哪裡呢?您需要定義其中一個常數,然後使用 IF 指定要設定哪個框線。例如,要為段落單單添加上邊框,可以使用這段程式碼:


objSelection.ParagraphFormat.Borders(wdBorderTop).LineStyle = wdLineStyleSingle


注意:設定單邊框線時,要用 LineStyleLineWidth 等屬性,而不是 OutsideLineStyleInsideLineWidth


比如這個指令碼可以在文件第一段上面加上一條鮮綠色的框線:


Const wdLineStyleSingle = 1
Const wdLineStyleNone = 0
Const wdBrightGreen = 4
Const wdLineWidth300pt = 24
Const wdBorderTop = -1

Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection

i = 1

objSelection.ParagraphFormat.Borders(wdBorderTop).LineStyle = wdLineStyleSingle
objSelection.ParagraphFormat.Borders(wdBorderTop).LineWidth = wdLineWidth300pt
objSelection.ParagraphFormat.Borders(wdBorderTop).ColorIndex = wdBrightGreen
objSelection.TypeText "This is the first paragraph."
objSelection.TypeParagraph()
i = i + 1

objDoc.Paragraphs(i).Range.Select
objSelection.ParagraphFormat.Borders.OutsideLineStyle = wdLineStyleNone
objSelection.TypeText "This is the second paragraph."
objSelection.TypeParagraph()
i = i + 1

objSelection.TypeText "This is the third paragraph."
objSelection.TypeParagraph()
i = i + 1


成品如下:

Microsoft Word


不賴吧?敬請期待下一篇有關加框的專欄 (如果我們想得出來還有什麼可以加框的)。

顯示: