編寫 Microsoft Office 指令碼簡介:Excel 與 Word

作者: Microsoft Scripting Guy

指碼街

歡迎來到「指碼街」,這是專為指令碼初學者所寫的專欄。本篇專欄的目標是要教導您如何編寫系統管理自動化的最基本 Windows 指令碼。我們將提供您所需的資訊,幫助您開始閱讀和瞭 解指令碼並配合個人的需求著手修改這些指令碼。如果您特別對編寫指令碼有任何不清楚的地方,請告訴我們;也許有人和您一樣不清楚。

查看指碼街封存來參閱過去的文章。

下載所有的「指碼街」專欄 (英文) 中易於閱讀、且可全面搜尋的 .chm 檔案(從第一個專欄到 2007 年 6 月份版本)。


本页内容

角落辦公室
編寫 Microsoft Excel 指令碼
編寫 Microsoft Word 指令碼
詳細資訊
空的辦公室


角落辦公室

角落辦公室通常代表身分地位與尊重。如果您想知道 Scripting Guy 在 Microsoft 的地位,那我這樣說好了:Scripting Guy Greg Stemp 最近走進他的辦公室時,發現裡面堆積著各種舊 設備,因為有人誤以為他的辦公室是個小儲藏室。

雖然您可能不像 Greg 一樣在儲藏室般的小隔間裡工作,但如果您只是一般的系統管理員,在公司可能也不會擁有豪華辦公室。這是否意味著,比起擁有豪華辦公室的執行長 (CEO),您對組織比較 不重要?嗯,沒錯。不過,那不是重點。重點是您有自己的辦公室,或至少有一個小隔間、或是有一張辦公桌、或是有辦公桌的一部分…

說到辦公室,您上次仔細研究可以使用 Microsoft Office 來完成某樣事情是什麼時候?當然,您可以外掛一些方程式到 Excel 中、在 Word 中編寫報告、用 Outlook 傳送電子郵件。但是身 為一位對編寫程式碼有點瞭解的系統管理員,如果您從未利用 Office 的指令碼編寫功能,那也難怪您會坐在小隔間,而不是坐在角落辦公室裡。

喔,等等,雖然 Greg 有使用 Microsoft Office 的指令碼編寫功能,但他還是在小隔間中工作。好吧,忘記這個理論。不過重點是,沒錯我們還是要試著強調:您真的應該好好瞭解各種 Office 產品的指令碼編寫功能。它們的功能真的很廣泛,而且真的能協助身為系統管理員的您。別忘了這點,接著我們將在本文的其餘各篇介紹編寫 Excel 與 Word 指令碼的基本概念。為什麼只介紹 Excel 與 Word? 原因很多,因為 Excel 與 Word 是系統管理員最常使用的應用程式,而且其指令碼編寫概念類似。其他例如 Access 與 Outlook 等 Office 產品也有相當健全的指令碼編寫功能,但是我們將於改天再介紹。

編寫 Microsoft Excel 指令碼

我們將從 Excel 開始介紹,因為它可能會是您最常使用的產品。您可以使用 Excel 來執行的工作,例如將詳細說明伺服器功能的報告整合在一起、追蹤使用者資訊以及從試算表中將資訊加入 Active Directory 等等,這裡只舉一些例子。但似乎有無限可能,就像 Greg 辦公室裡可以容納的箱子數目一樣。

Excel 實際上是由數個部分所組成。例如,Excel 本身就像是把所有東西都裝在一起的殼層:

Ee176994.microsoftExcel1(zh-tw,TechNet.10).jpg


在殼層中有活頁簿 (實際上是儲存為 .xls 或 xlsx 檔案),而且在活頁簿中有不同的工作表:

Ee176994.workbookseparateworksheets(zh-tw,TechNet.10).jpg


為了能使用指令碼來操作 Excel,您必須使用每一個部分。以下簡單的指令碼可開啟沒有任何活頁簿的 Excel:


Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True 

您試過了嗎?如果有,應該會發現它好像沒什麼用,對吧?如果您有仔細注意,可能會看到螢幕上有某個東西快速閃過,然後又消失。那是 Excel。在這個指令碼中,我們呼叫 CreateObject 方法來建立 Excel 的執行個體,將我們要建立的物件名稱傳遞給它。在此案例中,因為我們要建立 Excel 的執行個體,所以我們傳遞 Excel.Application 物件。 我們想要查看我們的 Excel 執行個體,所以我們將 Visible 屬性設定為 True,讓它顯示在螢幕上。此時指令碼會結束,Excel 也會結束。

到目前為止都不太有用,對吧?而且空的 Excel 執行個體也不太有用。這也就是為什麼為了讓 Excel 保持開啟,我們需要開啟活頁簿或是建立新的活頁簿。讓我們從開啟現有的活頁簿 C:\Scripts\Test.xls 開始:


Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

objExcel.Workbooks.Open("C:\Scripts\Test.xls")

如果我們要開啟活頁簿,就必須存取 Excel 物件模型的下一個部分,即活頁簿。我們是透過 Excel 物件的 Workbooks 集合來存取。 接著呼叫活頁簿的 Open 方法,傳遞要開啟的 Excel 檔案名稱與路徑給它。

您就會看到開啟的 Excel 活頁簿:

Ee176994.Excelworkbook(zh-tw,TechNet.10).jpg


現在我們來建立新的活頁簿:


Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

objExcel.Workbooks.Add

在此再次使用 Workbooks 集合,這次會呼叫 Add 方法。我們不需要傳遞任何參數,只要新增空的活頁簿即可。(若有需要,可以傳遞範本名稱,這樣就可以使用特定的 Excel 範本來開啟活頁簿。)不用直接新增任何工作表, 因為 Excel 會自動執行:

Ee176994.NewExcelworkbook(zh-tw,TechNet.10).jpg


現在假設我們要將一些資訊新增至活頁簿。Open 與 Add 方法最棒的功能就是會將物件參照傳回活頁簿。這可讓我們存取活頁簿,因此也可讓我們存取活頁簿中的工作表。例如,假設我們想要建立新活頁簿,並將值新增至該活頁簿第一 個工作表的第一個儲存格中。以下是我們完成這個動作的方法:


Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

Set objWorkbook = objExcel.Workbooks.Add
Set objWorksheet = objWorkbook.Worksheets(1)

objWorksheet.Cells(1, 1) = "100"

在建立 Excel 物件並讓 Excel 在螢幕上顯示之後,就新增活頁簿。請注意,這次是將物件參照儲存在 objWorkbook 變數中的活頁簿內。接著使用該活頁簿的 Worksheets 屬性來取得活頁簿第一個工作表的參照。 我們知道所存取的是第一個工作表,因為是傳遞值 1 到 Worksheets 屬性。如果傳遞的值是 2,則是參照第二個工作表。也可能會傳遞工作表的名稱,就像這樣:


Set objWorksheet = objWorkbook.Worksheets("Sheet1")

既然有工作表的存取權,就可以使用 Cells 屬性來將值指派給特定的儲存格:


objWorksheet.Cells(1, 1) = "100"

在此已經指派值 100 給第 1 列和第 1 欄中的儲存格 (也就是所謂的 1,1)。既然我們已將新值指派給工作表,就應該立即儲存活頁簿:


objWorkbook.SaveAs("C:\Scripts\Test.xls")

在此我們所執行的動作是呼叫活頁簿的 SaveAs 方法,將要儲存活頁簿的檔名傳遞給它。將此行新增至指令碼的結尾以儲存檔案至 C:\Scripts\Test.xls (在此案例中)。

使用 Excel 時必須注意一件很重要的事情。讓我們看看如果遺漏這一行會發生什麼情況:


objExcel.Visible = True

根據預設,Visible 屬性是 False。當在您想在螢幕上不顯示任何內容的情況下執行指令碼時,這可能會很有用。不過,如果您這樣做,就務必呼叫 Quit 方法來關閉 Excel:


objExcel.Quit

如果您未這麼做,則指令碼完成時,Excel 將繼續在背景執行。如果您執行指令碼數次,則每次執行指令碼時都會執行一個 Excel 執行個體。

額外提示:如果您對 Excel 活頁簿進行變更並呼叫 Quit 方法,將會在關閉之前提示您儲存活頁簿。如果您不想要在呼叫 Quit 時顯示任何提示,請直接將 DisplayAlerts 屬性設定為 False,就像這樣:


objExcel.DisplayAlerts = False

這樣就還不錯了,對吧?既然您瞭解了 Excel 的基本概念,那麼其餘的 Office 產品就顯得簡單多了。繼續閱讀…

編寫 Microsoft Word 指令碼

就 Excel 有很多部分的角度來看,Word 與 Excel 的運作方式很像。有 Word 本身,然後在 Word 中有文件。在文件中有頁首與頁尾以及各種其他元素,但是在本文中將暫不討論它們。讓我們從開啟 Word 開始:


Set objWord = CreateObject("Word.Application")
objWord.Visible = True

就像使用 Excel 所執行的動作一樣,我們呼叫 CreateObject 方法,這次是建立 Word.Application 物件。接著將 Visible 屬性設定為 True,這樣就可以在螢幕上看到 Word。如果您執行這個指令碼,就會發現 Excel 應用程式與 建立 Word 應用程式之間有很明顯的差別:Excel 會在螢幕上閃過並立即關閉,但是 Word 仍然還在。執行這個指令碼,就會在螢幕上顯示開啟的 Word 執行個體。這似乎比 Excel 版本好一些,因為您至少可以確定已執行了某些動作。

現在我們來開啟現有的文件:


Set objWord = CreateObject("Word.Application")
objWord.Visible = True

objWord.Documents.Open("C:\Scripts\Test.doc")

開啟 Word 文件的方式是呼叫 Documents 集合的 Open 方法 (很合邏輯吧!)。我們直接將要開啟的文件路徑與檔案名稱傳遞給 Open 方法, 這樣就完成囉!您是否要建立新文件?那還不簡單:


Set objWord = CreateObject("Word.Application")
objWord.Visible = True

objWord.Documents.Add

呼叫 Add 方法會將空白文件新增至 Word 執行個體。如果您有需要的話,有幾個參數可以傳遞到 Add 方法:

  • Template – 您要文件使用的範本名稱。

  • NewTemplate – 如果您是使用文件來建立範本,請將此參數設定為 True。預設值是 False。

  • DocumentType – 用以指定您要建立的文件類型常數。

  • Visible – 將此參數設定為 False 以隱藏文件。請注意,這與我們之前設定的 Visible 屬性不同。我們教您的第一個 Visible 屬性可以決定 Word 是否出現在螢幕上,而且預設值是 False (也就是,不要讓 Word 顯示在螢幕上)。 Add 方法的 Visible 參數預設值是 True,這表示您建立的文件將會顯示在 Word 文件中。但是請試試看這個:

    
    objWord.Documents.Add ,,,False
    

這裡我們已將 Visible 參數設定為 False。如果您執行含有此行的指令碼,將會看到已開啟的 Word 執行個體,但即使已有開啟文件,也不會看到任何開啟的文件。

現在我們來新增一些文字到 Word 文件:


Set objWord = CreateObject("Word.Application")
objWord.Visible = True

Set objDoc = objWord.Documents.Add

Set objSelection = objWord.Selection

objSelection.TypeText "Here is some text in a Word document."

我們再次建立一個 Word 執行個體,並讓它顯示出來。接下來新增一份文件,這次將該文件的物件參照指派到變數 objDoc。現在我們可以開始將文字新增至文件。第一件要做的事就是建 立 Selection 物件:


Set objSelection = objWord.Selection

當您開啟 Word 並查看文件時,在開始鍵入時會知道文字將出現的位置;這是因為您可以看到螢幕上的選取游標正在閃爍。選取物件基本上就是您的閃爍游標,它提供您在文件中將輸入文字的位置參考。根據預設, 閃爍游標的位置永遠是文件的開頭。這表示我們可以使用 objSelection 物件在文件開頭開始鍵入一些文字:


objSelection.TypeText "Here is some text in a Word document."

我們呼叫 TypeText 方法來執行實際的「鍵入」,並將文件中想要的文字傳遞給它。

如果您要儲存文件,請直接將這一行附加到指令碼的結尾:


objDoc.SaveAs "C:\Scripts\Test.doc"

看吧,我們已告訴過您對 Document 物件 (objDoc) 的參照將會很有用。我們已經使用 Document 物件的 SaveAs 方法來儲存文件,以要儲存文件的檔名之參數來傳遞。

詳細資訊

指令碼中心有許多關於編寫 Office 產品指令碼的資訊。您可參閱這些特定章節:

空的辦公室

我們希望有一天可以提供有關編寫 Access 與 Outlook 指令碼的初學者指南,但是還要看情況。我們計劃先清掉 Greg 辦公室裡的垃圾,不過因為他的辦公室中全部都是垃圾,所以那裡以後會看起來像個空的辦公室。但這樣可能會把事情搞大。因為如果有人看到辦公室這麼空 ,可能會想要讓其他人搬進去,不像儲藏室至少還可以避免其他人干擾。

顯示: