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

Office Space

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

擷取可用字型的格式化清單

現在的小孩真是幸福,想當年 Scripting Guy 年輕的時候,每天上學不僅要在雪裡走 20 哩遠的路,到了學校也只有一種字型可以用,更慘的是,能用的唯一字型是 Courier!

是呀,我們知道,很難相信人能夠在這麼簡陋的生活條件下存活下來。

當然啦,現在情況大不相同了,如今的電腦都預裝有一大堆字型,從 Arial 到 Times New Roman,甚至到造型可愛的 Wingdings,應有盡有。棒歸棒,倒也引起了一些新的難題:要怎麼分辨電腦上裝了哪些字型,還有,要怎麼知道這些字型長什麼樣呢?(說老實話,大多數人根本不會辨別 Estrangelo Edessa 和 Eurostile™ Extended Two,至少要看了才知道)。

當然您是可以使用德高望重又歷史悠久的 Charmap.exe 或是 [控制台] 內的 [字型] 項目來查看電腦上可用的字型,如果您不介意一次看一種字型,這兩種公用程式倒是蠻好用的:

字元對應


當然,要是有一份包含所有字型的格式化清單,一份可以列印出來,偶爾查閱的參考表,該有多好呢?有一點我們可以確定的是,這 Charmap.exe 或是 [控制台] 的 [字型] 就一點也幫不上忙了。不過或許可以使用指令碼來建立像這樣的清單,或許… 不好意思,可能連指令碼也辦不到。看來我們是沒輒了。

等等,其實,您的確是可以寫一個指令碼,運用 Microsoft Word 來建立這類的參考表。哇,真神奇,您是怎麼知道的呢?

對喔,今天的專欄標題已經洩漏了秘密。

不過沒關係:既然天機都已經洩漏,我們就來看看這個指令碼,它會擷取一組安裝在電腦上的字型集合,然後使用每種字型,鍵入這個句子:The quick brown fox jumps over the lazy dog。

指令碼如下:


On Error Resume Next

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

For Each strFont in objWord.FontNames
    If strFont <> "Courier" Then
        objSelection.Font.Name = strFont
        objSelection.TypeText strFont & _
            ": The quick brown fox jumps over the lazy dog."
        objSelection.TypeParagraph
    End If
Next


開始先建立 Microsoft Word (Word.Applcation) 的執行個體,並將 Visible 屬性設為 True,畢竟要是看不見這些字型,它們再花俏也沒用。我們使用 Add 方法來建立一份空白文件,再建立 Word Selection 物件的執行個體。最後將 Selection 物件的 Font.Size 屬性設為 14 點,然後準備行動。

結果 Word 物件模型有個屬性 (FontNames),會傳回可用字型的集合,只要建立 For Each 迴圈來循環處理該集合就可以了。每循環一次迴圈,都會抓取不同的字型名稱,像是 Arial、New York、Rockwell Condensed,並且會將名稱儲存在 strFont 變數中。接著就使用這行指令碼將目前的字型變更為 strFont 所代表的字型:


objSelection.Font.Name = strFont


適當設定好字型之後,接著就可以使用這兩行程式碼鍵入字型的名稱,隨後加上範例句 (The quick brown fox jumps over the lazy dog.),最後再加個換行鍵:


objSelection.TypeText strFont & _
    ": The quick brown fox jumps over the lazy dog."
objSelection.TypeParagraph


都了解了嗎?我們使用 TypeText 方法將指定的文字鍵入文件中,並使用 TyepParagraph 方法在句子結尾加入換行鍵 (作用跟按下鍵盤上的 ENTER 鍵一樣)。

這個過程會一直到我們將每種可用字型的句子都列印出來之後,才會停止。所產生的 Word 文件看起來像這樣:

字元對應


怎麼這麼巧,我們也是張大嘴巴直喊「哇」!

總而言之,一切都很順利,現在有份文件不但會告訴我們電腦上安裝的每種字型名稱,還顯示出每種字型的樣子。不過,我們倒是碰到一件怪事,看看 For Each 迴圈就會注意到,我們檢查看字型名稱是不是 Courier,如果是,就列印範例句,而繞到下一個字型:


For Each strFont in objWord.FontNames
    If StrFont <> "Courier" Then
        objSelection.Font.Name = strFont
        objSelection.TypeText strFont & _
            ": The quick brown fox jumps over the lazy dog."
        objSelection.TypeParagraph
    End If
Next


怎麼會這樣?說實話,我們也不知道。如果不忽略 Courier,指令碼會盡忠職守地以 Courier 字型列出範例句,但之後就會終止。什麼錯誤訊息也不會產生,指令碼就直接結束。要是修改指令碼來避免以 Courier 字型列出,結果就跟您想的一樣,會得到全部字型。我們不確定這是錯誤還是功能,也不確定這問題是出在 Word 還是我們的測試電腦,得再仔細研究 (這個在 Windows XP Service Pack 1 上發現的問題,似乎已經在 Windows XP Service Pack 2 中解決)。如果您急想知道 Courier 長什麼樣子,可以依下修改 For Each 迴圈,看看行不行得通:


For Each strFont in objWord.FontNames
    objSelection.Font.Name = strFont
    objSelection.TypeText strFont & _
        ": The quick brown fox jumps over the lazy dog."
    objSelection.TypeParagraph
Next


之前說過,我們這些老人會仔細研究這個問題,不過先讓我們休息片刻,追憶一下那段 MTV 還播放音樂錄影帶的美好時光 (沒騙您,我們發誓,這不是捏造的)。

顯示: