Office 2010 的 VBA 快速入門

**摘要:**向非程式設計人員介紹使用 Visual Basic for Applications (VBA) 程式設計擴充 Microsoft Office 2010 的一些基本方式,包括 VBA 語言概觀、一些重要詳細資訊關於如何在不同的 Office 2010 應用程式中存取 VBA、簡單的程式設計範例,以及一些範例應用程式 (13 頁列印頁面)。

前次修改時間: 2015年4月24日

適用於: Access 2010 | Excel 2010 | Office 2007 | Office 2010 | Open XML | PowerPoint 2010 | Publisher 2010 | SharePoint Server 2010 | VBA | Word 2010

本文內容
Office 2010 的 VBA 程式設計
何時使用 VBA 及使用原因
VBA 程式設計 101
程式設計秘訣與技巧
進階程式設計
我的所有 Office 2010 應用程式:範例程式碼
摘要
其他資源

Applies to: Microsoft Word 2010 | Microsoft Outlook 2010 | Microsoft Access 2010 | Microsoft Excel 2010 | Microsoft PowerPoint 2010 | Microsoft Publisher 2010

**發行日期:**2009 年 11 月

**提供者:**Tim Burnett,Kingfisher Computer Consulting

內容

  • Applies to: Microsoft Word 2010 | Microsoft Outlook 2010 | Microsoft Access 2010 | Microsoft Excel 2010 | Microsoft PowerPoint 2010 | Microsoft Publisher 2010發行日期:2009 年 11 月提供者:Tim Burnett,Kingfisher Computer Consulting內容簡介Office 2010 的 VBA 程式設計何時使用 VBA 及使用原因VBA 程式設計 101程式設計秘訣與技巧進階程式設計我的所有 Office 2010 應用程式:範例程式碼摘要其他資源

  • Office 2010 的 VBA 程式設計

  • 何時使用 VBA 及使用原因

  • VBA 程式設計 101

  • 程式設計秘訣與技巧

  • 進階程式設計

  • 我的所有 Office 2010 應用程式:範例程式碼

  • 摘要

  • 其他資源

Office 2010 的 VBA 程式設計

您是否面臨需要在 Word 2010 中重複清除五十個表格?您是否希望特定文件在開啟時,提示使用者進行輸入?您是否在考量如何有效率地將連絡人從 Microsoft Outlook 2010 移至 Microsoft Excel 2010 試算表方面有困難?

您可以使用 Office 2010 的 VBA 來執行這些工作,並完成其他許多工作;Office 2010 的 VBA 是簡單但強大的程式設計語言讓您可以用來擴充 Office 2010 應用程式。

本文適用於曾經使用過 Office 的使用者,這些使用者可能想了解 VBA,或想進一步了解程式設計可以如何協助他們自訂 Office 2010。

Office 2010 應用程式套件具有一組豐富的功能。您可以透過許多不同的方式來製作、格式化及操作文件、電子郵件、資料庫、表單、試算表和簡報。Office 2010 的 VBA 程式設計之最大功能,在於您可以使用滑鼠、鍵盤或對話方塊執行的所有作業,幾乎也都可以透過 VBA 來完成。此外,透過 VBA 完成一次的作業,便可輕易完成數百次 (事實上,自動化重複的工作是 Office 的 VBA 最常見的用法)。

除了撰寫 VBA 指令碼以加速日常工作的功能之外,您還可以使用 VBA 新增功能至 Office 2010 應用程式,或以符合您業務需求的特定方式來提示文件使用者並與其互動。例如,您可以撰寫一些顯示快顯訊息的 VBA 程式碼,以提醒使用者在第一次嘗試儲存文件時,將文件儲存至特定網路磁碟機。

本文首先會探索利用 VBA 程式設計功能的其中一些主要原因;接著會探索您可以搭配解決方案使用的 VBA 語言及現成工具;最後會包含一些秘訣,以及避免一些常見程式設計挫折和失策的作法。

何時使用 VBA 及使用原因

有三個主要原因會讓您考慮使用 Office 2010 的 VBA 程式設計。

自動化及重複

VBA 可有效率地重複解決格式化或更正問題。例如,您是否曾經在 Word 中變更每頁頂端的段落樣式?您是否曾經必須重新格式化從 Excel 貼到 Word 文件或 Outlook 電子郵件中的多個表格?您是否曾經必須在多個 Outlook 連絡人中進行相同的變更?

如果您有一個變更必須重複十次或二十次以上,最好使用 VBA 加以自動化。如果您必須進行相同的變更數百次,則理所當然值得考慮。幾乎任何可以手動執行的格式化或編輯變更,都可以在 VBA 中完成。

使用者互動的擴充功能

您有時需要鼓勵或強制使用者,以不屬於標準應用程式一部分的特定方式與 Office 2010 應用程式或文件互動。例如,您可能需要提示使用者在開啟、儲存或列印文件時,採取某些特定的動作。

Office 2010 應用程式之間的整合

您是否需要將 Outlook 2010 中的所有連絡人複製到 Word 2010,然後以特定方式進行格式化?或者,您是否需要將 Excel 2010 中的資料移至一組 PowerPoint 2010 投影片?有時,簡單的複製及貼上並無法完成您想要的作業,或者速度太慢。您可以使用 VBA 程式設計,同時與兩個或兩個以上的 Office 2010 應用程式之詳細資料互動,然後根據其中一個應用程式中的內容,來修改另一個應用程式中的內容。

另闢新徑

VBA 程式設計雖然是強大的解決方案,但不一定是最佳的方法,有時會比較適合使用其他方式來達成您的目標。

重要的問題在於是否有比較容易的作法。在您開始 VBA 專案之前,請先考慮內建工具和標準功能。例如,如果您有一個耗時的編輯或版面配置工作,請考慮使用樣式或快速鍵來解決問題。您是否可以執行工作一次,然後使用 CTRL+Y (重做) 重複此工作?您是否可以使用正確的格式或範本建立新文件,然後將內容複製到新文件?

Office 2010 應用程式很強大;您需要的解決方案可能早已內建其中。花一點時間深入了解 Office 2010,再開始進行程式設計。

在您開始 VBA 專案之前,請確定您有時間使用 VBA。程式設計需要全神貫注且無法預測。特別是初學者,除非您有時間可以謹慎工作,否則切勿轉向程式設計。當期限逼近時,您可能會嘗試「急用的指令碼」來解決問題,而導致壓力很大的情況。因此,如果您沒有時間,可以使用傳統方法,即使這些方法很單調重複。

VBA 程式設計 101

使用程式碼讓應用程式工作

您可能認為撰寫程式碼充滿迷團或很困難,但是基本原則使用日常推理且相當容易理解。Office 2010 應用程式的建立方式是公開可以接收指令、稱為「物件」的項目,其方式如同電話設計成具有按鍵,讓您可以用來與電話互動。當您按一個按鍵時,電話會辨識指令,然後依您撥號的順序來包含對應的號碼。在程式設計中,您會透過將指令傳送給應用程式中的各種「物件」,來與應用程式互動。這些物件可擴充,但有其限制。它們只能執行本身所設計好的功能,且只會執行您指示的工作。

例如,假設使用者在 Word 2010 中開啟文件、進行一些變更、儲存文件,然後關閉文件。在 VBA 程式設計的世界裡,Word 2010 會公開「文件」物件。透過 VBA 程式碼,您可以指示 Document 物件執行 [開啟舊檔]、[儲存] 或 [關閉] 等動作。

下一節將討論如何組織及描述物件。

物件模型

開發人員可以將程式設計物件組織成階層,該階層稱為應用程式的「物件模型」。例如,Word 具有包含 Document 物件的頂層 Application 物件。Document 物件包含 Paragraph 物件等。物件模型會大致鏡像您在使用者介面中看到的內容,是應用程式及其功能的概念圖。

物件的定義稱為「類別」,因此您可能會看到這兩個字詞交換使用。技術上而言,類別是用來建立或「具現化」物件的描述或範本。

一旦存在物件,您可以透過設定其「屬性」及呼叫其「方法」來進行操作。如果您將物件當做名詞,則屬性是描述名詞的形容詞,而方法是讓名詞動作的動詞。變更屬性會變更物件的某些外觀特質或行為。呼叫其中一個物件方法會使物件執行特定動作。

本文中的 VBA 程式碼會在開啟的 Office 2010 應用程式中執行,其中許多程式碼操作的物件已啟動並執行中;例如,Application 本身、Excel 2010 中的 Worksheet、Word 2010 中的 Document、PowerPoint 2010 中的 Presentation、Outlook 2010 中的 Explorer 和 Folder 物件。一旦您了解物件模型的基本配置,以及提供其目前狀態存取權之 Application 的一些主要屬性,即可透過 Office 的 VBA 開始擴充及操作 Office 2010 應用程式。

方法

例如,在 Word 中,您可以變更屬性,並使用 Application 物件的 ActiveDocument 屬性來呼叫目前 Word 文件的方法。此 ActiveDocument 屬性會傳回 Word 應用程式中目前使用中的 Document 物件參照。「傳回參照」表示「授與您存取權」

下列程式碼會依照其內容執行作業;換句話說,它會儲存應用程式中的使用中文件。

Application.ActiveDocument.Save

程式碼從左到右可讀成:「在此 Application 中,當 ActiveDocument 參照 Document 時,呼叫 Save 方法。」請注意,Save 是最簡單的一種方法;不需要您提供任何詳細的指示。您指示 Document 物件 Save,而不需要您輸入任何其他內容。

如果方法需要詳細資訊,這些詳細資訊稱為「參數」。下列程式碼執行 SaveAs 方法,該方法需要檔案的新名稱。

Application.ActiveDocument.SaveAs ("New Document Name.docx")

在方法名稱之後列於括弧中的值為參數。在本例中,檔案的新名稱是 SaveAs 方法的參數。

屬性

您可以使用相同的語法設定用來讀取屬性的屬性。下列程式碼執行方法,在 Excel 2010 中選取儲存格 A1,然後設定屬性將某些內容置於該儲存格。

    Application.ActiveSheet.Range("A1").Select
    Application.Selection.Value = "Hello World"

VBA 程式設計的首要挑戰,在於熟悉每個 Office 2010 應用程式的物件模型,以及讀取物件、方法和屬性語法。所有 Office 2010 應用程式的物件模型都很類似,但是每個物件模型各有其專屬的文件類型及操作的物件。

在程式碼片段的第一行中,具有 Application 物件,然後這次是 Excel 2010,再來是提供使用中工作表存取權的 ActiveSheet。在這之後是較不熟悉的名詞 Range,表示「以此方式定義儲存格範圍」。程式碼指示 Range 僅使用 A1 建立本身做為其定義的一組儲存格。換句話說,第一行程式碼定義物件、Range,然後執行方法加以選取。結果會自動儲存在 Application 的其他屬性 (稱為 Selection) 中。

程式碼的第二行將 Selection 的 Value 屬性設為文字 "Hello World",該值會顯示在儲存格 A1 中。

您撰寫的最簡單 VBA 程式碼,可能只是取得您在 Office 應用程式中所使用之物件的存取權,以及設定屬性。例如,您可以取得 Word 中的表格列,並在 VBA 指令碼中變更其格式。聽起來很簡單,但是卻很實用;撰寫該程式碼之後,您可以充分利用程式設計的所有功能,在多個表格或文件中進行相同的變更,或根據某些邏輯或條件來進行變更。對於電腦而言,進行 1000 次變更與進行 10 次變更並無不同,因此在處理較大型的文件和問題時能夠符合規模經濟的效益,這也是 VBA 可大放異彩並節省您時間的情況。

巨集與 Visual Basic 編輯器

現在您知道 Office 2010 應用程式如何公開其物件模型,您可能迫不急待想嘗試呼叫物件方法、設定物件屬性,以及回應物件事件。若要執行這些操作,您必須以 Office 可以了解的位置和方式來撰寫程式碼;一般而言是透過 Visual Basic 編輯器。雖然預設已安裝 Visual Basic 編輯器,但是許多使用者一直等到從功能區啟用之後,才知道這項工具的存在。

開啟開發人員索引標籤

所有 所有 Office 2010 應用程式都使用功能區。功能區上有一個索引標籤是 [開發人員] 索引標籤,可讓您存取 Visual Basic 編輯器和其他開發人員工具。因為依預設 Office 2010 不會顯示 [開發人員] 索引標籤,所以您必須使用下列程序來加以啟用:

啟用開發人員索引標籤

  1. 在 [檔案] 索引標籤上,選擇 [選項] 開啟 [選項] 對話方塊。

  2. 按一下對話方塊左側的 [自訂功能區]。

  3. 在對話方塊左側的 [由此選擇命令] 底下,選取 [常用命令]。

  4. 在對話方塊右側的 [自訂功能區] 下,選取下拉式清單方塊中的 [主要索引標籤],然後選取 [開發人員] 核取方塊。

  5. 按一下 [確定]。

注意

在 Office 2007 中,若要顯示 [開發人員] 索引標籤,請依序按一下 [Office] 按鈕及 [選項],然後在 [選項] 對話方塊的 [常用] 類別中,選取 [在功能區顯示 [開發人員] 索引標籤] 核取方塊。

啟用 [開發人員] 索引標籤之後,即可輕鬆尋找 [Visual Basic] 和 [巨集] 按鈕。

圖 1. [開發人員] 索引標籤上的按鈕

[開發人員] 索引標籤上的按鈕

安全性問題

為了保護 Office 2010 使用者不受病毒和危險巨集程式碼的攻擊,請勿將巨集程式碼儲存為使用標準副檔名的標準 Office 2010 文件,而是將程式碼儲存為使用特殊副檔名的檔案。例如,請勿將巨集儲存成副檔名為 .docx 的標準 Word 2010 文件;您必須改用副檔名為 .docm 之特殊 Word 2010 啟用巨集的文件。

當您開啟 .docm 檔案時,Office 2010 安全性可能仍會在通知或不通知您的情況下,防止文件中的巨集執行。請在所有 Office 2010 應用程式的 [信任中心] 中檢查設定和選項。預設設定會停止巨集執行,但是警告您已停用巨集,並讓您選擇是否要針對該文件重新啟用巨集。

您可以建立信任的位置、信任的文件或受信任的發行者,指定巨集可以執行的特定資料夾。最能移植的選項是使用受信任的發行者,受信任的發行者使用您散佈的數位簽署文件。如需特定 Office 2010 應用程式中之安全性設定的詳細資訊,請開啟 [選項] 對話方塊,然後依序按一下 [信任中心] 及 [信任中心設定]。

注意

某些 Office 2010 應用程式 (如 Outlook 2010) 預設會在本機電腦的主範本中儲存巨集。雖然該策略會在您執行自己的巨集時,降低您電腦上的本機安全性問題,但是如果您想散佈巨集,則需要部署策略。

錄製巨集

當您按一下 [開發人員] 索引標籤上的 [巨集] 按鈕時,即會開啟 [巨集] 對話方塊,提供您 VBA 副程式或巨集的存取權,讓您可以從特定文件或應用程式加以存取。[Visual Basic] 按鈕開啟 Visual Basic 編輯器,您可以在此建立及編輯 VBA 程式碼。

Word 2010 和 Excel 2010 之 [開發人員] 索引標籤上的其他按鈕還包括 [錄製巨集] 按鈕,可自動產生 VBA 程式碼,重現您在應用程式中執行的動作。[錄製巨集] 是您用來深入了解 VBA 的絕佳工具。讀取產生的程式碼可讓您深入了解 VBA,且您以使用者身分對 Office 2010 的了解,可成功銜接到以程式設計人員身分對 Office 2010 的了解。唯一的警告是產生的程式碼可能令人困惑,因為巨集編輯者必須針對您的目的進行一些假設,而這些假設不見得正確。

錄製巨集

  1. 開啟新的 Excel 2010 活頁簿,然後按一下功能區中的 [開發人員] 索引標籤。按一下 [錄製巨集] 並接受 [錄製巨集] 對話方塊中的所有預設設定,包括以 Macro1 做為巨集的名稱,並以 This Workbook 做為位置。

  2. 按一下 [確定] 開始錄製巨集。請注意按鈕文字如何變更為 [停止錄製]。完成您要錄製的動作之後,請按一下該按鈕。

  3. 按一下儲存格 B1 並輸入程式設計人員的第一個標準字串:Hello World。停止輸入並檢視 [停止錄製] 按鈕;按鈕會變為灰色,因為 Excel 2010 正在等候您於儲存格中完成輸入值。

  4. 按一下儲存格 B2 完成儲存格 B1 中的動作,然後按一下 [停止錄製]。

  5. 在 [開發人員] 索引標籤上,按一下 [巨集],然後選取 Macro1 (如果未選取),再按一下 [編輯] 在 Visual Basic 編輯器中檢視 Macro1 中的程式碼。

圖 2. Visual Basic 編輯器中的巨集程式碼

Visual Basic 編輯器中的巨集程式碼

檢視程式碼

您建立的巨集應該類似下列程式碼。

Sub Macro1()
'
' Macro1 Macro
'
'
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "Hello World"
    Range("B2").Select
End Sub

請注意與稍早在儲存格 A1 中選取文字的程式碼片段之相似及不同之處。在此程式碼中,會選取儲存格 B1,然後將字串 "Hello World" 套用至使用中的儲存格。文字兩旁的引號指定字串值,而不是數值。

還記得您是如何按下儲存格 B2 以顯示 [停止錄製] 按鈕嗎?該動作也會以一行程式碼顯示。巨集錄製會錄製每次按鍵輸入。

編輯者以單引號開頭並以綠色標示的程式碼行是註解,可說明程式碼或提醒您和其他程式設計人員程式碼的用途。VBA 會忽略以單引號開頭的任何行或某行的一部分。在程式碼中撰寫清楚且適當的註解是很重要的主題,但是不在本文討論範圍內。本文中對此程式碼的後續參考資料不包含這四行註解行。

當巨集錄製產生程式碼時,會使用複雜的演算法來判斷您想使用的方法和屬性。如果您不認得任何指定的屬性,有許多資源可以協助您。例如,在您錄製的巨集中,巨集錄製產生參照 ForumulaR1C1 屬性的程式碼,但是您不確定代表什麼意思。

秘訣秘訣

注意:請注意,Application 物件隱含在所有 VBA 巨集中。您錄製的程式碼會在每行開頭使用 Application.。

使用開發人員說明

在已錄製的巨集中選取 ForumulaR1C1,然後按 F1 鍵。說明系統會執行快速搜尋,判斷 Excel 2010 說明的 Excel 2010 開發人員區段是否有適當的主旨,然後列出 FormulaR1C1 屬性。您可以按一下連結深入了解該屬性,但是在這麼做之前,請注意視窗底部附近的 [Excel 物件模型參考資料] 連結。按一下該連結,即可檢視 Excel 2010 在其物件模型中,用來描述 Worksheets 及其元件之冗長的物件清單。按一下任何一個物件,即可檢視套用至該特定物件的屬性和方法,以及不同相關選項的相互參照。許多 [說明] 項目也包含可協助您的簡短程式碼範例。例如,您可以遵循 Borders 物件中的連結,查看如何在 VBA 中設定框線。

Worksheets(1).Range("A1").Borders.LineStyle = xlDouble

編輯程式碼

Borders 程式碼看起來與已錄製的巨集不同。物件模型令人困惑的一點是有多種定址任何指定物件 (在本範例中為儲存格 A1) 的方式。

有時,學習程式設計的最佳作法是稍微變更一些運作正常的程式碼,然後觀察發生的結果。現在就試試看。在 Visual Basic 編輯器中開啟 Macro1,然後將程式碼變更如下。

Sub Macro1()
    Worksheets(1).Range("A1").Value = "Wow!"
    Worksheets(1).Range("A1").Borders.LineStyle = xlDouble
End Sub
秘訣秘訣

盡可能在處理程式碼時使用複製及貼上,以避免輸入錯誤。

您不需要儲存程式碼再測試,因此請返回 Excel 2010 文件,按一下 [開發人員] 索引標籤上的 [巨集],然後依序按一下 Macro1 及 [執行]。儲存格 A1 現在包含文字 Wow!,周圍具有雙線框線。

圖 3. 第一個巨集的結果

第一個巨集的結果

 

您剛剛合併巨集錄製、讀取物件模型文件及簡單的程式設計,讓 VBA 程式執行作業。恭喜您!

無法運作?請繼續閱讀 VBA 的偵錯建議。

程式設計秘訣與技巧

以範例開始

VBA 社群很大;網路上的搜尋幾乎總是可以產生與您要執行的作業類似的 VBA 程式碼範例。如果您找不到好的範例,請嘗試將工作細分為較小的單元,然後再搜尋這些單元;或嘗試考慮更常見、但類似的問題。以範例開始可為您省下許多時間。

這並不表示網路上唾手可得的程式碼總是免費且經過深思熟慮。事實上,您找到的某些程式碼可能含有 Bug 或錯誤。重點是您在線上或 VBA 文件中找到的範例可讓您搶得先機。請記住,學習程式設計需要時間與心力。在您急著使用其他解決方法來解決您的問題之前,請捫心自問 VBA 是否為解決此問題的適當選擇。

簡化問題

程式設計可能一下子就會變得很複雜。您 (特別是初學者) 必須將問題盡可能細分為最小的邏輯單元,再分別隔離撰寫及測試每一部分。如果您眼前有太多程式碼,讓您感到困惑或一團混亂,請停止並將問題擺在一旁。當您再度回到問題時,將問題的一小部分複製到新模組中,解決該部分,讓程式碼可以運作,並進行測試以確保其運作正常。然後再移到下一個部分。

Bug 和偵錯

有兩種主要的程式設計錯誤類型:「語法」錯誤,該錯誤違反程式設計語言的文法規則;以及「執行階段」錯誤,該錯誤在語法上看似正確,但是會在 VBA 嘗試執行程式碼時失敗。

雖然修正這些錯誤可能令人沮喪,但是語法錯誤很容易發現;如果您輸入的程式碼發生語法錯誤,Visual Basic 編輯器會嗶一聲並閃爍。

例如,在 VBA 中,必須以雙引號括住字串值。若想知道當您改用單引號時會發生什麼結果,請返回 Visual Basic 編輯器,並將程式碼範例中的 "Wow!" 字串取代成 'Wow!' (亦即以單引號括住 Wow 一字)。如果您按下一行,Visual Basic 編輯器即會反應。錯誤「編譯錯誤: 預期的: 運算式」不太有用,但是產生錯誤的該行會變成紅色,告訴您該行有語法錯誤,因此無法執行此程式。

按一下 [確定] 並將文字變更回 "Wow!"。

執行階段錯誤比較難發現,因為程式設計語法看似正確,但是程式碼會在 VBA 嘗試執行時失敗。

例如,開啟 Visual Basic 編輯器,並將您巨集中的 Value 屬性名稱變更為 ValueX,這會刻意引進執行階段錯誤,因為 Range 物件沒有稱為 ValueX 的屬性。返回 Excel 2010 文件,開啟 [巨集] 對話方塊並再次執行 Macro1。您應該會看到 Visual Basic 訊息方塊,以下列文字說明執行階段錯誤:「物件不支援此屬性或方法」。該文字已經很清楚,不過您可以按一下 [偵錯] 深入了解。

當您返回 Visual Basic 編輯器時,該編輯器會處於特殊的偵錯模式,使用黃色醒目提示來顯示失敗的程式碼行。如預期般,已醒目提示包含 ValueX 屬性的該行。

圖 4. 執行中的 Visual Basic 偵錯工具

執行中的 Visual Basic 偵錯工具

 

您可以變更執行中的 VBA 程式碼,因此請將 ValueX 變更回 Value,然後按一下 [偵錯] 功能表底下的綠色播放小按鈕。程式應該會再次正常執行。

建議您了解如何更慎重地使用偵錯工具,來偵錯更長且更複雜的程式。您至少必須了解:如何設定中斷點,以在您想檢視程式碼的地方停止執行;如何新增監看式以在程式碼執行時,查看不同變數和屬性的值;以及如何逐步且逐行完成程式碼。這些選項都可以在 [偵錯] 功能表中找到,認真的偵錯工具使用者一般會記住相對應的鍵盤快速鍵。

善用參考資料

若要開啟 Office 2010 [說明] 中內建的 [開發人員參考],請從任何 Office 2010 應用程式開啟 [說明] 參考,方法是按一下功能區中的問號或按 F1 鍵,然後在 [搜尋] 按鈕右側,按一下向下箭號篩選內容。按一下 [開發人員參考]。如果您在左面板中看不到目錄,請按一下書籍小圖示予以開啟,然後從此處展開物件模型參考。

圖 5. 開發人員 [說明] 的篩選會套用至所有 Office 2010 應用程式

篩選開發人員說明

 

瀏覽物件模型參考所花的時間很值得。在您了解 VBA 語法基礎及您使用之 Office 2010 應用程式的物件模型之後,即可從猜測晉升為有條理的程式設計。

當然,Microsoft Office 開發人員中心是文章、秘訣及社群資訊的絕佳入口網站。

搜尋論壇和群組

即使閱讀所有找得到的參考文章,並犧牲睡眠時間思考解決問題的不同方式,所有程式設計人員不免還是會有遇到瓶頸的時候。幸好網際網路培養了開發人員社群,可彼此協助解決程式設計問題。

在網路上搜尋「Office 開發人員論壇」會顯示幾個討論群組。您也可以搜尋「Office 開發」或問題的描述,來探索論壇、部落格文章及其他文章。

如果您已盡力解決問題,不要害怕在開發人員論壇中張貼您的問題。這些論壇歡迎新進程式設計人員的張貼文章,且許多有經驗的開發人員很樂意提供協助。

以下是在開發人員論壇中張貼文章時,需要遵循的幾點不成文規定:

  • 在您張貼文章之前,請先查閱網站的常見問題集是否有成員請您遵循的準則。確定您依照這些準則來張貼內容,並張貼在論壇的適當區段。

  • 包含清楚且完整的程式碼範例,如果是長篇程式碼的一部分,請考慮編輯程式碼,以為其他人釐清。

  • 清楚簡潔地描述問題,並摘要說明您解決問題所採取的任何步驟。花點時間盡量妥善地寫下您的張貼文章,特別是在您很慌張或趕時間時。以讀者第一次閱讀問題內容便可以理解的方式,來呈現問題的情況。

  • 有禮貌並表達您的謝意。

進階程式設計

雖然本文很簡短,只觸及 VBA 及程式設計的表面,但是希望足夠讓您開始著手進行。

本節簡短討論一些更重要的主題。

變數

在本文的簡單範例中,您會操作應用程式已建立的物件。您可能想建立自己的物件來儲存值或其他物件的參照,以暫時在應用程式中使用。這些物件稱為變數。

若要在 VBA 中使用變數,您必須使用 Dim 陳述式告知 VBA 變數代表的物件類型。您可以接著設定其值,然後用來設定其他變數或屬性。

    Dim MyStringVariable As String
    MyStringVariable = "Wow!"
    Worksheets(1).Range("A1").Value = MyStringVariable

