Office 的 VBA 入門

您是否需要在 Word 中重複清除五十份資料表? 您是否想要在開啟特定文件時提示使用者輸入? 您是否無法找到有效的方式將連絡人從 Microsoft Outlook 匯入 Microsoft Excel 試算表?

您可以使用 Visual Basic for Applications (VBA) for Office 來執行這些工作並完成更多工作,這是一種簡單但功能強大的程式設計語言,可用來擴充 Office 應用程式。

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

Office 應用程式套件擁有豐富的功能。 在文件、電子郵件、資料庫、表單、試算表及簡報的撰寫、格式設定及管理上,提供許多不同的方法。 Office 中強大的 VBA 程式設計功能,可讓您使用 VBA 來執行您透過滑鼠、鍵盤或對話方塊可執行的每項作業。 之外,使用 VBA 執行作業一次後,往後可以照樣輕鬆地執行 100 次。 (事實上,Office 中的 VBA 最常見的用途之一是自動執行重複的工作。)

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

本文會探討運用 VBA 程式設計強大功能的一些主要原因。 文中會探討可與您的解決方案搭配使用的 VBA 語言以及立即可用的工具。 最後,文章中也會提供幾個可避免常見程式設計失敗和錯誤的技巧與方法。

注意事項

對於開發跨多個平台,擴充使用者 Office 體驗的解決方案感到興趣嗎? 請參閱新的 Office 增益集模型。 與 VSTO 增益集和解決方案相比,Office 增益集的佔用空間較小,而且您可以使用幾乎任何網頁程式技術 (例如 HTML5、JavaScript、CSS3 和 XML) 來建立這些增益集。

使用 VBA 的時機與原因

考慮使用 Office 的 VBA 程式設計主要有以下數個原因。

自動化和重複執行

對於設定格式或修正問題這類重複的工作來說,使用 VBA 非常的有效且有效率。 比如說,您曾經需要變更 Word 中每一頁上方的段落樣式? 曾經需要將從 Excel 貼到 Word 文件或 Outlook 電子郵件的多個表格的格式重新設定? 曾經需要針對多位 Outlook 連絡人進行相同的變更?

如果需要進行的變更次數超過十次或二十次,那麼就值得使用 VBA 來自動進行這項變更。 如果需要變更的次數有上百次,就絕對必須考慮使用 VBA。 幾乎所有可手動進行的格式設定動作或編輯變更,都可透過 VBA 完成。

允許使用者互動的擴充功能

有時候,您會想鼓勵或強制使用者,以非標準應用的特定方式與 Office 應用程式或文件互動。 例如,您想在使用者開啟、儲存或列印文件時,提示使用者採取特殊動作。

Office 應用程式之間的整合

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

另闢他法

VBA 程式設計是一個功能強大的解決方案,但不一定總是最佳作法。 有時候,需要使用其他方法來達成您的目的。

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

Office 應用程式的功能相當強大;當中已內建您需要的解決方案。 進行程式設計前,請先花些時間深入了解 Office。

開始使用 VBA 專案前,請先確定您有充裕的時間可使用 VBA。 進行程式設計時必須專心投入,且過程可能無法預測。 特別是初學者,除非您有充裕的時間能細心工作,否則不要輕易開始進行程式設計。 在時間緊迫的情況下,要寫出解決問題的「快速指令碼」,會讓自己陷於極度緊張的壓力中。 如果您時間很趕,可能會想使用傳統方法,雖然這些方法既死板,重複性又高。

VBA 程式設計 101

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

您可能會認為撰寫程式碼是一項神秘又困難的工作,但其基本的原則運用到的是日常隨手可及的原理。 Microsoft Office 應用程式的建立方式是稱之為物件的東西,這些物件可以接收指示,與電話設計有按鈕讓您與電話互動的方式大致相同。 當您按下按鈕時,電話就會辨識指示,並且以您撥號的順序包含對應的數字。 在程式設計中,您與應用程式互動的方式是將指示傳送至應用程式中的各種物件。 這些物件相當廣泛,但還是有其限制。 它們只能按照設計的目的執行工作,並依照您的指示行事。

例如,試想使用者在 Word 中開啟一份文件、進行一些變更、儲存文件然後關閉應用程式。 在 VBA 程式設計概念裡,Word 會顯示為 Document 物件。 透過使用 VBA 程式碼,您可指示 Document 物件進行類似 Open、Save 或 Close 動作。

下一節將討論組織及描述物件的方式。

物件模型

開發人員會在階層中組織程式設計物件,該階層稱為應用程式的物件模型。 以 Word 為例,它有包含文件物件的最上層應用程式物件。 文件物件包含段落物件,依此類推。 物件模型大致上會鏡像處理您在使用者介面中看到的內容。 它們是應用程式及其功能的概念性對應。

物件的定義稱為類別,所以您可能會看到這兩個詞彙交互應用。 技術上而言,類別是用來建立或具現化物件的描述或範本。

物件存在後,您可以藉由設定物件屬性和呼叫物件方法,來操作此物件。 如果您把物件想成是名詞,屬性就是描述名詞的形容詞,方法是賦予名詞動作的動詞。 變更屬性即會變更物件外觀或行為的某些品質。 呼叫其中一個物件方法則可讓物件執行某些動作。

本文章中的 VBA 程式碼會在一個開啟的 Office 應用程式中執行,而該程式碼所操控的許多物件皆已正常運作中;例如 Application 本身、Excel 中的工作表、Word 中的文件、PowerPoint 中的簡報、Outlook 中的 Explorer 和 Folder 物件。 在您瞭解物件模型的基本配置,以及可存取其目前狀態的一些重要應用程式屬性後,就可以開始使用 Office 中的 VBA 來擴充和管理該 Office 應用程式。

方法

舉例來說,您可以使用 Application 物件的 ActiveDocument 屬性變更目前 Word 文件中的屬性,並在其中叫用方法。 這個 ActiveDocument 屬性會傳回 Document 物件的參考,該物件目前在 Word 應用程式中為使用中。 「傳回參考」意思是「讓您存取」。

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

Application.ActiveDocument.Save

從左至右讀取程式碼:「在此應用程式中,使用 ActiveDocument 參考的檔,叫用 Save 方法。」請注意, Save 是最簡單的方法形式;它不需要您提供任何詳細的指示。 指示 Document 物件進行 Save 後,您就不需要進行任何其他輸入。

如果方法需要更多資訊,這些詳細資料稱為參數。 下列程式碼會執行 SaveAs 方法,它需要檔案的新名稱。

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

方法名稱後面括號中所列出的值就是參數。 在這裡,檔案的新名稱是 SaveAs 方法的參數。

屬性

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

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

使用 VBA 程式設計的第一個挑戰是認識每個 Office 應用程式的物件模型,然後讀懂物件、方法和屬性語法。 所有 Office 應用程式內的物件模型都類似,但每個物件模型又專屬於該文件類型與其操控之物件。

在程式碼片段第一行上寫有 Application 物件,這次是指 Excel,後面接 ActiveSheet,表示提供使用中工作表的存取權。 在該字詞不熟悉之後,Range 即表示「以這種方式定義儲存格範圍」。程式碼會指示 Range 只使用 A1 作為其定義的儲存格集合來建立本身。 也就是說,程式碼的第一行可定義物件、Range,並且針對物件執行方法以選取物件。 結果會自動儲存在 Application 的另一個屬性中,該屬性稱為 Selection

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

您撰寫的最簡單 VBA 程式碼可能會存取您正在使用的 Office 應用程式物件並設定屬性。 例如,您可以在 Word 中存取表格的資料列,並在 VBA 指令碼中變更其格式。

聽起來雖然簡單,卻非常有用。只要您可以寫出程式碼,就能運用程式設計的強大功能在數個表格或文件中進行相同的變更,或根據某些邏輯或條件進行變更。 對電腦來說,變更 1000 次跟變更 10 次是一樣的,因此在大型的文件或大量問題上,使用電腦可帶來經濟效益,這也就是 VBA 能真正發揮功用並為您節省時間的地方。

巨集與 Visual Basic 編輯器

現在您已初步了解 Office 應用程式如何公開其物件模型,您可能會亟欲嘗試呼叫物件方法、設定物件屬性和回應物件事件。 若要這麼做,您必須以 Office 能了解的方法撰寫完善的程式碼。通常來說,會使用 Visual Basic 編輯器。 雖然 Visual Basic 編輯器通常已預設安裝,但許多使用者卻不知道,直到在功能區上啟用它。

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

若要啟用 [開發人員] 索引標籤

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

  2. 選擇對話方塊左側的 [自訂功能區]

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

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

  5. 選擇 [確定]

注意事項

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

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

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

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

安全性問題

為了保護 Office 使用者免受病毒與危險的巨集程式碼影響,您無法將巨集程式碼儲存為使用標準副檔名的標準 Office 文件。 您必須將程式碼儲存為使用特殊副檔名的檔案。 例如,您無法將巨集儲存為使用 .docx 副檔名的標準 Word 文件。您必須將其儲存為使用特殊 .docm 副檔名的啟用巨集的 Word 文件。

當您開啟 .docm 檔案時,Office 安全性可能會在告知或不告知您的前提下,防止執行文件中的巨集。 請檢查所有 Office 應用程式中「信任中心」的設定和選項。 預設設定為停用巨集執行,但會警告您該巨集已停用,並提供選項讓您在該文件中再將其開啟。

您可以透過建立信任位置、信任的文件或受信任的發行者,指定能夠在其中執行巨集的特定資料夾。 大部分可攜式選項是使用受信任的發行者,其適用於您發佈的數位簽章文件。 如需特定 Office 應用程式中安全性設定的詳細資訊,請開啟 [選項] 對話方塊,選擇 [信任中心],然後再選擇 [信任中心設定]

注意事項

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

錄製巨集

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

Word 和 Excel 中 [開發人員] 索引標籤上的另一個按鈕是 [錄製巨集] 按鈕,它會自動產生 VBA 程式碼,以重現您在應用程式中執行的動作。 [錄製巨集] 是一個非常實用的工具,可讓您深入了解 VBA。 讀取產生的程式碼可以讓您洞悉 VBA,並且在您身為使用者對於 Office 的知識,與身為程式設計人員的知識之間提供穩定的橋樑。 唯一要注意的是產生的程式碼可能令人混淆,因為巨集編輯器必須對您的目的做假設,而這些假設不一定準確。

若要錄製巨集

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

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

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

  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 會忽略任何以單引號開頭的程式碼行或部分。 在您的程式碼中撰寫清楚、正確的註解是很一個重要的主題,但這項討論已超出本文章的涵蓋範圍。 此文章中對此程式碼的後續參考不會包括這四個註解行。

當巨集錄製器產生程式碼時,它會使用複雜的演算法來決定您想要的方法和屬性。 如果您無法辨識給定的屬性,還有許多資源可以協助您。 例如,在您所錄製的巨集中,巨集錄製器會產生參考 FormulaR1C1 屬性的程式碼。 不確定這是什麼意思嗎?

注意事項

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

使用開發人員說明

在錄製的巨集中選取 FormulaR1C1,然後按 F1 鍵。 [說明] 系統會執行快速搜尋,決定適當的主題是在 [Excel 說明] 的 [Excel 開發人員] 區段中,並且列出 FormulaR1C1 屬性。 您可以選擇連結以深入了解屬性,但是在那之前,請注意視窗底部附近的 [Excel 物件模型參考] 連結。 選擇連結以檢視物件的詳細清單,Excel 會在其物件模型中用來描述工作表及其元件。

選擇任何一項以查看適用該特定物件的屬性和方法,以及不同相關選項的交互參考。 許多 [說明] 項目也附有簡短的程式碼範例,可提供您協助。 例如,您可以遵循 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 文件,選擇 [開發人員] 索引標籤上的 [巨集],然後依序選擇 [Macro1][執行]。 儲存格 A1 現在含有文字 Wow!, 周圍具有雙線框線。

圖 3: 第一個巨集的結果

第一個巨集的結果

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

不成功嗎? 請繼續閱讀 VBA 的偵錯建議。

程式設計秘訣與技巧

以範例開始

VBA 社群十分廣大。只要搜尋網路幾乎都可以找到與您想執行的動作相似的 VBA 程式碼範例。 如果找不到適合的範例,請嘗試將工作劃分成較小的單元,然後搜尋各個單元,或者想一個類似的常見問題。 使用範例來開始,可讓您節省數小時的時間。

但這不表示,網路上有免費且構思完備的程式碼等著您取用。 事實上,您找到的某些程式碼可能帶有錯誤。 在網路或 VBA 文件上找到的範例能為您提供一個好的開始。 請記得,學習程式設計需要花時間、花腦力。 在您急著採用另一個解決方案來解決問題前,請先問自己 VBA 是否是解決這個問題的最佳選擇。

簡化問題

程式設計概念很快就會變得複雜。 請務必將問題劃分為儘可能最小的邏輯單位,然後獨立撰寫和測試每個小部分,尤其對初學者而言非常重要。 如果程式碼太多讓您感到困惑或迷失,請先停止,並將問題放在一旁。 在您重新檢視問題時,將問題的一小部分複製到新模型、解決這個問題,讓程式碼成功運作,並進行測試來確保運作順利。 然後再跳到下一個部分。

錯誤和偵錯

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

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

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

選擇 [確定] 並將文字變更回 "Wow!"。

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

例如,開啟 Visual Basic 編輯器,並將您巨集中的 Value 屬性名稱變更為 ValueX,這會刻意引進執行階段錯誤,因為 Range 物件沒有稱為 ValueX 的屬性。 返回 Excel 文件、開啟 [巨集] 對話方塊,並再次執行 Macro1。 您應該會看到 Visual Basic 訊息方塊,其中說明執行階段錯誤的文字:「物件不支援方法的這個屬性」。雖然該文字是清楚的,但請選擇 [ 偵錯 ] 以深入瞭解。

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

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

最好能夠了解如何針對更長、更複雜的程式,更刻意地使用偵錯工具。 至少了解如何設定中斷點,在您想要查看程式碼的那一點停止執行;如何加入監看以查看當程式碼執行時不同變數和屬性的值,以及如何一行一行逐步執行程式碼。 這些選項都可以在 [偵錯] 功能表取得,認真的偵錯工具使用者通常會記下相應的鍵盤快速鍵。

善用參考資料

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

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

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

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

當然,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 應用程式:範例程式碼

以下是一些可嘗試的指令碼;每個指令碼都可真實的 Office 問題。

在 Outlook 中建立電子郵件

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

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

刪除 Excel 工作表中的空白列

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 i
End Sub

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

刪除 PowerPoint 中的空白文字方塊

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 中的連絡人複製到 Word

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 連絡人複製到開啟的 Word 文件。 Outlook 中目前正開啟連絡人進行檢查時,這個程式碼才有效。

支援和意見反應

有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應