分支和迴圈

本文中的簡單程式會從上而下一次執行一行。程式設計的真正能力來自於您可以根據一或多個指定條件,選擇決定執行哪幾行程式碼。當您可以重複某項作業多次時,您可以進一步擴充這些功能。例如,下列程式碼擴充 Macro1。

Sub Macro1()
    If Worksheets(1).Range("A1").Value = "Yes!" Then
        Dim i As Integer
        For i = 2 To 10
            Worksheets(1).Range("A" & i).Value = "OK! " & i
        Next i
    Else
        MsgBox "Put Yes! in cell A1"
    End If
End Sub

在 Visual Basic 編輯器中輸入或貼上程式碼,然後執行程式碼。遵循所顯示之訊息方塊中的指示,然後將儲存格 A1 中的文字從 Wow! 變更為 Yes!,再執行一次檢視迴圈功能。此程式碼片段會示範變數、分支和迴圈。在檢視其執行之後,請仔細閱讀,並嘗試判斷每行執行時的結果。

我的所有 Office 2010 應用程式:範例程式碼

以下是一些可嘗試的指令碼;每個指令碼會解決真實世界的 Office 2010 問題。

在 Outlook 2010 中建立電子郵件

Sub MakeMessage()
    Dim OutlookMessage As Outlook.MailItem
    Set OutlookMessage = Application.CreateItem(olMailItem)
    OutlookMessage.Subject = "Hello World!"
    OutlookMessage.Display
    Set OutlookMessage = Nothing
End Sub

請注意,您有時可能需要在 Outlook 2010 中自動化電子郵件;您也可以使用範本。

刪除 Excel 2010 工作表中的空白列

Sub DeleteEmptyRows()    SelectedRange = Selection.Rows.Count    ActiveCell.Offset(0, 0).Select    For i = 1 To SelectedRange        If ActiveCell.Value = "" Then    
            Selection.EntireRow.Delete        Else            ActiveCell.Offset(1, 0).Select        End If    Next iEnd Sub

請注意,您可以選取一欄儲存格,然後執行此巨集以刪除具有空白儲存格之所選欄中的所有列。

刪除 PowerPoint 2010 中的空白文字方塊

Sub RemoveEmptyTextBoxes()
    Dim SlideObj As Slide
    Dim ShapeObj As Shape
    Dim ShapeIndex As Integer
    For Each SlideObj In ActivePresentation.Slides
        For ShapeIndex = SlideObj.Shapes.Count To 1 Step -1
            Set ShapeObj = SlideObj.Shapes(ShapeIndex)
            If ShapeObj.Type = msoTextBox Then
                If Trim(ShapeObj.TextFrame.TextRange.Text) = "" Then
                    ShapeObj.Delete
                End If
            End If
        Next ShapeIndex
    Next SlideObj
End Sub

請注意,此程式碼會循環檢查所有幻燈片,並刪除沒有任何文字的所有文字方塊。計數變數會遞減而不是遞增,因為每次程式碼刪除一個物件,便會從集合中移除該物件,因而減少計數。

將 Outlook 2010 中的連絡人複製到 Word 2010

Sub CopyCurrentContact()
   Dim OutlookObj As Object
   Dim InspectorObj As Object
   Dim ItemObj As Object
   Set OutlookObj = CreateObject("Outlook.Application")
   Set InspectorObj = OutlookObj.ActiveInspector
   Set ItemObj = InspectorObj.CurrentItem
   Application.ActiveDocument.Range.InsertAfter (ItemObj.FullName & " from " & ItemObj.CompanyName)
End Sub

請注意,此程式碼會將 Outlook 2010 中目前開啟的連絡人複製到開啟的 Word 2010 文件中。只有在 Outlook 中目前有開啟要檢查的連絡人時,才可以執行此程式碼。

摘要

本文介紹 Office 2010 的 Visual Basic for Applications (VBA) 功能,以及 VBA 如何自動化重複的工作。

其他資源

如需詳細資訊,請參閱下列資源: